Assembly ARM AArch64堆栈管理
是否无法为ARMv8提供64位堆栈?我知道AArch64上没有push和pop指令,所以堆栈管理是否留给AArch32进行参数传递等?我们如何传递48位地址?我对在AArch64中操作时函数调用的工作方式感到困惑。与在32位*中非常相似,SP是一个有效的基址寄存器,因此机制没有那么大的不同。不同的是,SP不再是一个通用寄存器,您可以用它做任何您想做的事情,您不再有变量加载/存储多个操作,也不再有程序员友好的别名。因此,典型的“推动”是:Assembly ARM AArch64堆栈管理,assembly,arm,64-bit,calling-convention,arm64,Assembly,Arm,64 Bit,Calling Convention,Arm64,是否无法为ARMv8提供64位堆栈?我知道AArch64上没有push和pop指令,所以堆栈管理是否留给AArch32进行参数传递等?我们如何传递48位地址?我对在AArch64中操作时函数调用的工作方式感到困惑。与在32位*中非常相似,SP是一个有效的基址寄存器,因此机制没有那么大的不同。不同的是,SP不再是一个通用寄存器,您可以用它做任何您想做的事情,您不再有变量加载/存储多个操作,也不再有程序员友好的别名。因此,典型的“推动”是: stp xn, xm, [sp, #-16]! 请注意,
stp xn, xm, [sp, #-16]!
请注意,如果您只关心一个寄存器,则通常应使用stp
/ldp
来支持str
/ldr
,以便在堆栈上操作时保持对齐(尤其是在打开硬件对齐检查时),按/popxzr
作为另一个按钮以填充间隙
*请记住,例如ARM指令集中的“push”只是
stmdb r13!的汇编程序别名!,{rn,…,rm}
或strrn,[sp,#-4]代码>视情况而定,此类别名仅作为Thumb-2的一部分在统一汇编语言中引入。特定的push/pop指令确实出现在原始的16位Thumb中,因为SP无法在正常的加载/存储操作中编码,而这些操作只能在低寄存器上运行。根据,您可以使用LDP/STP或仅使用LDR/STR。另请参阅,此处的存储对指令不会修改堆栈指针,对吗?因此,如果必要,我们仍然需要增加它?我的理解是:“将xn和xm存储在sp-16字节所指向的地址”您忽略了基本寄存器上的代码>语法,表示“…并将sp-16写回sp”。这就是预索引和偏移寻址模式之间的区别所在。@Notlikethat,“如果您只关心一个寄存器,那么push/pop xzr”。对于一个寄存器,最好使用strxn、[sp、#-16]代码>