为什么编译器在 ESP 上减去值

why does the compiler subtract value on ESP

看看这段代码我反汇编了一个c程序的简单部分,用gcc在32位模式下编译。 如您所见,编译器在 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 在堆栈上分配数据的目标是什么?

What is the goal of allocating data on stack with sub esp if there is no local variable ?

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

i think there is a leak

很可能没有。但是你没有展示整个反汇编,所以无法判断。