为什么编译器会减去ESP上的值

时间:2016-06-30 16:40:20

标签: gcc elf

看看这段代码我已经拆解了c程序的一个简单部分,用32位模式的gcc编译。 如您所见,编译器在ESP上减去8,然后减去0xC。推送在ESP上减去4个字节。因此,在printf调用之前,我们在堆栈上分配了24个字节。

  0x0804846e <+3>:  sub    esp,0x8
  0x08048471 <+6>:  sub    esp,0xc
  0x08048474 <+9>:  push   0x8048550
  0x08048479 <+14>: call   0x8048330 <printf@plt>
  0x0804847e <+19>: add    esp,0x10

但是,如果你看看printf调用,编译器只会增加16个字节。所以我认为有泄漏?

如果我想在汇编程序中自己写,我会写:

  0x08048474 <+9>:  push   0x8048550
  0x08048479 <+14>: call   0x8048330 <printf@plt>
  0x0804847e <+19>: add    esp,0x4
你认为我错了吗?如果没有局部变量,用sub esp在堆栈上分配数据的目的是什么?

1 个答案:

答案 0 :(得分:1)

  

如果没有局部变量,使用sub esp在堆栈上分配数据的目的是什么?

通常它是堆栈对齐:GCC不知道被调用例程是否使用需要对齐的SSE2指令,因此它将堆栈对齐到例程中的16个字节。

  

我认为有泄漏

最有可能没有。但是你没有展示整个反汇编,所以不可能说出来。