adr,adrl和ldr指令的用法比较

ADR
    这是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。

    使用的格式:ADR register,exper。

    在编译源程序时,汇编器首先计算出当前PC到exper的偏移值#offset_to_exper,然后会用一条ADD或者SUB指令来替换这条伪指令,例如:ADD register,PC,#offset_to_exper。

    注意,标号exper与指令必须在同一代码段。
ADRL:
    这是一条中等范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。

    使用的格式:ADRL register,exper。

    在编译源程序时,汇编器会用两条合适的指令来替换这条伪指令。

    例如:

             ADD register,PC,offset1

             ADD register,register,offset2  

    与ADR相比,它能读取更大范围的地址。

    注意,标号exper与指令必须在同一代码段。
LDR:
   第一种情况:

        当LDR用做ARM指令时,它将基于PC的相对偏移地址处存储的值读到目标寄存器中。

        应用格式:LDR register,[expr]
   第二种情况:

         当LDR用做ARM伪指令时,它用于大范围的地址读取。

         其实说它用于大范围的读取,还不如说它用于大范围的地址赋值。我们来看一下这条伪指令的应用格式:LDR register,=expr/label_expr ,显然,我们可以直观的看出,指令的目的就是要将expr或label_expr赋值(=)给register.所以在编译时,当expr或label_expr的值没有超出MOV和MVN的范围时,采用MOV或MVN指令来代替这条伪指令就显得理所当然了。当expr或label_expr的值超出MOV和MVN的范围时,汇编器将expr或label_expr放入文字池中,并使用一条程序相对偏移指令LDR从文字池读出常量。例如:LDR register,[PC,#offset to literal pool]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值