9.“.equ”
.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间,相当于c语言中的#define。例如
.equ aaa,0x20000000
10.“.macro .endm”
.macro: 定义一段宏代码,.macro表示代码的开始,.endm表示代码的结束,.exitm跳出宏, 示例如下:
.macro SHIFTLEFT a, b.if \b < 0
mov \a, \a, ASR #-\b
.exitm
.endif
mov \a, \a, LSL #\b
.endm
11.“.req”
name .req register name: 为寄存器定义一个别名
12.“.code”
.code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令
13.“.ltorg”
.ltorg: 表示当前往下的定义在归于当前段,并为之分配空间
二.带下滑线的
1._start
汇编程序的缺省入口,但是可以更改,想要更改其他标志,到相应的链接脚本中去用ENTRY指明其他入口标志。标号可以直接认为是地址。
三.不带点的
1.mov–数据传送指令
它的传送指令只能是把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量,比如
mov r1,r2
mov r1,#4096
这个立即数是小于0xff(65535)的数,如果大于65535,则用ldr指令赋值
2.b、bl–相对跳转指令
b只是跳转,而bl除跳转外还将返回地址(bl的下一条指令的地址)保存到lr寄存器中。其中跳转范围是当前指令的前后32M。
3.ldr、str–内存访问指令
ldr指令即可能是大范围的地址读取伪指令,也可能是内存访问指令,当它的第二个参数之前有“=”时,表示伪指令,否则是内存访问指令,比如
ldr r0, =0x53000000//r0=0x53000000
str r1, [r2, #4] // 将r1的数据保存到地址为r2+4的内存单元中
str r1, [r2] // 将r1的数据保存到地址为r2的内存单元中
str r1, [r2], #4 // 将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4
ldr r1, [r2,#4] // 将地址为r2+4的内存单元数据读取到r1中
ldr r1, [r2] // 将地址为r2的内存单元数据读取到r1中