如何解决无法理解armv7 adr_l指令示例
中的示例代码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
等,而不是x0
或w0
。
在非拇指(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 举报,一经查实,本站将立刻删除。