このような状況では、次を使用してコンパイラが何をしているかを簡単に確認できます。
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>