【发布时间】:2020-11-02 01:13:50
【问题描述】:
我正在阅读源代码并找到以下说明,但我不明白它的作用。 有人可以帮我理解吗?
stp x19, x20, [x8], #16
如果stp x19, x20, [x8]我能理解就好了。
【问题讨论】:
标签: arm64
我正在阅读源代码并找到以下说明,但我不明白它的作用。 有人可以帮我理解吗?
stp x19, x20, [x8], #16
如果stp x19, x20, [x8]我能理解就好了。
【问题讨论】:
标签: arm64
它被称为“后索引”变体,它在存储后修改地址。
以下两个是等价的:
stp x19, x20, [x8], #16
stp x19, x20, [x8]
add x8, x8, #16
还有一个 pre-index 变体修改了地址 before 存储。
同样,这两个是等价的:
stp x19, x20, [x8, #16]!
add x8, x8, #16
stp x19, x20, [x8]
根据我的经验,这最常用于推送和弹出堆栈帧,如下所示:
some_func:
stp x29, x30, [sp, #-0x10]!
// ...
ldp x29, x30, [sp], #0x10
ret
大多数形式的单寄存器ldr 和str 也有这些变体,有关更多信息,请参阅ARMv8 Reference Manual 中的C1.3.3 节(“加载/存储寻址模式”)。
【讨论】:
stp 上添加!? (我真的不知道他们为什么要把这种语法弄得这么讨厌。)