10.ARM汇编的学习

10.ARM汇编的学习

ARM汇编的学习是很必要,学习ARM汇编不是要以后用汇编去写程序,而是要去看得懂,且进行修改就可以了。因为在后面的有关内核和bootloader的工程里,会有部分的代码是汇编程序编写的。在bootloader中,系统一旦上电,第一个运行的程序,需要对cpu、协处理器进行初始化,此时还没有C语言运行的环境,因为没有堆栈等条件。在内核里也是同样的道理。之所以要使用汇编,是因为它公认的高效性,在系统刚上电,或者在一个程序里需要高效的程序语言的时候,就会考虑用汇编来实现。就像C语言,它可以嵌入汇编代码,来提高运行效率。

    总结:两个会使用汇编的地方

  1. 启动代码。
  2. 效率要求高的地方。

ARM汇编分类:

目前常用的ARM汇编指令有两种:

  1. ARM标准汇编:适用于ARM公司的汇编器,适合在Windows平台使用,如ADS平台中使用。
  2. 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

可以看到上面,裸机代码正常运行了。

 

posted @ 2016-02-14 09:52  cestlavie  阅读(1389)  评论(0编辑  收藏  举报