arm汇编的程序结构-20130113
1、 汇编语言的程序格式
在ARM汇编语言程序中以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称,分为代码段和数据段。
可执行文件通常由以下几个部分构成:(1)、一个或多个代码段,代码段的属性是只读;(2)、零个或多个数据段,数据段的属性为可读写。
2、 汇编语言子程序调用(基本结构如下):
AREA Init,CODE,READONLY
ENTRY
Start
LDR R0,=0x3FF50000
LDR R1,0XFF
STR R1,[R0]
…
PRINT_TEXT
…
MOV PC,BL
…
END
3、 过程调用标准AAPCS
AAPCS(Procedure Call Standard for the ARM Architecture),即ARM体系结构过程调用标准,它规定子程序的调用规则。ARM寄存器使用规则如下:
a) 子程序间通过寄存器R0-R3来传递参数。如果参数多于4个,则多出的部分用堆栈传递。被调用的子程序在返回前无需恢复寄存器R0-R3的内容。(如果主程序中R0-R3的数据在子程序返回后有用到,则在子程序调用前要保存)
b) 在子程序中,使用R4-R11来保存局部变量。如果子程序中使用到了R4-R11中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4-R7来保存局部变量。
c) 寄存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器栈),记作ip。在子程序间的链接代码段中常有这种使用规则。
d) 寄存器R13用作数据栈指针,记作sp,不能用于其它用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。
e) 寄存器R14称为链接寄存器,记作lr。用于保存子程序的返回地址。如果在子程序中保存了返回地址(如利用堆栈),则R14可以用于其它用途。
f) 寄存器R15是程序计数器,记作pc。不能用作其它用途。
g) ARM
4、 Scatter文件,可以指定相关的地址映射关系。编写方法如下:
LOAD_ROM 0x0000 0x4000 // 定义加载地址,0x0000是开始地址,0x4000是空间长度 { EXEC_ROM 0x0000 0x4000 // 定义属性为RO域的运行地址,0x0000是开始地址,0x4000是空间长度 { *(+R0) // 域名 } RAM 0x10000 0x8000 // 定义属性为RW、ZI域的运行地址,0x0000是开始地址,0x4000是空间长度 { *(+RW,+ZI) } }
参考文件:针对用仿真器调试时使用的RuninRAM.sct和针对程序下载到Flash运行的RuninFlash.sct
5、 堆栈的使用
6、 程序举例:
a) 著名的Euclid最大公约数算法(分支语句)
b) 块复制(LDM和STM指令)