簡體   English   中英

ARM Arch64中的PUSH {lr}和POP {lr}

[英]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]是完全錯誤的。

  1. 關於Aarch64堆棧最重要的一點是SP 必須是16字節對齊

  2. 堆棧正在下降。 所以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM