ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令。ARM伪指令包含ADR、ADRL、MOV32和LDR。
一、ADR伪指令
1、作用
ADR是小范围地址读取伪指令,基于PC相对偏移地址或基于寄存器相对偏移地址读取到寄存器中,当地址值是字节对齐时,取值范围为-255到255,当地址值是字对齐时,取值范围-1020到1020
2、语法格式
ADR{<condition>}{.W} register,label
3、参数说明
3.1、.W:可选项,指定指令宽度
3.2、register:目标寄存器
3.3、label:基于PC或具有寄存器的表达式
二、ADRL伪指令
1、作用
ADRL是中等范围地址读取伪指令,基于PC相对偏移的地址或基于寄存器相对偏移的地址值读取到寄存器中,当地址值是字节对齐时,取值范围为-64KB到64KB,当地址值是字对齐时,取值范围为-256KB到256KB。
2、语法格式
ADRL{<condition>} register,label
3、参数说明
3.1、register:目标寄存器
3.2、label:基于PC或具体寄存器的表达式
4、与ADR的区别
ADRL伪指令比ADR伪指令可以读取更大范围的地址,这是因为在编译阶段,ADRL伪指令被编译器换成两条指令。如果汇编器不能再两条指令内完成操作,将报告错误,终止编译。
三、LDR伪指令
1、作用
装载一个32位常数和一个地址到寄存器
2、语法格式
LDR{<condition>}{.W} register,=[expr|label-expr]
3、参数说明
3.1、.W:指定指令宽度
3.2、register:目标寄存器
3.3、expr:32位常量表达式,汇编器根据expr的取值情况,对LDR伪指令做如下处理:
3.3.1、当expr表示的地址值没有超过MOV或MVN指令的地址取值范围时,汇编器用一对MOV和MVN指令代替LDR指令。
3.3.2、当expr表示的指令地址超过了MOV或MVN指令的地址范围时,汇编器将常量放在数据缓存池,同时用一条基于PC的LDR指令读取该常量。
3.4、label-expr:一个程序相关或声明为外部的表达式
4、举例
将常数0xff0读到r1中
LDR r3,=0xff0,相当于:MOV r3,#0xff0(注:由于带立即数的指令会因为ARM32位等宽造成指令限制,导致有些情况下用伪指令代替操作立即数的指令,如:MOV r3,0x123,此时会报错“invalid constant (123) after fixup”)
四、NOP伪指令
1、作用
执行一条空操作,多用于延时,该指令一般被替换成如:mov r0,r0这样一条指令
2、语法格式
NOP