__cdecl & __stdcall calling conventions
(一) __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) ;调用者不恢复栈
¦ ¦
__cdecl & __stdcall calling conventions的更多相关文章
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别 首先,__thiscall是关于类的一种调用方式,它与其他调用方式的最大区别是: __thiscall ...
- __cdecl __stdcall __fastcall之函数调用约定讲解
首先讲解一下栈帧的概念: 从逻辑上讲,栈帧就是一个函数执行的环境:函数参数.函数的局部变量.函数执行完后返回到哪里等等. 实现上有硬件方式和软件方式(有些体系不支持硬件栈) 首先应该明白,栈是从高地址 ...
- __declspec,__cdecl,__stdcall区别和作用
_cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的 顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...
- __declspec,__cdecl,__stdcall都是什么意思?有什么作用?
__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...
- __cdecl,__stdcall,__fastcall,__pascal,__thiscall 的区别
关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解. microsoft的vc默认的是__cdecl方式,而windo ...
- 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解. microsoft的vc默认的是__cdecl方式,而windo ...
- [转]ARM64 Function Calling Conventions
from apple In general, iOS adheres to the generic ABI specified by ARM for the ARM64 architecture. H ...
- __cdecl、__stdcall、__fastcall、thiscall 进栈、出栈区别
https://en.wikipedia.org/wiki/X86_calling_conventions https://msdn.microsoft.com/en-us/library/984x0 ...
- __stdcall,__cdecl,_cdecl,_stdcall,。__fastcall,_fastcall 区别简介
1. 今天写线程函数时,发现msdn中对ThreadProc的定义有要求:DWORD WINAPI ThreadProc(LPVOID lpParameter); 不解为什么要用WINAPI宏定义,查 ...
随机推荐
- Eclipse开发快捷键精选
1.alt+?或alt+/:自动补全代码或者提示代码2.ctrl+o:快速outline视图3.ctrl+shift+r:打开资源列表4.ctrl+shift+f:格式化代码5.ctrl+e:快速转换 ...
- Sublime 输入中文显示方框问号乱码
最近使用的sublime 编辑器出现了打开写好的程序,中文显示的确是方框,方框里面是问号,就是不显示中文. 然后再网上查找了一下,大概都是说是需要中文编码插件,比如converttoutf8 ...
- 【bzoj1318】[Spoj744] Longest Permutation(乱搞)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1318 这道题的大意是要求一个长度为len,并包含1~len所有数,并使len最大的子区 ...
- 一个简单的Javascript闭包示例
//=====用闭包实现函数的Curry化===== //数字求和函数的函数生成器 function addGenerator( num ){ //返回一个简单的匿名函数,求两个数的和,其中第一个数字 ...
- js替换字符串中的数字或非数字
替换字符串中的数字 var text = "abc123"; text=text.replace(/[0-9]/ig,""); 此时得到的text为" ...
- Maven——安装配置
MAVEN 一.介绍:(待填) 二.下载:http://maven.apache.org/download.cgi(官网下载) 选择二进制的zip文件,这种的可直接使用. 三.环境配置 1.前提条件: ...
- Git--之本地仓库
VCS的历史 : Git是一款代码管理工具(Version Control System),傲视群雄,是目前世界上最先进的免费开源的分布式版本控制系统,没有之一! VCS版本控制系统(version ...
- myeclipse2017复制项目后如何改web context root
点中项目,然后alt+enter,或者 然后
- 分享知识-快乐自己:HttpClient 访问 WebService 开放接口
HttpClient: 场景需求如下: 1.项目中需要与一个基于HTTP协议的第三方的接口进行对接 2.项目中需要动态的调用WebService服务(不生成本地源码) 3.项目中需要利用其它网站的相关 ...
- Tomcat翻译--JNDI Resources HOW-TO
原文:http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html Introduction(介绍) Tomcat provide ...