Assembly 无法理解函数的反汇编

Assembly 无法理解函数的反汇编,assembly,x86,disassembly,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); } 我使用以下参数从主函数调用它: foo(2,3,4); 这就是功能分解成的: .text:004013BE ; _DWOR

我已经将下面的简单函数分解成这个函数,但有几点我不理解。如果人们能帮助我,我会很高兴的

这是我正在分解的函数:

int foo(int a, int b, int c){

    int t = 4;
    int t2 = 5;
    int t6 = 6;

    t = b;
    t2 = c;


    return (a *= t6);   
}
我使用以下参数从主函数调用它:

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指针被减10小时,十进制16,堆栈内存中的每个变量都是四个字节,我有三个局部变量-因此ESP指针应该被减12(0Ch),为什么它会被减16
(.text:004013C1子esp,10h)

  • 程序的返回地址保存在哪一点?旧的ESP如何?何时保存
我不太担心这个。虽然这些局部变量只需要12个字节,但编译器可能有理由总是以16个字节的步长进行分配

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

这位于[ebp+4]

旧ESP呢?什么时候保存

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



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

代码段是正确的,一个4字节的变量从0读到3,所以最后一个变量从0H读到10h。这仍然是不正确的,因为在堆栈帧的开头,ebp和esp指向同一地址,例如,假设adress是0x48h,当堆栈向下移动时,第一个变量将是0x48h(0x48h到0x44h)第二个变量将是(0x44h到0x40h)第三个变量将是(0x40h到0x3Ch)。从(0x3Ch到0x38h)会发生什么?您忘记了返回地址位于堆栈顶部aka
[esp]
。同样,这仍然没有意义,因为返回地址位于EBP之上(位于当前EBP上方的上一个基准指针上方)我同意,但这是编译器的体系结构。不幸的是,我不明白,在分解了许多类似的程序之后,我明白了这确实是分配给当前堆栈帧的内存的一部分,无论如何,这实际上可以用作安全cookie,不确定。
sub     esp, 10h
mov     [ebp+arg_0], eax
mov     eax, [ebp+arg_0]