汇编学习(4)函数调用

菜鸡刚学汇编,总结下。哪里有错误欢迎指出。

函数调用一般有个模板。

push ebp
mov ebp,esp
//这里提升堆栈
sub esp,0x40  
//这里是开辟缓冲区,不同编译器开辟的缓冲区大小不同。
push edi
push esi
push ebx
//保留现场
lea edi, dword ptr ss:[ebp-0x40]
mov ecx,0x10
mov eax,0xcccccccc
rep stos dowrd ptr es:[edi]
//填充缓冲区
----------------
这里是写函数的功能
----------------
    pop ebx
    pop esi
    pop edi
    //恢复现场
    mov esp,ebp
    pop ebp
    ret

执行完上面代码,堆栈图差不多就是这个样子,(该图,下面是高址,上面是低址)
中间的ccc…就是填充缓冲区。填充后可以用来写入局部变量。
EBP后面的高址,存有恢复用的EIP,和call函数前push的参数。
EBP前面的低址,用来存局部变量。
在这里插入图片描述


根据函数调用约定的不同,堆栈平衡的方式不同
如果是__cedcl约定,是在母函数中平衡堆栈,就是函数调用完返回后,在调用者里add esp,xx来平衡堆栈。

有几种函数调用约定,不同的调用约定,参数的传递,堆栈的平衡方式不同。下面是三种常见的调用约定:
__cedcl 约定
参数从右往左,依次入栈。堆栈平衡在母函数中完成。
在函数调用前,将参数压栈。
push xxx
push xxx

然后call 函数。
//函数执行完毕
add esp ,xx
//在母函数中平衡堆栈

stdcall 约定
参数从右往左依次入栈,在子函数中 平衡堆栈。
参数还是在调用前push 入栈。
平衡堆栈时,在 ret 后加个 xx 恢复堆栈
例如 ret 0x8,相当于 pop eip add esp,0x8

fastcall 约定
参数从右往左依次入栈,在子函数中 平衡堆栈
参数1个或者两个用 寄存器 传参,多于两个,多余两个的部分还是压栈传参。
例如 (int a,int b,int c)
push c
mov eax,b
mov ecx,a
然后再call 函数,最后在子函数中平衡堆栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值