函数调用约定

函数调用约定(Calling Convention)是对函数调用时如何传递参数的一种约定。

函数调用完毕后,ESP寄存器的值需要恢复到函数调用之前的值,从而保证可引用的栈大小不会缩减。而函数调用约定就是解决函数调用后如何处理ESP的问题的。

1、cdecl

cdecl主要是C语言中使用的方式,调用者负责处理栈。

编写简易的代码如下:

#include "stdio.h"

int add(int a, int b){
	return (a + b);
}

int main(){
	return add(1, 2);
}

在编译生成exe文件前先关闭优化选项才能更好地适用栈帧:


选择Release,生成exe文件,用OllyDbg打开,拉到最上面即可看到主程序:


可以看到,011D101C地址处的“add esp 8”指令,该命令直接清理其压入栈中的两个函数参数(ESP加8即ESP向下移动两个位置,如下图所示,ESP以上位置的数据将被改写而不用特意去释放内存),这样的方式称为cdecl。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值