对于这种情况,您可以使用以下命令轻松检查编译器正在执行的操作
gcc -g -c yourfile.c
然后查看生成的程序集
objdump -d -M intel -S yourfile.o
:
00000000 <main>:
int main() {
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 ec 10 sub esp,0x10
啊! 这是堆栈指针被修改的地方。请注意,对于您的函数的其余部分,它是单独存在的:堆栈不会增长。
while (1)
{
int x = 0;
6: c7 45 f4 00 00 00 00 mov DWORD PTR [ebp-0xc],0x0
让我们x
放在[ebp-0xc]
...
int *y = &x;
d: 8d 45 f4 lea eax,[ebp-0xc]
10: 89 45 f8 mov DWORD PTR [ebp-0x8],eax
...并且y
在[ebp-0x8]
.
while (x < 10)
13: eb 10 jmp 25 <main+0x25>
{
int z = 0;
15: c7 45 fc 00 00 00 00 mov DWORD PTR [ebp-0x4],0x0
z
总是在[ebp-0x4]
!
++x;
1c: 8b 45 f4 mov eax,DWORD PTR [ebp-0xc]
1f: 83 c0 01 add eax,0x1
22: 89 45 f4 mov DWORD PTR [ebp-0xc],eax
25: 8b 45 f4 mov eax,DWORD PTR [ebp-0xc]
x
还在[ebp-0xc]
!
28: 83 f8 09 cmp eax,0x9
2b: 7e e8 jle 15 <main+0x15>
2d: eb d7 jmp 6 <main+0x6>