ARM学习笔记9——ARM汇编汇编语言中的伪指令

时间:2022-06-13 01:18:21

  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