当前位置:首页 > 芯闻号 > 充电吧
[导读]ldr指令和adr、ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值;adr、ldr伪指令用于获取标号的地址。adr和ldr伪指令的区别:adr是获取相对PC的地址,

ldr指令和adr、ldr伪指令的区别:

ldr指令属于load-store指令,用于读取标号地址中的值;

adr、ldr伪指令用于获取标号的地址。

adr和ldr伪指令的区别:


adr是获取相对PC的地址,与程序当前运行的位置相关,是小范围的地址读取伪指令;

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

来看一个例子!

汇编文件:


	ldr r0,_start
	adr r0,_start
	ldr r0,=_start
	
_start:
		b	_start


反汇编:


led_elf:     file format elf32-littlearm

Disassembly of section .text:

00000000 :
   0:	e59f0004 	ldr	r0, [pc, #4]	; c4:	e28f0000 	add	r0, pc, #0	; 0x0
   8:	e59f0000 	ldr	r0, [pc, #0]	; 10 
   c:	eafffffe 	b	c10:	0000000c 	andeq	r0, r0, ip

1.ldr r0,_start

 0: e59f0004 ldrr0, [pc, #4]; c

这是一条指令,从内存地址_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

 4: e28f0000 addr0, pc, #0; 0x0

这是一条伪指令,总是会被汇编程序会变为一个指令,汇编程序尝试产生单个ADD或SUB指令来装载该地址。

如果不能在一个指令中构造该地址,则生成一个错误,并且汇编失败。

这里是取得标号_start的地址到r0,因为地址是相对程序的,因此adr的产生依赖于位置的代码,在此例中被汇编成:

add r0,pc,#0。因此该代码可以在和标号相对位置不变的情况下移动。

假如这段代码在0x30000000运行,那么adr r0,_start得到r0 = 0x3000000c;如果在地址0运行,那么就是0x0000000c了。(计算方法:r0 = pc(0x00000004+8)+0= 0x0000000c )。

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


3.ldr r0,=_start

 8: e59f0000 ldr r0, [pc, #0]; 10

这是一条伪指令,_start是一个绝对地址(也即运行地址)。

这个绝对地址是在链接的时候确定的,它占用2个32bit的空间,一条是指令,另一条是文字池中存放_start的绝对地址。在此例中生成的指令为:

ldr r0,[pc,#0],对应文字池中的地址以及值为:0x00000010:0000000c,因此该伪指令执行后r0的值为0x0000000c。(计算方法:r0 = [pc(0x00000008+8)+0]= [0x00000010]=0x000000c)。

因此可以看出,不管这段代码将来在什么地方运行,它的结果都是r0=0x3000000c。由于ldr r0,=_start取得的是_start的绝对地址,这句代码可以在_start标号的绝对位置不变的情况下移动,如使用寄存器pc在程序中可以实现绝对转移,即实现重定位!





本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

从汇编角度来说,如果“test %al, %al”能改成“test %0x1, %al”就没有匪夷所思的问题了,如此一来应该会降低CPU的效率,毕竟执行指令还需要一个立即数,我没搞过编译器也没设计过CPU,纯属瞎猜,能搞...

关键字: 汇编 CPU 编译器

【说在前面的话】其实我很久之前就想写这篇文章了,但彼时总觉得这是一个伪命题:既然已经用了MDK,编译出来的代码,无论是体积还是性能都甩下armgcc好几条街,谁还会想用gcc来进行Cortex-M开发呢?对那些只能使用a...

关键字: GCC MDK 汇编

1.背景群里有个小伙伴学习设计加密方法,如同某商用软件输入注册码后就能使用扩展功能。设计时他很自然的想着所写的加密措施是否足够健壮安全,是否有什么方法可以绕过加密检查,也就是破解。权限管理仅在启动后检查一次注册码是否有效...

关键字: 指令 汇编 软件

最近很多伙计问我现在搞嵌入式还有没有必要学习汇编?

关键字: 嵌入式 汇编

近日,CSDN发布《2016年度中国软件开发者白皮书》,其中对国内的VR应用开发现状进行了分析。 从上世纪60年代第一款真正意义上的虚拟现实头盔诞生,到Facebook以巨额资金投入VR

关键字: csdn vr

来源 :智能软件研究中心,作者:罗宇哲,直接来源:华为开发者社区 声明:本公众号转发仅为传播相关技术知识,不作任何商业用途,如有疑义请联系删除。 01 ARM汇编指令 操作系统中硬件相关的部分集中体现在汇编指令和对寄存器...

关键字: ARM 汇编

7月3日消息,在 CSDN 主办的第三届 AI 开发者大会(AI ProCon 2020)上,360金融首席科学家张家兴博士分享了数据+AI融合中台—;金融领域人工智能实践。 张家兴认为,360金融提

关键字: 360金融 AI csdn 数据 张家兴

Part 1. 机器指令 上一次 我们已经了解了 二进制和 CPU 的基本原理,知道了程序运行时,CPU 每秒数以亿次、十亿次、百亿次地震荡着时钟,同步执行着微小的 「电子操作」,例如:从内存读取一个字节的数据到 CPU...

关键字: 高级编程 编程语言 汇编

来源 :智能软件研究中心,作者:罗宇哲,直接来源:华为开发者社区 声明:本公众号转发仅为传播相关技术知识,不作任何商业用途,如有疑义请联系删除。 01 ARM汇编指令 操作系统中硬件相关的部分集中体现在汇编指令和对寄存器...

关键字: ARM 汇编

北京时间4月30日早间消息,据外媒报道,Facebook首席执行官扎克伯格周三警告称,过早重新开放公共空间“几乎可以肯定”将会导致新冠病毒的继续爆发,并带来不良的经济后果。 扎克伯格在公司第一季度财报

关键字: 扎克伯格 FACEBOOK LTE 汇编
关闭
关闭