一个简单函数的反汇编分析

利用visual studio的反汇编功能,可以看到函数调用的汇编语言。



一个简单函数的反汇编分析

int __stdcall add(int a, int b, int c)

{

00FD13C0  push           ebp                            ebp入栈

00FD13C1  mov           ebp,esp                      esp赋值给ebp

00FD13C3  sub            esp,0C0h                    增加0c0h栈空间(栈空间地址向下增长)

00FD13C9  push          ebx                 

00FD13CA  push          esi  

00FD13CB  push          edi                               ebx,esi,edi先后入栈

00FD13CC  lea             edi,[ebp-0C0h]            ebp - 0c0h的值赋给edi

00FD13D2  mov          ecx,30h                      30h赋值给ecx

00FD13D7  mov          eax,0CCCCCCCCh      cccccccc赋值给eax

00FD13DC  rep stos    dword ptr es:[edi]        从edi开始给每个双字地址赋值为eax,重复ecx次


上面做的实际上是调用函数以及初始化这个函数的栈的准备工作

栈的空间为0c0h = 192 字节,ebp-0c0h实际上就是esp的地址了,即栈顶指针

ecx = 30h = 48,stos从这个栈顶位置开始给每个双字赋值0cccccccch,重复48次,注意stos重复的时候地址的增长方向

如果设置了direction flag, 那么edi会在该指令执行后减小, 如果没有设置direction flag, 那么edi的值会增加, 这是为了下一次的存储做准备.

48 * 4 刚好为192字节,即把整个栈空间初始化为0cccccccch


    return a + b + c;

00FD13DE  mov       eax,dword ptr [a]  

00FD13E1  add         eax,dword ptr [b]  

00FD13E4  add         eax,dword ptr [c]  

}

00FD13E7  pop        edi                

00FD13E8  pop        esi  

00FD13E9  pop        ebx                 edi,esi,ebx出栈,注意和入栈的顺序相反

00FD13EA  mov       esp,ebp           恢复esp

00FD13EC  pop        ebp                 

00FD13ED  ret         0Ch                 恢复栈指针 0ch即12,是3个int参数的栈空间占用,__stdcall调用约定规定函数自己恢复栈指针

最后一条指令相当于add esp,0Ch


如果将调用约定改成__fastcall可以观察到函数调用的地方有所改变

002E143E  push         3  

002E1440  mov         edx,2  

002E1445  mov         ecx,1  

002E144A  call           add (2E1131h) 

如上所示,在传递参数的时候用到了两个寄存器。这是__fastcall 和__stdcall的不同之处

同样,因为栈中只放了一个参数,所以__fastcall在函数返回之处 ret 4


对于__cdecl调用约定函数调用的反汇编如下:

000E142E  push        3  

000E1430  push        2  

000E1432  push        1  

000E1434  call          add (0E114Fh)  

000E1439  add         esp,0Ch 

很明显。与__stdcall相比他在调用add完了之后多了个add esp 0ch,还记得这个是啥吧?

也就是说__cdecl的栈需由调用者自己恢复。__fastcall和__stdcall则是被调用者恢复

你可能感兴趣的:(一个简单函数的反汇编分析)