【问题标题】:can't understand armv7 adr_l instruction example看不懂 armv7 adr_l 指令示例
【发布时间】:2020-10-25 15:00:09
【问题描述】:

这是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 个?

【问题讨论】:

  • MOV 占用 4 个字节,pc 已经提前了 8 个字节,总共 12 个字节。

标签: assembly armv7


【解决方案1】:

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

在非 Thumb (A32) 状态的 32 位 ARM 上,PC 读取当前指令的地址加 8。(这在我的体系结构参考手册 E.1.2.3 的副本中进行了解释Armv8-A 版本。)

所以如果start 位于地址0x0,ADD r4,pc,#0xe800 指令位于地址0x4,因此pc 将被读取为0xc。因此ADD r4,pc,#0xe800 将使用0xe80c 加载r4。然后添加0x254 将使r4 包含0xea60 根据需要。

arm64 不同。在那里,PC 不能作为通用寄存器访问,因此您不能直接进出它,但是像ADR 这样作用于它的指令确实将它视为指向当前指令(没有 8 字节偏移量)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多