Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ARM AArch64堆栈管理_Assembly_Arm_64 Bit_Calling Convention_Arm64 - Fatal编程技术网

Assembly ARM AArch64堆栈管理

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]! 请注意,

是否无法为ARMv8提供64位堆栈?我知道AArch64上没有push和pop指令,所以堆栈管理是否留给AArch32进行参数传递等?我们如何传递48位地址?我对在AArch64中操作时函数调用的工作方式感到困惑。

与在32位*中非常相似,SP是一个有效的基址寄存器,因此机制没有那么大的不同。不同的是,SP不再是一个通用寄存器,您可以用它做任何您想做的事情,您不再有变量加载/存储多个操作,也不再有程序员友好的别名。因此,典型的“推动”是:

stp xn, xm, [sp, #-16]!
请注意,如果您只关心一个寄存器,则通常应使用
stp
/
ldp
来支持
str
/
ldr
,以便在堆栈上操作时保持对齐(尤其是在打开硬件对齐检查时),按/pop
xzr
作为另一个按钮以填充间隙



*请记住,例如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]