這個問題我有點卡住了。給定以下 C 代碼:
#include <stdio.h>
#define BUF_SIZE 13
int foo(){
int i;
int B[BUF_SIZE];
for(i = 0; i < BUF_SIZE; i )
B[i] = 5;
return i;
}
int main(){
foo();
return 0;
}
生成以下 Intel-x86 程式集:
1. .file "code.c"
2. .intel_syntax noprefix
3. .text
4. .globl foo
5. .type foo, @function
6. foo:
7. push ebp
8. mov ebp, esp
9. sub esp, 64
10. mov DWORD PTR [ebp-4], 0
11. jmp .L2
12. .L3:
13. mov eax, DWORD PTR [ebp-4]
14. mov DWORD PTR [ebp-56 eax*4], 5
15. add DWORD PTR [ebp-4], 1
16. .L2:
17. cmp DWORD PTR [ebp-4], 12
18. jle .L3
19. mov eax, DWORD PTR [ebp-4]
20. leave
21. ret
22. .size foo, .-foo
23. .globl main
24. .type main, @function
25. main:
26. push ebp
27. mov ebp, esp
28. call foo
29. mov eax, 0
30. pop ebp
31. ret
32. .size main, .-main
33. .ident "GCC: (Debian 6.3.0-18 deb9u1) 6.3.0 20170516"
34. .section .note.GNU-stack,"",@progbits
我有點難以確定程式集中第 9 行的含義。我的理解是,我們從堆疊暫存器中減去,以便在堆疊上為區域變數分配空間。那么我知道,陣列減去了 52 個位元組B,而i. 但我想知道其他 8 個位元組來自哪里?這些是fooand的回傳值main嗎?任何幫助,將不勝感激。
uj5u.com熱心網友回復:
添加到的位元組esp數向上舍入以保持一些堆疊對齊。想象一下,你只會添加57或其他東西。您將呼叫的函式然后需要在存盤 4 位元組整數之前首先重新對齊堆疊指標。如果每個人都保持堆疊對齊,那么每個人都可以省去麻煩。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424435.html
上一篇:CALL/GOTO不需要PIC16F84PCLATHBit3 4?
下一篇:用ASM函式覆寫弱C函式別名
