10.ARM汇编的学习
10.ARM汇编的学习
ARM汇编的学习是很必要,学习ARM汇编不是要以后用汇编去写程序,而是要去看得懂,且进行修改就可以了。因为在后面的有关内核和bootloader的工程里,会有部分的代码是汇编程序编写的。在bootloader中,系统一旦上电,第一个运行的程序,需要对cpu、协处理器进行初始化,此时还没有C语言运行的环境,因为没有堆栈等条件。在内核里也是同样的道理。之所以要使用汇编,是因为它公认的高效性,在系统刚上电,或者在一个程序里需要高效的程序语言的时候,就会考虑用汇编来实现。就像C语言,它可以嵌入汇编代码,来提高运行效率。
总结:两个会使用汇编的地方
-
启动代码。
-
效率要求高的地方。
ARM汇编分类:
目前常用的ARM汇编指令有两种:
-
ARM标准汇编:适用于ARM公司的汇编器,适合在Windows平台使用,如ADS平台中使用。
-
GNU汇编:适用于GNU交叉编译工具链中的汇编器,适合于Linux开发平台。
其实呢ARM标准汇编和GNU汇编,这两种汇编代码的语法都差不多,只是GNU汇编的代码是小写的,ARM标准汇编是大写的。还有一些细微的差别而已。
GNU汇编代码基本框架:图1-1:
.section .data
<初始化的数据>
.section .bss
<未初始化的数据>
.section .text //.text表明下面是代码段
.globl _start
_start: //ARM汇编的入口,需要用.global声明为全局的,外面的文件才能使用该标示
<汇编代码>
图1-1
如果工程中没有初始化的数据,也没有未初始化的数据,在实际编写的时候,把.text前的.section也省略了。最后的汇编的程序框架如下图:1-2:
.text
.global _start
_start:
<汇编代码>
图1-2
建立基本的汇编程序框架:
首先是编写start.S的代码:图1-3:
.text
.global _start
_start:
mov r1,#11
mov r2,#22
mov r3,#33
图1-3
上面已经编写好了汇编程序代码start.S,接下来就是编写它的Makefile,只是这一次的Makefile工程里,因为只有一个start.S汇编文件,就不使用lds链接文件了,免得大材小用的工具,直接链接地址。指定直接链接地址的格式:-Ttext 地址。最后的Makefile的代码:Makefile:图1-4:
all: start.o
arm-linux-ld -Ttext 0x50008000 -o gboot.elf $^
%.o : %.S
arm-linux-gcc -g -o $@ $^ -c
.PHONY: clean
clean:
rm *.o *.elf
图1-4
整个简单的过程就两个文件:图1-5:
图1-5
接下来就是按照前面的,来导入eclipse,配置调试环境,启动调试。
这里链接的过程就不详细了。有疑问的可以参考第五节:Eclipse集成开发环境。链接好了之后,成功进行了裸机调试,进入刚才编写的汇编代码:图1-5:
图1-5
按一下F6,单步调试,可以看到运行到了第二条汇编代码。图1-6:
图1-6
运行了之后,可以看到r1的值被赋值为了11。图1-7:
图1-7
接着按F6,执行下一条汇编指令。图1-8:
图1-8
可以看到上面,裸机代码正常运行了。