首頁 > 後端開發 > C++ > 為什麼函數「f」會在其他操作之前將 RAX 壓入堆疊?

為什麼函數「f」會在其他操作之前將 RAX 壓入堆疊?

Susan Sarandon
發布: 2024-12-08 08:18:11
原創
384 人瀏覽過

Why Does the Function `f` Push RAX onto the Stack Before Other Operations?

函數呼叫堆疊對齊

在提供的彙編程式碼中,看到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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板