(一)GNU汇编书写格式
注释符:@和#
语句分离符: ;
立即数前缀: #或$
段内标号的地址值在汇编时确定
段外标号的地址值在连接时确定
局部标号:主要在局部范围内使用而且局部标号可以重复出现。它由两部分组成,开头是一个直接的数字局部标号,如99,后面加 ‘ : ’,如 66:
在跳转时,根据所加后缀不一样,跳转方向不一样。
1. f代码地址增加的方向
b代码地址减少的方向
例:b
99f
2. 就近原则
.代表当前行。 例:b . 相当于 while(1)
(二)ARM伪指令
ADR
为小范围的地址读取伪指令
ADRL
为中等范围的地址读取伪指令
‹LDR
为大范围的地址读取伪指令.
‹NOP 为空操作伪指令
注:ldr伪指令的实质
:
LDR Rd,=const
- const如果是有效数,会翻译成MOV ,mvn
- 如果const不是一个有效数,是把要放进寄存器的立即数存储到一个内存地址中,然后将ldr伪指令翻译成一条ldr指令,然后从该地址中读取这个立即数
adr和adrl伪指令的实质:是将基于PC的相对偏移地址值存放到寄存器中
ldr r0,=myarry @ 取标号所在的地址 绝对地址装载l;
反汇编:ldr r0, [pc, #64] @pc+64地址里存放的时标号的地址
ldr r1,=0x666666
反汇编:ldr r1,[pc, #56] @pc+56地址里存放0x666666
ldr r0,myarry @ 取标号所在地址的里面的值;注:这个不是伪指令
反汇编:ldr r0,[pc, #4] @pc+4就是标号的地址,然后从标号的地址里取值
adr r0,myarry @ 取标号所在的地址 相对pc的偏移量
反汇编:add r0,pc,#6 @pc+6就是标号所在的地址
adrl r0,myarry @ 取标号所在的地址 相对pc的偏移量
反汇编:add r0,pc, #8 @pc+6就是标号所在的地址
(三)GNU编译环境下的伪操作和宏指令
1、常量编译控制伪操作 :
.byte