A64指令末尾的感叹号是啥意思?

Posted

技术标签:

【中文标题】A64指令末尾的感叹号是啥意思?【英文标题】:What does the exclamation mark mean in the end of an A64 instruction?A64指令末尾的感叹号是什么意思? 【发布时间】:2017-02-08 08:51:22 【问题描述】:

documentation for LDP and STP 给出的示例指令末尾带有感叹号:

LDP X8, X2, [X0, #0x10]!

A64 中的documentation about porting A32 PUSH/POP 指令也提供了以下示例:

PUSH r0-r1 ---> STP X0, X1, [SP, #-16]!
POP r0-r1  ---> LDP X0, X1, [SP], #16

这两页都没有解释说明末尾的感叹号是什么意思。它有什么作用?

【问题讨论】:

您是否考虑过阅读有关寻址模式的文档(如果我没记错的话,! 表示不仅将偏移量添加到sp,而且将结果写回sp)。 它的含义与过去 3 年在 ARM 预索引寻址模式中的含义完全相同,并且每个指令集参考都涵盖,包括您链接的文档...(提示:6.3.4) @Notlikethat 并不是每个人都参与了这个游戏 3 年。为什么是阴影?在 arm 架构文档中搜索这样的内容并不容易。 【参考方案1】:

! 表示“寄存器回写”:基址寄存器用于计算传输的地址,并更新

在你的例子中:

LDP X8, X2, [X0, #0x10]!

X0修改后这样运行:

X0 = X0 + 0x10

如果不放!X0是不会被操作修改的。

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

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

LDP X0, X1, [SP], #16从地址SP加载,传输完成后将SP+16存储到SP

【讨论】:

此文档说明了不同的内容:infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/…。使用!,目标寄存器在操作之前递增,没有! - 之后。 链接似乎不正确。但无论如何,我认为您正在比较两种回写形式:LDR x1, [x0, #imm]!LDR x1, [x0], #imm。第一个表单在 x0+#imm 加载(之前递增),第二个表单在 x0 加载。 这个链接应该是正确的:infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/… "如果不放!,X0不会被操作修改。", "LDP X0,X1,[SP],#16从地址SP加载,并在执行传输后, 将 SP+16 存储到 SP。” - 这些不矛盾吗?据我了解,寄存器总是更新的,只是!表示之前还是之后。 !只对LDR X0, [XP, #16]这样的形式有含义,称为预增量。取决于!,基址寄存器是否更新。对于另一种形式,称为后增量:LDR X0, [SP], #16,总是发生回写(即更新基数),不允许!

以上是关于A64指令末尾的感叹号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

函数名后面的感叹号是啥意思?

函数调用前的感叹号是啥意思?

excel重感叹号(!)是啥意思

PHP中函数前的感叹号是啥意思

Java的方法参数中的双感叹号和#号是啥意思?

在 ruby​​ on rails 中,感叹号后面是啥意思? [复制]