您的位置 首页 软件

ARM中的ldr指令与adr、ldr伪指令之间的差异

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

ARM汇编语言中有ldr指令和ldr、adr伪指令,他们都能够将标号表达式作为操作数。差异如下:

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

编译的时分设置r0为0x30000000,下面是反汇编的成果:

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

0x00000004:e28f0000add r0,pc,#0;0x0

0x00000008:e59f0000ldr r0,[pc,#0];0x10

0x0000000c:eafffffeb0xc

0x00000010:3000000candcc r0,r0,ip

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

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

ldr r0,_start是依据_start对当时PC的相对方位读取其所在地址的值,因而能够在和_start标号的相对方位不变的情况下获取数据值。

这是一条伪指令,总是会被汇编程序会变为一个指令,汇编程序测验发生单个ADD或SUB指令来装载该地址。假设不能在一个指令中结构该地址,则生成一个过错,而且汇编失利。

这里是获得标号_start的地址到r0,我们地址是相对程序的,因而adr的发生依赖于方位的代码,在此例中被汇编成:add r0,pc,#0。因而该代码能够在和标号相对方位不变的情况下移动。

假设这段代码在0x30000000运转,那么adr r0,_start得到r0 = 0x3000000c;假设在地址0运转,那么便是0x0000000c了。

经过这一点能够判别程序在什么地方运转。U-Boot中那段relocate代码便是经过adr完成当时程序是在RAM中仍是FLASH中。

这是一条伪指令,_start是一个肯定地址(也即运转地址)。这个肯定地址是在链接的时分确认的,它占用2个32bit的空间,一条是指令,另一条是文字池中寄存_start的肯定地址。在此例中生成的指令为:ldr r0,[pc,#0],对应文字池中的地址以及值为:0x00000010:3000000c,因而该伪指令碑文后r0的值为0x3000000c。因而能够看出,不论这段代码将来在什么地方运转,它的成果都是r0=0x3000000c。

我们ldr r0,=_start获得的是_start的肯定地址,这句代码能够在_start标号的肯定方位不变的情况下移动,如运用寄存器pc在程序中能够完成肯定搬运。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/264044.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部