c调用函数对应的汇编语言的基本格式

 以下面这个代码为例:

#include
void plus()
{
}
int main()
{
	plus();
	return 0;
}

 这块代码对应的汇编代码如下:

//传入参数,压入堆栈,参数倒着传进去,没有参数的可以省略这步,这里就不要传入
push
//call 地址,找到函数的地址
call        plus(012F10D2h)
//jmp 地址,跳转到函数运行地址
jmp         plus(012F16F0h)
//保留调用前的栈底,提升堆栈,分配缓冲区存储临时变量
push        ebp
mov         ebp, esp
sub         esp, 0C0h
//保留现场
push        ebx
push        esi
push        edi
//填充缓冲区
lea         edi, [ebp - 0C0h]
mov         ecx, 30h
mov         eax, 0CCCCCCCCh
rep stos    dword ptr es : [edi]
//函数核心功能

//恢复现场
pop         edi
pop         esi
pop         ebx
//降低堆栈
add         esp, 0C0h
mov         esp, ebp
pop         ebp
//返回call下一条地址
ret
//如果传入参数,而且是外平栈
add         esp, (参数个数*4)

外平栈和内平栈的几种情况

调用约定 参数压栈顺序 平衡堆栈
__cdecl 从右至左入栈 调用者清理栈(外平栈)
__stdcall 从右至左入栈 自身清理堆栈(内平栈)
__fastcall ECX/EDX传送前两个剩下:从右至左入栈 自身清理堆栈

最后__fastcall这种约定内平栈和外平栈都有可能

 

你可能感兴趣的:(逆向,汇编)