- 论坛徽章:
- 1
|
本帖最后由 float001 于 2013-08-21 15:09 编辑
按照gcc中正常情况来说,局部变量紧挨着ebp向低地址排列(不考虑对齐补齐问题),如下代码:
- int func(int a, int b)
- {
- int i=0, j=0, k=0;
-
- return 0;
- }
复制代码 对应的汇编代码如下:-
- 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
复制代码 i的地址是 ebp-4 , j的地址是ebp-8 , k的地址是 ebp-12
但是在函数中增加printf打印 ,则i,j,k的地址减少了8字节,如下代码:
- int func(int a, int b)
- {
- int i=0, j=0, k=0;
- printf("123\n");
-
- return 0;
- }
复制代码 对应的汇编代码如下:
- 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
复制代码 此时i的地址是 ebp-12 , j的地址是ebp-16 , k的地址是 ebp-20
不知道是什么原因,与printf有关么 ,请各位帮忙解答一下,谢谢。
VC++6.0中没有出现这种情况,应该是gcc编译器的问题, 谁能解答一下呢??????
|
|