ARM AArch64 堆栈管理
ARM AArch64 stack management
ARMv8 不能有 64 位堆栈吗?我知道 AArch64 上没有 push 和 pop 指令,所以堆栈管理是否留给 AArch32 进行参数传递等?我们如何传递 48 位地址?我对在 AArch64 中运行时函数调用的工作方式感到困惑。
与 32 位* 非常相似,SP 是 any load/store instruction 的有效基址寄存器,因此机制并没有什么不同。不同的是,SP 不再是一个通用寄存器,你可以为所欲为,你不再有变量 load/store-multiple 操作,也没有程序员友好的别名。因此,典型的 "push" 将是:
stp xn, xm, [sp, #-16]!
请注意,您通常应该使用 stp
/ldp
而不是 str
/ldr
以便在堆栈上操作时保持对齐(尤其是当你打开了硬件对齐检查)——如果你只关心一个寄存器,push/pop xzr
作为另一个来填补空白。
* 请记住,例如ARM 指令集中的 "push" 只是 stmdb r13!, {rn, ..., rm}
或 str rn, [sp, #-4]!
的汇编别名(视情况而定),此类别名仅作为 Thumb-2 的一部分与统一汇编语言一起引入。特定的 push/pop 指令 did 出现在原始的 16 位 Thumb 中,因为 SP 不能在正常的 load/store ops 中编码,它只在低位寄存器上运行。
ARMv8 不能有 64 位堆栈吗?我知道 AArch64 上没有 push 和 pop 指令,所以堆栈管理是否留给 AArch32 进行参数传递等?我们如何传递 48 位地址?我对在 AArch64 中运行时函数调用的工作方式感到困惑。
与 32 位* 非常相似,SP 是 any load/store instruction 的有效基址寄存器,因此机制并没有什么不同。不同的是,SP 不再是一个通用寄存器,你可以为所欲为,你不再有变量 load/store-multiple 操作,也没有程序员友好的别名。因此,典型的 "push" 将是:
stp xn, xm, [sp, #-16]!
请注意,您通常应该使用 stp
/ldp
而不是 str
/ldr
以便在堆栈上操作时保持对齐(尤其是当你打开了硬件对齐检查)——如果你只关心一个寄存器,push/pop xzr
作为另一个来填补空白。
* 请记住,例如ARM 指令集中的 "push" 只是 stmdb r13!, {rn, ..., rm}
或 str rn, [sp, #-4]!
的汇编别名(视情况而定),此类别名仅作为 Thumb-2 的一部分与统一汇编语言一起引入。特定的 push/pop 指令 did 出现在原始的 16 位 Thumb 中,因为 SP 不能在正常的 load/store ops 中编码,它只在低位寄存器上运行。