函数调用约定

本文介绍了函数调用约定的三种主要方式:cdecl、stdcall和fastcall。cdecl是C语言的标准,调用者负责清理栈;stdcall常用于Win32 API,由被调用者清理栈;fastcall利用寄存器传递参数,提高调用速度。通过实例分析了每种约定在栈管理和效率上的特点。
摘要由CSDN通过智能技术生成

函数调用约定(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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值