为什么编译器在 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
很可能没有。但是你没有展示整个反汇编,所以无法判断。
看看这段代码我反汇编了一个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
很可能没有。但是你没有展示整个反汇编,所以无法判断。