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-16
,SP
以同样的方式递减
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指令末尾的感叹号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章