我在 Ubuntu 32bit 上使用 gcc 版本 4.6.3 使用命令编译了以下程序 gcc -ggdb -o test test.c
void test(int a, int b, int c, int d)
{
int flag;
char buffer[10];
flag = 31337;
buffer[0] = 'a';
a = 5;
}
int main(void)
{
test(1, 2, 3, 4);
return 0;
}
上面的测试函数在gdb中的反汇编是:-
0x08048404 <+0>: push ebp
0x08048405 <+1>: mov ebp,esp
0x08048407 <+3>: sub esp,0x28
0x0804840a <+6>: mov eax,gs:0x14
0x08048410 <+12>: mov DWORD PTR [ebp-0xc],eax
0x08048413 <+15>: xor eax,eax
0x08048415 <+17>: mov DWORD PTR [ebp-0x20],0x7a69
0x0804841c <+24>: mov BYTE PTR [ebp-0x16],0x41
=> 0x08048420 <+28>: mov DWORD PTR [ebp-0x1c],0x5
0x08048427 <+35>: mov eax,DWORD PTR [ebp-0xc]
0x0804842a <+38>: xor eax,DWORD PTR gs:0x14
0x08048431 <+45>: je 0x8048438
0x08048433 <+47>: call 0x8048320 <__stack_chk_fail@plt>
0x08048438 <+52>: leave
0x08048439 <+53>: ret
据我所知,箭头后面的汇编指令对应a = 5;于测试函数中的C指令。所以地址[ebp-0x1c]应该代表变量的地址a。
但是[ebp-0x1c]代表0xbffff2bc的地址是 ,变量的地址a是0xbffff2e0。
我不明白这两个地址如何不同。这是gcc完成的某种优化吗?