__cdecl & __stdcall calling conventions
2024-09-06 02:26:47
(一) __cdecl: c declaration
C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。C/C++默认的调用方式,可用于函数参数不确定的情况下。
1. 被调用函数代码及反汇编:
int _cdecl fun(int arg){//被调用者 return arg+1;
} push ebp
mov ebp, esp
¦ ¦
mov esp, ebp
pop ebp
retn ;被调用者不清除参数
fun endp
2.调用代码及反汇编:
int main(int argc, char* argv[],int _version)//调用者
{
int _a=208;
_a=fun(_a);//调用
std::cout<<_a<<std::endl;
return 0;
} var_4= dword ptr -4 ;变量_a的地址偏移量 ¦ ¦ rep stosd
mov [ebp+var_4], 0D0h
mov eax, [ebp+var_4]
push eax ;实参_a压栈
call j_fun ;调用函数fun(_a)
add esp, 4 ;调用者main函数清除实参_a,恢复栈
(二) __stdcall: standard calling
参数从右向左通过堆栈传递的, 函数调用在返回前要由被调用者清理堆栈。
1. 被调用函数代码及反汇编:
int __stdcall fun(int arg){//被调用者 return arg+1;
} push ebp
mov ebp, esp
¦ ¦
mov esp, ebp
pop ebp
retn 4;被调用者清除参数。对比上述。
fun endp
2.调用代码及反汇编:
int main(int argc, char* argv[],int _version)//调用者
{
int _a=208;
_a=fun(_a);//调用
std::cout<<_a<<std::endl;
return 0;
} var_4= dword ptr -4 ;变量_a的地址偏移量 ¦ ¦ rep stosd
mov [ebp+var_4], 0D0h
mov eax, [ebp+var_4]
push eax ;实参_a压栈
call j_fun ;调用函数fun(_a) ;调用者不恢复栈
¦ ¦
最新文章
- ACEXML解析XML文件&mdash;&mdash;我是如何学习并在短时间内掌握一个库的使用方法的
- IIS mime类型 任意类型
- 【6_100】Same Tree
- bzoj1040
- Quartz实现定时任务的配置方法
- 不可或缺的企业OA面临问题,以及解决建议 软件定制开发 森普演示平台
- Qt控件精讲一:按钮
- POJ 2777 Count Color(线段树+位运算)
- 根据相同的字段创建或者修改一个Model
- 高效判断奇偶性,利用位运算符&;
- c语言中的文件格式化读写函数fscanf和fprintf函数
- 笔记:Maven 下载和安装
- 安卓高级6 玩转AppBarLayout,更酷炫的顶部栏 Toolbar
- maven入门 (二)_私服安装与上传下载
- 机器学习web服务化实战:一次吐血的服务化之路
- 获取windows凭证管理器明文密码
- [图文教程]VS2017搭建opencv &; C++ 开发环境
- 为已经存在的本地项目添加git,以及从远程仓库拉取代码并切换远程分支
- centos7 安装docker-ce ,最新版本docker,docker阿里云加速
- Windows10系统tensorflow-gpu安装
热门文章
- eclipse中web项目部署到本地tomcat中,但是在本地的tomcat的webapp下找不到发布的项目
- springboot项目支持war部署tomcat
- Rem是什么,牛逼的Vue,Epub竟然可以实现阅读器功能。太牛了。
- Ngnix学习笔记
- Spring Boot入门——JDBCTemplate使用及其相关问题解决
- PyCharm 的初始设置1
- SQL授权语句(MySQL基本语句)
- php/oracle: 解析oracle表中的NCLOB,CLOB字段里面的内容
- Asp.net 检测到有潜在危险的 Request.From值
- Amazon EMR(Elastic MapReduce):亚马逊Hadoop托管服务运行架构&;Hadoop云服务之战:微软vs.亚马逊