问题描述
中的示例代码
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个字节的偏移量。)