我已经将以下简单功能拆解成了这个并且我没有理解一些事情。如果有人能帮助我,我会很高兴
这是我反汇编的功能:
int foo(int a, int b, int c){
int t = 4;
int t2 = 5;
int t6 = 6;
t = b;
t2 = c;
return (a *= t6);
}
我使用以下参数从main函数调用它:
foo(2,3,4);
这就是函数被反汇编的内容:
.text:004013BE ; _DWORD __cdecl foo(int, int, int)
.text:004013BE public __Z3fooiii
.text:004013BE __Z3fooiii proc near ; CODE XREF: _main+2Dp
.text:004013BE ; _main+5Cp
.text:004013BE
.text:004013BE var_C = dword ptr -0Ch
.text:004013BE var_8 = dword ptr -8
.text:004013BE var_4 = dword ptr -4
.text:004013BE arg_0 = dword ptr 8
.text:004013BE arg_4 = dword ptr 0Ch
.text:004013BE arg_8 = dword ptr 10h
.text:004013BE
.text:004013BE push ebp
.text:004013BF mov ebp, esp
.text:004013C1 sub esp, 10h
.text:004013C4 mov [ebp+var_4], 4
.text:004013CB mov [ebp+var_8], 5
.text:004013D2 mov [ebp+var_C], 6
.text:004013D9 mov eax, [ebp+arg_4]
.text:004013DC mov [ebp+var_4], eax
.text:004013DF mov eax, [ebp+arg_8]
.text:004013E2 mov [ebp+var_8], eax
.text:004013E5 mov eax, [ebp+arg_0]
.text:004013E8 imul eax, [ebp+var_C]
.text:004013EC mov [ebp+arg_0], eax
.text:004013EF mov eax, [ebp+arg_0]
.text:004013F2 leave
.text:004013F3 retn
.text:004013F3 __Z3fooiii endp
(。text:004013C1 sub esp,10h)
答案 0 :(得分:1)
sub esp, 10h
我不会为此担心太多。虽然这些局部变量只需要12个字节,但编译器可能有理由始终以16个字节为单位进行分配。
在哪一点保存程序的返回地址?
这位于[ebp + 4]
那个老ESP怎么样?什么时候保存?
leave
指令将EBP
移动到ESP
,从而恢复堆栈指针。
mov [ebp+arg_0], eax
mov eax, [ebp+arg_0]
我会更担心这些多余的代码。结果已经在EAX
中。为什么要这样移动?