A64指令结束时感叹号的含义是什么?

Ser*_*tch 7 assembly stack arm instructions arm64

LDP和STP文档最后给出了带有感叹号的示例指令:

LDP X8, X2, [X0, #0x10]!
Run Code Online (Sandbox Code Playgroud)

有关将A32 PUSH/POP指令移植到A64中的文档还提供了以下示例:

PUSH {r0-r1} ---> STP X0, X1, [SP, #-16]!
POP {r0-r1}  ---> LDP X0, X1, [SP], #16
Run Code Online (Sandbox Code Playgroud)

这两个页面都没有解释说明书末尾的感叹号是什么意思.它是什么?

Dri*_*512 9

!"寄存器回写" 的含义:基址寄存器用于计算传输的地址,并进行更新.

在你的例子中:

LDP X8, X2, [X0, #0x10]!
Run Code Online (Sandbox Code Playgroud)

X0 修改后使操作后:

X0 = X0 + 0x10
Run Code Online (Sandbox Code Playgroud)

如果你没有把!,X0不被操作修改.

在关于PUSH/POP的第二个例子中,不同之处在于增量完成时:

STP X0, X1, [SP, #-16]!存储在地址SP-16,并SP以相同的方式递减

LDP X0, X1, [SP], #16从地址加载SP,并在执行传输后,存储SP+16SP.

  • `!` 只对类似这样的形式有意义:`LDR X0, [XP, #16]`,称为预增量。取决于`!`,基址寄存器是否更新。对于另一种形式,称为后增量:`LDR X0, [SP], #16`,回写总是发生(即更新基数),并且不允许`!`。 (3认同)
  • 该文档说了不同的事情:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch05s01s03.html。使用“!”时,目标寄存器在操作之前递增,如果没有“!”,则在操作之后递增。 (2认同)