ARMv8没有64位堆栈的能力吗?我知道AArch64上没有push和pop指令,所以堆栈管理留给AArch32进行参数传递等等吗?我们如何通过48位地址?我总体上对在AArch64中操作时函数调用的工作方式感到困惑。
答案 0 :(得分:3)
就像在32位 * 中一样,SP是any load/store instruction的有效基址寄存器,所以机制并不是那么不同。不同的是,SP不再是一个通用的寄存器,你可以做任何你想做的事情,你不再有可变的加载/存储多个操作,并且没有程序员友好的别名。因此,典型的推动"将是:
stp xn, xm, [sp, #-16]!
请注意,您通常应使用stp
/ ldp
支持str
/ ldr
,以便在堆栈上运行时保持一致(特别是当您拥有时)硬件对齐检查已打开) - 如果您只关注一个注册表,请按/弹出xzr
以填补空白。
*请记住,例如"推"在ARM指令集中,只是stmdb r13!, {rn, ..., rm}
或str rn, [sp, #-4]!
的汇编程序别名,并且这些别名仅作为Thumb-2的一部分使用统一汇编语言引入。特定的推/弹指令 出现在原始的16位Thumb中,因为SP不能在正常的加载/存储操作中编码,只能在低寄存器上操作。 < / p>