无法理解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个字节的偏移量。)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...