ARM中的ldr指令与adr、ldr伪指令之间的区别

 ARM汇编语言中有ldr指令和ldradr伪指令,他们都可以将标号表达式作为操作数。区别如下:

ldr指令和adrldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值;adrldr伪指令用于获取标号的地址。

adrldr伪指令的区别:adr是获取相对PC的地址,与程序当前运行的位置相关,是小范围的地址读取伪指令;ldr是获取绝对地址,绝对地址是在link的时候确定的,它与程序当前运行位置无关,是大范围读取地址伪指令。

下面通过分析一段代码以及对应的反汇编接过来说明他们的区别。

       ldr r0,_start

       adr r0,_start

       ldr r0,=_start

_start:

       b _start

       编译的时候设置r00x30000000,下面是反汇编的结果:

0x00000000:e59f0004   ldr r0,[pc,#4]    ;0xc

0x00000004:e28f0000   add r0,pc,#0     ;0x0

0x00000008:e59f0000   ldr r0,[pc,#0]    ;0x10

0x0000000c:eafffffe     b  0xc

0x00000010:3000000c   andcc r0,r0,ip

       1.ldr r0,_start

       这是一条指令,从内存地址_start的位置装载该地址存放的数据。

       在这里_start是一个标号(是一个相对程序的表达式),汇编程序计算相对于PC的偏移量,并生成相对于PC的前索引的指令:ldr r0,[pc,#4]。指令执行后,r0=0xeafffffe(计算方法:r0 = [pc(0x00000000+8)+4]= [0x0000000c] = 0xeafffffe)。

       ldr r0,_start是根据_start对当前PC的相对位置读取其所在地址的值,因此可以在和_start标号的相对位置不变的情况下获取数据值。

       2.adr r0,_start

       这是一条伪指令,总是会被汇编程序会变为一个指令,汇编程序尝试产生单个ADDSUB指令来装载该地址。如果不能在一个指令中构造该地址,则生成一个错误,并且汇编失败。

       这里是取得标号_start的地址到r0,因为地址是相对程序的,因此adr的产生依赖于位置的代码,在此例中被汇编成:add r0,pc,#0。因此该代码可以在和标号相对位置不变的情况下移动。

       假如这段代码在0x30000000运行,那么adr r0,_start得到r0 = 0x3000000c;如果在地址0运行,那么就是0x0000000c了。

       通过这一点可以判断程序在什么地方运行。U-Boot中那段relocate代码就是通过adr实现当前程序是在RAM中还是FLASH中。

       3.ldr r0,=_start

       这是一条伪指令,_start是一个绝对地址(也即运行地址)。这个绝对地址是在链接的时候确定的,它占用232bit的空间,一条是指令,另一条是文字池中存放_start的绝对地址。在此例中生成的指令为:ldr r0,[pc,#0],对应文字池中的地址以及值为:0x00000010:3000000c,因此该伪指令执行后r0的值为0x3000000c。因此可以看出,不管这段代码将来在什么地方运行,它的结果都是r0=0x3000000c

       由于ldr r0,=_start取得的是_start的绝对地址,这句代码可以在_start标号的绝对位置不变的情况下移动,如使用寄存器pc在程序中可以实现绝对转移。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值