這個問題在這里已經有了答案: 為什么 GCC 分配的堆疊記憶體比需要的多? (1 個回答) 6 小時前關閉。
我正在閱讀從頭開始的編程。pdf地址: http: //mirror.ossplanet.net/nongnu/pgubook/ProgrammingGroundUp-0-8.pdf
我很好奇 Page37 為區域變數保留的空間。他說,我們需要 2 個字的記憶體,所以將堆疊指標向下移動 2 個字。執行這條指令:subl $8, %esp 所以,在這里,我想我明白了。
但是,我撰寫了 c 代碼來驗證這個保留空間。
#include <stdio.h>
int test(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12) {
printf("a1=%#x, a2=%#x, a3=%#x, a4=%#x, a5=%#x, a6=%#x, a7=%#x, a8=%#x, a9=%#x, a10=%#x, a11=%#x, a12=%#x", a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
return 0;
}
int main(void){
test(0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12);
printf("Wick is me!");
return 0;
}
然后,我使用 gcc 轉換為可執行檔案gcc -Og -g,并使用 gdb 除錯器。
我使用disassmain 函式,并在下面復制了一些 asm 代碼。
0x000055555555519d < 0>: endbr64
0x00005555555551a1 < 4>: sub $0x8,%rsp # reserve space?
0x00005555555551a5 < 8>: pushq $0x12
0x00005555555551a7 < 10>: pushq $0x11
0x00005555555551a9 < 12>: pushq $0x10
0x00005555555551ab < 14>: pushq $0x9
0x00005555555551ad < 16>: pushq $0x8
0x00005555555551af < 18>: pushq $0x7
0x00000000000011b1 < 20>: mov $0x6,%r9d
0x00000000000011b7 < 26>: mov $0x5,%r8d
0x00000000000011bd < 32>: mov $0x4,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/490831.html
