ldr和adr的区别
这几天看汇编,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的区别相关推荐
- ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析
ARM汇编有ldr指令以及ldr.adr伪指令,它们都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别. ldr r0, _start adr r0, _start ...
- arm汇编指令:ldr和adr的区别
在分析uboot源码时,遇到adr.ldr指令,却分不清这2者的区别,网上很多解释含糊不清,现对adr与ldr指令做解释. 首先给出一段汇编代码: ldr r0, _startadr r0, _sta ...
- ARM LDR和ADR指令
讲的比较好的一篇帖子,ADR和LDR区别的比较清除: LDR和ADR的区别 Load/Store指令 ARM属于RISC指令集,CPU无法对内存的数据进行直接操作,只能通过Load/Store指令来实 ...
- ARM中的ldr指令与adr、ldr伪指令之间的区别
ARM汇编语言中有ldr指令和ldr.adr伪指令,他们都可以将标号表达式作为操作数.区别如下: ldr指令和adr.ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值 ...
- ARM指令 LDR 和 ADR的一些区别
LDR 是ARM中的指令,也是伪指令. 当用 LDR r, =imd // r 为寄存器, imd为立即数 LDR 是一条伪指令.编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn ...
- ldr和adr在使用标号表达式作为操作数的区别
ARM汇编有ldr指令以及ldr.adr伪指令,他门都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别. ldr r0, _start adr r ...
- ARM汇编:加载和存储指令集(六大类)---LDR(ADR)、LDRB、LDRH、STR、STRB、STRH
ARM的六大类指令集---LDR.LDRB.LDRH.STR.STRB.STRH ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则 ...
- ARM LDR与MOV的区别
KG-MOV指令.LDR指令.LDR伪指令之间的区别 MOV指令.LDR指令.LDR伪指令之间的区别 作为一个扩展(KG),感觉这个东西还是有必要说说的~~ 在我编译一个工程的时候,用MOV指令编译有 ...
- LDR 和MOV 指令区别
LDR 和MOV 指令区别 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ld ...
最新文章
- 数学建模 概率论与数理统计
- 三十分钟理解:双调排序Bitonic Sort,适合并行计算的排序算法
- 小程序使用wxParse解析html
- android 如何监听应用前后台切换
- LeetCode 257. 二叉树的所有路径(DFS)
- 1090 Highest Price in Supply Chain (25 分)
- 为啥加班多太多对身体会造成影响,不干活就不会对身体造成影响么?
- jQuery对象与DOM对象之间的转换方法
- activiti 定时任务和线程池
- JavaScript中B继承A的方法
- POST的Response数据问题
- jQuery匹配各种条件的选择器用法
- time模块时间格式转换及faker库数据伪造
- 关于window10修改默认浏览器闪退的情况
- java forward方法_JAVA的服务重定向:使用forward()方法转发请求和使用sendRedirect()方法重定向的区别...
- java net包 网关_Net分布式系统之六:微服务之API网关
- localtime 和 localtime_r
- 开发手机APP做UI设计,这5个UI错误会置你的APP于死地!
- php 井字棋,Unity3D 井字棋
- struts2升级到2.5.30总结