aarch64 架构没有多重存储和加载指令,即没有来自 armv7 arch 的 stm 和 ldm 等价物。相反,您必须使用 stp 和 ldp 指令来存储和加载寄存器对。
根据 ARM 参考手册:
没有多寄存器 LDM、STM、PUSH 和 POP 指令,但可以加载存储非连续寄存器对。
我的问题是,这里的非连续是什么意思或指的是什么?我的即时反应是,这意味着您不能在这些命令中使用连续编号的寄存器,例如
stp x0, x1, [sp, #-16]!
是非法的。但是我不相信这是事实。我已经看到示例代码正是这样做的,而且我设法让(Apple's)Clang 生成类似的代码,例如
stp x1, x0, [fp, #-16]!
我一辈子都想不出连续的意思。我认为这可能与使用重叠寄存器有关,例如
stp x0, x0, [sp, #-16]!
stp w0, x0, [sp, #-12]!
但是,我也看到示例代码也在做这种事情(并不是说代码是正确的!)。如果是这种情况,我也会明确使用术语重叠而不是连续的。
有任何想法吗?