ARM中的指令写回

Posted

技术标签:

【中文标题】ARM中的指令写回【英文标题】:Instruction writeback in ARM 【发布时间】: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 的加载指令,因此它非常重要。) 【参考方案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。 - - - 笔记 - - - - - - 预索引寻址和后索引寻址意味着写回。 ----------------------

【讨论】:

以上是关于ARM中的指令写回的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式:ARM的流水线技术

ARM NEON 中的指令调度

ARM汇编程序中的伪指令

ARM指令集——跳转指令

arm汇编b指令是绝对地址还是相对地址跳转?

iOS逆向工程之Hopper中的ARM指令