微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法理解armv7 adr_l指令示例

如何解决无法理解armv7 adr_l指令示例

这是https://developer.arm.com/documentation/dui0068/b/arm-instruction-reference/arm-pseudo-instructions/adrl-arm-pseudo-instruction

中的示例代码
start   MOV     r0,#10
        ADRL    r4,start + 60000     ; => ADD r4,pc,#0xe800
                                     ;    ADD r4,r4,#0x254

我无法理解代码中的注释。由于60000为0xea60。我认为r4应该是pc +#0x2a60。但是评论说(实际上是发出的指令)r4变成pc +#0xe800 +#0x254 = pc + 0xea54。 (不是#ea60)。为什么少12个?

解决方法

这些是arm(即arm32)指令,即使您的标题和标签最初表示的是arm64。请注意,寄存器是r0等,而不是x0w0

在非拇指(A32)状态的32位ARM上,PC读取为当前指令的地址加8。(《体系结构参考手册》 E.1.2.3中对它的解释) Armv8-A版本。)

因此,如果start位于地址0x0,则ADD r4,pc,#0xe800指令位于地址0x4,因此pc将被读取为0xc。因此ADD r4,#0xe800将用r4加载0xe80c。然后添加0x254将根据需要保留包含r4的{​​{1}}。

arm64是不同的。在那里,PC不能作为通用寄存器访问,因此您不能直接在PC上来回移动,但是像0xea60这样的指令在其上执行时,会将其视为指向当前指令(没有该指令)。 8个字节的偏移量。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。