- 論壇徽章:
- 1
|
本帖最后由 float001 于 2013-08-21 15:09 編輯
按照gcc中正常情況來說,局部變量緊挨著ebp向低地址排列(不考慮對齊補齊問題),如下代碼:
- int func(int a, int b)
- {
- int i=0, j=0, k=0;
-
- return 0;
- }
復(fù)制代碼 對應(yīng)的匯編代碼如下:-
- push %ebp
- mov %esp,%ebp
- sub $0x10,%esp
- movl $0x0,-0x4(%ebp) // i=0
- movl $0x0,-0x8(%ebp) // j=0
- movl $0x0,-0xc(%ebp) // k=0
- mov $0x0,%eax
- leave
- ret
復(fù)制代碼 i的地址是 ebp-4 , j的地址是ebp-8 , k的地址是 ebp-12
但是在函數(shù)中增加printf打印 ,則i,j,k的地址減少了8字節(jié),如下代碼:
- int func(int a, int b)
- {
- int i=0, j=0, k=0;
- printf("123\n");
-
- return 0;
- }
復(fù)制代碼 對應(yīng)的匯編代碼如下:
- push %ebp
- mov %esp,%ebp
- sub $0x28,%esp
- movl $0x0,-0xc(%ebp) // i=0
- movl $0x0,-0x10(%ebp) // j=0
- movl $0x0,-0x14(%ebp) // k=0
- movl $0x8048510,(%esp)
- call 0x8048318 <puts@plt>
- mov $0x0,%eax
- leave
- ret
復(fù)制代碼 此時i的地址是 ebp-12 , j的地址是ebp-16 , k的地址是 ebp-20
不知道是什么原因,與printf有關(guān)么 ,請各位幫忙解答一下,謝謝。
VC++6.0中沒有出現(xiàn)這種情況,應(yīng)該是gcc編譯器的問題, 誰能解答一下呢??????
無標題.png (19.15 KB, 下載次數(shù): 41)
下載附件
2013-08-21 15:09 上傳
|
|