ARM Arch64指令集中PUSH{lr}
和POP{lr}
的等效指令是什么。
STR X30, [SP, #8]
是否正确?你能解释一下保持堆栈对齐的概念吗?我对ARMv8比较陌生,请原谅。
答案 0 :(得分:7)
如果您要求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
答案 1 :(得分:3)
STR X30, [SP, #8]
完全错了。
关于Aarch64堆栈最重要的一点是SP
必须是16字节对齐。
堆栈正在下降。所以SP
应该向左移动。 sub sp, sp, #CONST
。在你的例子中,你实际上搞乱了父函数的数据。
如果您需要在Aarch64中使用
LR
的{{1}}
x30
从技术上讲,只能通过
str x30, [sp,#-16]!
但假设您的函数不调用任何其他子函数。但在这种情况下,为什么在地球上保存str x30, [sp,#-8] // sp is not changed here! but data is written in permitted area
?
Aarch64也可以使用任何其他寄存器来执行函数返回。例如:
LR
如果您需要保留2个以上的寄存器,请使用@BitBank提供的示例
最后,您无法修改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
,因此只有一种方法可以使用pc