函數呼叫堆疊對齊
在提供的彙編程式碼中,看到RAX 作為第一個操作被壓入堆疊可能會令人困惑在函數f 內。要了解此操作背後的原因,需要檢查 64 位元 ABI。
64 位元 ABI 要求堆疊在呼叫指令之前進行 16 位元組對齊。然而,呼叫指令將 8 位元組傳回位址壓入堆疊,從而破壞了這種對齊方式。因此,編譯器有義務在繼續下一個呼叫之前採取措施將堆疊重新對齊為 16 的倍數。
在這種情況下,推送一個無關值(例如 RAX)可以起到以下作用:高效的目的。它提供了一種對齊堆疊的方法,而不會產生執行額外的 sub rsp, 8 指令的開銷,這在配備堆疊引擎的 CPU 上可能效率較低。
與沒有 std 的 tailcall 的比較: :function 包裝器說明了這個原理。在普通函數 g 中,編譯器可以簡單地執行 jmp 指令,而無需任何事先的堆疊對齊操作。然而,在 f 的情況下,需要額外推送 RAX 來維持 16 個位元組對齊,確保與 ABI 要求的兼容性。
以上是為什麼函數「f」會在其他操作之前將 RAX 壓入堆疊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!