【问题标题】:Program Counter in ARM assemblyARM 程序集中的程序计数器
【发布时间】:2013-08-22 06:13:28
【问题描述】:

值加载到r1寄存器的地址是如何计算的?

_start:
    ldrh   r1, [pc, #6]

PC的值=8054(ldrh指令的地址)

按照我的说法,地址的值应该是:PC + 6 = 805A

所以它应该将地址 805A 中的值加载到寄存器 r1 中。

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    这取决于您是处于 ARM 模式还是 Thumb 模式。

    对于 ARM 模式:

    当使用R15 作为基址寄存器时,您必须记住它包含一个 8 字节的地址 从当前指令的地址开始。

    对于拇指模式:

    PC 的值将比该指令的地址大 4 个字节,但位 PC 的 1 被强制为 0 以确保它是字对齐的。

    【讨论】:

    • 我处于 ARM 模式。 R15(或PC),是ARM模式下的4字节寄存器,所以它包含一个4字节(32位地址)。你能具体说说我上面提到的汇编语言指令和PC的价值吗? PC 应该以 4 的倍数递增,我不确定为什么要添加 6。
    • PC 比当前指令提前两条指令,因为处理器完成了预取。在 ARM 模式下,这意味着 8 个字节,而在 Thumb 模式下,这意味着 4 个字节。如果LDRH 指令位于地址 0x8054 并且您使用 6 字节的立即偏移量,它将从地址 0x8054+8+6 == 0x8062 加载。
    • 谢谢。当我调试这个二进制文件并在 ldrh 指令中检查寄存器内容时,它显示 PC 寄存器的值为 0x8054。为什么呢?在执行当前指令之前,PC 的值应该是值 = (当前指令的地址 + 8) 对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多