|
在我的印象中函数内局部变量是在栈内申请内存的,请看如下代码
- #include <stdio.h>
- int main()
- {
- int a=1;
- int b=2;
- int c=3;
- #ifdef PNTADDR
- printf("%p %p %p\n", &a, &b, &c);
- #else
- printf("%d %d %d\n",a,b,c);
- #endif
- }
复制代码
按理应是变量a占内存高位,其次是b,最次是c
用gcc-3.3 gcc-4.0 打开 PNTADDR 得到的结果验证了这一点
0xbffff9a4 0xbffff9a0 0xbffff99c
从他们的汇编码中也能看到这一点:
- 80483b4: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)
- 80483bb: c7 45 f8 02 00 00 00 movl $0x2,0xfffffff8(%ebp)
- 80483c2: c7 45 f4 03 00 00 00 movl $0x3,0xfffffff4(%ebp)
复制代码
但是如果关了 PNTADDR ,只打印三个整形变量的值,虽然结果一致,但用 gcc-3.3 和 gcc-4.0 生成的两个文件的汇编码却不同
gcc-3.3 还是尊照了上述原则
- 80483b4: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)
- 80483bb: c7 45 f8 02 00 00 00 movl $0x2,0xfffffff8(%ebp)
- 80483c2: c7 45 f4 03 00 00 00 movl $0x3,0xfffffff4(%ebp)
复制代码
但gcc-4.0 的却是这样
- 80483b4: c7 45 f4 01 00 00 00 movl $0x1,0xfffffff4(%ebp)
- 80483bb: c7 45 f8 02 00 00 00 movl $0x2,0xfffffff8(%ebp)
- 80483c2: c7 45 fc 03 00 00 00 movl $0x3,0xfffffffc(%ebp)
复制代码
比较奇怪啊.
总结:
无论如何使用局部变量(取地址或是取值),gcc-3.3 得到的汇编码的局部变量内部遵守栈分配原则,先声明的在内存高位,后的在低位.
对于gcc-4.0 ,如果下文中用到了变量的地址,则按上述原则分配内存,否则按先声明内存在低位的方式分配.
gcc-3.3 -DPNTADDR -o test3_p test.c
gcc-3.3 -o test3_v test.c
gcc-4.0 -DPNTADDR -o test4_p test.c
gcc-4.0 -o test4_v test.c
objdump -d test3_p test4_p test3_v test4_v | sed -n '/<main>/,+20p'
coder@deb3:~/progs/cc$ gcc-3.3 --version
gcc-3.3 (GCC) 3.3.6 (Debian 1:3.3.6-7)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
coder@deb3:~/progs/cc$ gcc-4.0 --version
gcc-4.0 (GCC) 4.0.1 20050701 (prerelease) (Debian 4.0.0-12)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|