[英]PUSH {lr} and POP {lr} in ARM Arch64
ARM Arch64指令集中PUSH{lr}
和POP{lr}
的等效指令是什么。
STR X30, [SP, #8]
是否正確? 你能解釋一下保持堆棧對齊的概念嗎? 我對ARMv8比較陌生,請原諒。
如果您要求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
STR X30, [SP, #8]
是完全錯誤的。
關於Aarch64堆棧最重要的一點是SP
必須是16字節對齊 。
堆棧正在下降。 所以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
返回
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.