我正在閱讀Randal E. Bryant 和 David R. O'Hallaron的 Computer Systems: A Programmer's Perspective 3rd Edition。
在第 3 章和第 7.5 節中,有圖展示了如何分配堆疊幀,如下所示:

我不明白為什么需要第 4 行和第 12 行。似乎不需要這些行,因為根本沒有使用剩余的 8 位元組堆疊記憶體。
正如評論所指出的,恕我直言,似乎不可避免地將它分配為將堆疊幀對齊 24 個位元組:
- 分別為
pushq %rbp和額外的 16 個位元組pushq %rbx - , 和 8 個位元組
subq $8, %rsp
所以,我的問題可以總結為“為什么堆疊幀是 24 位元組對齊的? ”
uj5u.com熱心網友回復:
24 位元組不是 2 的冪,因此不能對齊。真正的對齊是 16 個位元組,而您忘記考慮call指令也將 8 個位元組壓入堆疊。因此,堆疊指標總共移動了 32 個位元組,保持對齊到 16 個位元組。
uj5u.com熱心網友回復:
這與 x64 ABI(Microsoft 和 SystemV)一致。在呼叫函式之前,堆疊必須在 16 位元組邊界上對齊(在您的示例中為“呼叫 Q”)。假設堆疊最初位于 16 位元組邊界。當程式到達“P”標簽時(由于“呼叫 P”指令),RSP 指向下面的 8 個位元組,因為“呼叫”將 RSP 減去 8 并將 RIP(8 個位元組)保存在 *RSP。然后,有兩個“pushq”(第 2 行和第 3 行),每個都將 RSP 減少 8,因此 RSP 仍然未對齊。這就是為什么編譯器必須在第 8 行和第 10 行執行“call Q”之前減去 8 以對齊 RSP。
這篇文章很好地描述了 x86/x64 ABI: https ://en.wikipedia.org/wiki/X86_calling_conventions
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430136.html
