我并没有低估为什么以这种方式传递 printf 的参数。mov [esp+20h+var_1C], eax mov [esp+20h+Format], offset Format ; “%d”
为什么 esp 加上 20h 然后减去 20h 并且 esp 不添加指向局部变量的下一个堆栈位置?
为什么编译器根本没有生成这样的代码:move eax, var_4 push eax move eax, Format push eax call printf
我很高兴你们中的一些人可以解释如何用这个自定义 mov 代替推送。
这是c中的源代码:
#include <stdio.h>
int main(void)
{
int a;
int b = 5;
printf("%d", b);
return 0;
}
这是拆卸:
; Attributes: bp-based frame
; int __cdecl main(int argc, const char **argv, const char **envp)
public _main
_main proc near
Format= dword ptr -20h
var_1C= dword ptr -1Ch
var_4= dword ptr -4
argc= dword ptr 8
argv= dword ptr 0Ch
envp= dword ptr 10h
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 20h
call ___main
mov [esp+20h+var_4], 5
mov eax, [esp+20h+var_4]
mov [esp+20h+var_1C], eax
mov [esp+20h+Format], offset Format ; "%d"
call _printf
mov eax, 0
leave
retn
_main endp