无法理解函数的反汇编

时间:2016-02-06 11:15:09

标签: assembly x86 disassembly

我已经将以下简单功能拆解成了这个并且我没有理解一些事情。如果有人能帮助我,我会很高兴

这是我反汇编的功能:

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
  • 加载函数的局部变量时 (var_c,var_8,var_4)ESP指针减去10h,十进制16,我们的堆栈内存中的每个变量都是四个字节,我有三个局部变量 - 因此ESP指针应该被减去到12(0Ch),为什么它被16减去?

(。text:004013C1 sub esp,10h)

  • 在哪一点上保存了程序的返回地址?还有旧的ESP怎么样?什么时候保存?

1 个答案:

答案 0 :(得分:1)

sub     esp, 10h

我不会为此担心太多。虽然这些局部变量只需要12个字节,但编译器可能有理由始终以16个字节为单位进行分配。

  

在哪一点保存程序的返回地址?

这位于[ebp + 4]

  

那个老ESP怎么样?什么时候保存?

leave指令将EBP移动到ESP,从而恢复堆栈指针。

mov     [ebp+arg_0], eax
mov     eax, [ebp+arg_0]

我会更担心这些多余的代码。结果已经在EAX中。为什么要这样移动?