【问题标题】:Instruction writeback in ARMARM中的指令写回
【发布时间】:2021-02-08 18:17:11
【问题描述】:

ARM 参考手册指出:

如果加载指令指定写回并且正在加载的寄存器也是基址寄存器,那么行为是 CONSTRAINEDUNPREDICTABLE

在这种情况下,“写回”一词是什么意思?

【问题讨论】:

  • 类似于ldr r0, [r0, #4]! 的东西,索引计算的结果被写回基址寄存器。这也适用于后索引寻址模式,如ldr r0, [r0], #4
  • @fuz ldr 指令有什么作用?它未在 arm64 指令参考中列出。 developer.arm.com/documentation/100076/0100/…
  • @fctorial 您正在查看一般说明。在这种情况下,您应该查看the Data Transfer Instructions
  • 我建议从一些基本的教程内容和/或常见的编译器输出开始,以熟悉最常见的指令,然后再深入了解完整的手册;如果您对全局有所了解,细节会更有意义(例如 ldr 是什么。它是 ARM 的加载指令,因此它非常重要。)

标签: assembly arm arm64 armv8


【解决方案1】:

“ldr(立即)”指令有三种形式:

ldr x0, [x1, 8]
ldr x0, [x1, 8]!
ldr x0, [x1], 8

第一个应该很明显,是“常规”语法。
第二种称为预索引,相当于:

add x1, x1, 8
ldr x0, [x1]

而第三个称为后索引,相当于:

ldr x0, [x1]
add x1, x1, 8

手册所指的情况是这样的说明:

ldr x0, [x0, 8]!
ldr x0, [x0], 8

在这种情况下(来自the G.a version 的 K1-8255 页):

受约束的不可预测的行为 如果指令编码指定预索引寻址或后索引 寻址,并且 n == t && n != 31,则以下行为之一必须 发生: • 指令未定义。 • 该指令作为NOP 执行。 • 指令使用指定的寻址模式执行加载, 并且基址寄存器设置为 UNKNOWN 值。此外,如果一个 在这样的指令期间发生异常,基址寄存器可能是 损坏,因此指令不能重复。 • 对于在 EL0 或 EL1 上执行,当 EL2 被实现并为 当前安全状态且 HCR_EL2.TIDCP 为 1,指令被困 到 EC 值为 0x0 的 EL2。 - - - 笔记 - - - - - - 预索引寻址和后索引寻址意味着写回。 ----------------------

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2017-06-07
    • 2013-09-20
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多