在ARM Arch64指令集中,PUSH{lr}和POP{lr}的等效指令是什么?
STR X30, [SP, #8]是正确的吗?您能解释一下维护堆栈对齐的概念吗?我是ARMv8的新手,所以请原谅。
发布于 2015-01-14 21:53:07
如果您要求C编译器根据您的源代码生成汇编语言清单,您将看到它如何处理将数据推送到ARMv8的堆栈。这可能不是唯一的方法,但GCC是这样做的:
sub sp, sp, #32 \\ Open up some temp stack space
stp x19, x20, [sp] \\ save 2 pairs of registers
stp x21, x30, [sp,#16]
<your code>
ldp x19, x20, [sp] \\ restore 2 pairs of registers
ldp x21, x30, [sp,#16]
add sp, sp, #32 \\ "free" the temp stack space发布于 2015-12-29 13:07:17
STR X30, [SP, #8]是完全错误的。
SP 必须是16字节的aligned.SP应该向左移动。sub sp, sp, #CONST。在您的示例中,您实际上弄乱了父函数的数据。如果需要保留Aarch64中实际为x30 LR,请使用
str x30, [sp,#-16]!从技术上讲,只有通过以下方式才能在寄存器上保留
str x30, [sp,#-8] // sp is not changed here! but data is written in permitted area但假设您的函数不调用任何其他子函数。但在这种情况下,为什么要拯救LR呢?
此外,Aarch64还可以使用任何其他寄存器来执行函数返回。例如:
mov x7, x30 // preserve LR
blr .L.my.bloody.subroutine // blr will mess up LR/x30
...
ret x7 // returning from function by using preserved req如果您需要保留2个以上的寄存器,请使用@BitBank提供的示例
最后,您不能修改pc,因此只有一种方法可以使用ret返回
https://stackoverflow.com/questions/27941220
复制相似问题