这几天看汇编,ldr和adr之间的区别老是给搞混,看了很多资料越看越晕,于是写了个测试程序反编译了一下一下子都清楚了,见下面:

源码:

  adr r0, _start
   nop
   ldr r0, _start
   nop
   ldr r0, =_start
   nop

_start:
   nop
   mov ip, lr

反汇编之后的:

8068: e28f0010 add r0, pc, #16
806c: e1a00000 nop ; (mov r0, r0)
8070: e59f0008 ldr r0, [pc, #8] ; 8080 <_start>
8074: e1a00000 nop ; (mov r0, r0)
8078: e59f0008 ldr r0, [pc, #8] ; 8088 <_start+0x8>
807c: e1a00000 nop ; (mov r0, r0)

00008080 <_start>:
8080: e1a00000 nop ; (mov r0, r0)
8084: e1a0c00e mov ip, lr
8088: 00008080 .word 0x00008080

通过反汇编之后的代码很容易就理解了:

adr r0, _start;相对取址,r0中保存的是pc+16的地址:8088,这个是随着不同的链接而变;ps:这个是pc指针;

ldr r0,_start和ldr r0,=_start;都是取值,前者取得start标号00008080处的值:e1a00000,相当于把这条指令给放进去了,执行下一条指令, (注释:e1a00000是反汇编之后的机器读取的指令),后者取得start标号本身的值:00008080,它存储在8088地址地方;

因为adr r0, _start;r0中存在的是pc+16的pc指针地址,所以会随着pc不同而变化,故称之为相对取址;

ldr r0,_start和ldr r0,=_start;r0中存在的都是[pc+8]的值,不会改变,故称之为绝对取值;

转载于:https://www.cnblogs.com/snail-micheal/p/4462730.html

ldr和adr的区别相关推荐

  1. ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析

    ARM汇编有ldr指令以及ldr.adr伪指令,它们都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别. ldr r0, _start adr r0, _start ...

  2. arm汇编指令:ldr和adr的区别

    在分析uboot源码时,遇到adr.ldr指令,却分不清这2者的区别,网上很多解释含糊不清,现对adr与ldr指令做解释. 首先给出一段汇编代码: ldr r0, _startadr r0, _sta ...

  3. ARM LDR和ADR指令

    讲的比较好的一篇帖子,ADR和LDR区别的比较清除: LDR和ADR的区别 Load/Store指令 ARM属于RISC指令集,CPU无法对内存的数据进行直接操作,只能通过Load/Store指令来实 ...

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

    ARM汇编语言中有ldr指令和ldr.adr伪指令,他们都可以将标号表达式作为操作数.区别如下: ldr指令和adr.ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值 ...

  5. ARM指令 LDR 和 ADR的一些区别

    LDR 是ARM中的指令,也是伪指令. 当用 LDR r, =imd  // r 为寄存器, imd为立即数 LDR 是一条伪指令.编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn ...

  6. ldr和adr在使用标号表达式作为操作数的区别

    ARM汇编有ldr指令以及ldr.adr伪指令,他门都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别.  ldr     r0, _start adr     r ...

  7. ARM汇编:加载和存储指令集(六大类)---LDR(ADR)、LDRB、LDRH、STR、STRB、STRH

    ARM的六大类指令集---LDR.LDRB.LDRH.STR.STRB.STRH ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则 ...

  8. ARM LDR与MOV的区别

    KG-MOV指令.LDR指令.LDR伪指令之间的区别 MOV指令.LDR指令.LDR伪指令之间的区别 作为一个扩展(KG),感觉这个东西还是有必要说说的~~ 在我编译一个工程的时候,用MOV指令编译有 ...

  9. LDR 和MOV 指令区别

    LDR 和MOV 指令区别 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ld ...

最新文章

  1. 数学建模 概率论与数理统计
  2. 三十分钟理解:双调排序Bitonic Sort,适合并行计算的排序算法
  3. 小程序使用wxParse解析html
  4. android 如何监听应用前后台切换
  5. LeetCode 257. 二叉树的所有路径(DFS)
  6. 1090 Highest Price in Supply Chain (25 分)
  7. 为啥加班多太多对身体会造成影响,不干活就不会对身体造成影响么?
  8. jQuery对象与DOM对象之间的转换方法
  9. activiti 定时任务和线程池
  10. JavaScript中B继承A的方法
  11. POST的Response数据问题
  12. jQuery匹配各种条件的选择器用法
  13. time模块时间格式转换及faker库数据伪造
  14. 关于window10修改默认浏览器闪退的情况
  15. java forward方法_JAVA的服务重定向:使用forward()方法转发请求和使用sendRedirect()方法重定向的区别...
  16. java net包 网关_Net分布式系统之六:微服务之API网关
  17. localtime 和 localtime_r
  18. 开发手机APP做UI设计,这5个UI错误会置你的APP于死地!
  19. php 井字棋,Unity3D 井字棋
  20. struts2升级到2.5.30总结

热门文章

  1. windows配置本地端口映射到其它电脑
  2. linux定时重启命令
  3. 关于UploadValues ,太可恶了
  4. vscode开发环境
  5. vue2.0-基于elementui换肤[自定义主题]
  6. 从iOS的图片圆角想到渲染
  7. 一小时写给同组的如何使用工具检测代码质量
  8. 查看linux cpu和内存利用率__linux top命令
  9. sqlserver 时间递增循环
  10. 迁移Exchange Server 2003