Calling Convention的总结
因为经常需要和不同的Calling Convention打交道,前段时间整理了一下它们之间的区别,如下:
|
清理堆栈 |
参数压栈顺序 |
命名规则 (MSVC++) |
备注 |
|
|
Cdecl |
调用者 (Caller) |
从右往左 |
FuncName |
因为是调用者清理Stack,因此允许变参 (如printf) |
|
Pascal |
被调用者 (Callee) |
从左往右 |
已不再支持 |
__pascal, __fortran, __syscall |
|
Stdcall |
被调用者 (Callee) |
从右往左 |
_FuncName@N N表示所有参数大小字节数,如4 |
一般在Windows API和COM中使用,也是.NET和Native代码调用的缺省Calling Convention。 顺便提一下,Windows中API的Calling Convention所使用到的WINAPI宏在PC机上是__stdcall,而在WinCE上则是__cdecl,并非一成不变。 |
|
Fastcall (Microsoft) |
被调用者 (Callee) |
从右往左 |
@FuncName@N N表示参数大小字节数,如4 |
和Stdcall类似,但是会选择两个从左往右数最先可以放在寄存器里面的参数放在ECX和EDX中 |
|
Thiscall (Microsoft) |
被调用者 (Callee) |
从右往左 |
编译器会将名字,类名,参数等编码到名字里面,具体方式和编译器相关,如: 如?Func@MyClass@@QAEXPAX@Z |
基本上等价stdcall, 除了this指针用ECX传递 |
稍微解释一下其中不是特别明显的几个列的意义:
|
列 |
解释 |
|
清理堆栈 |
调用函数的时候,一般的参数都被调用者压栈(除了需要用寄存器传递的参数除外)。问题在于,谁来清理调用者压入堆栈的参数内容,是调用者还是被调用者。清理的意义是将压入的参数退栈,从机器的角度来讲则是调整堆栈指针ESP。当调用者也负责清理栈的时候,由于调用者知道实际参数的个数,因此可以正确处理变参的情况(如printf),就算是压入的参数和所期望的参数不一致也不会造成栈的不平衡,这正是printf可以很容易直接传入不同参数,而Windows API必须显式传入va_list参数(如FormatMessage)来获得变参能力的原因。 |
|
压栈顺序 |
参数被压栈的时候,如果有多个参数,参数可以以从左往右依次压入的顺序压入,也可以以从右往左的顺序,不同的Calling Convention之间存在区别。 |
Calling Convention的总结的更多相关文章
- 从栈不平衡问题 理解 calling convention
最近在开发的过程中遇到了几个很诡异的问题,造成了栈不平衡从而导致程序崩溃. 经过几经排查发现是和调用规约(calling convention)相关的问题,特此分享出来. 首先,讲一下什么是调用规约. ...
- C&C++ Calling Convention
tkorays(tkorays@hotmail.com) 调用约定(Calling Convention) 是计算机编程中一个比较底层的设计,它主要涉及: 函数参数通过寄存器传递还是栈? 函数参数从左 ...
- X86调用约定 calling convention
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling con ...
- C/C++:函数的调用约定(Calling Convention)和名称修饰(Decorated Name)以及两者不匹配引起的问题
转自:http://blog.csdn.net/zskof/article/details/3475182 注:C++有着与C不同的名称修饰,主要是为了解决重载(overload):调用约定则影响函数 ...
- function calling convention
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=31 February 19, 2013 function calling c ...
- 调用惯例Calling Convention (或者说:调用约定)
调用惯例影响执行效率,参数的传递方式以及栈清除的方式. 调用惯例 参数传递顺序 谁负责清除参数 参数是否使用暂存器 register 从左到右 被调用者 是 pascal 从左到右 被调用者 否 ...
- JAVA calling convention
http://stackoverflow.com/questions/28126082/where-does-the-jit-compiled-code-reside https://wiki.ope ...
- ARM 调用约定 calling convention
int bar( int a, int b, int c, int d, int e, int f, int g ) { ]; array2[ ] = a + b; array2[ ] = b + c ...
- sparc v8 stack frame calling convention
main.c ; int main() { int a, b; int sum; a = ; b = ; sum = add(a, b); ; } int add(int a, int b) { in ...
随机推荐
- MySql指令大全(转载)
1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...
- Jwt在javaweb项目中的应用核心步骤解读
1.引入jwt依赖 <!--引入JWT依赖,由于是基于Java,所以需要的是java-jwt--> <dependency> <groupId>io.jsonweb ...
- 170404、java版ftp操作工具类
package com.rick.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...
- 160524、Linux下如何启动、关闭Oracle以及打开关闭监听
1. linux下启动oraclesu - oraclesqlplus /nologconn /as sysdbastartupexitlsnrctl startexit2. linux下关闭orac ...
- Exchange Management Console Error
Exchange 2010 error solved : The WS-Management service cannot process the request. The system load q ...
- UITextView 的 return响应事件
在UITextView里没有UITextField里的- (BOOL)textFieldShouldReturn:(UITextField *)textField;直接的响应事件;那么在TextVie ...
- 用Nginx反向代理Node.js
安装pm2 npm install pm2 -g ln -s /home/download/node-v8.11.1-linux-x64/lib/node_modules/pm2/bin/pm2 /u ...
- MapReduce小文件优化与分区
一.小文件优化 1.Mapper类 package com.css.combine; import java.io.IOException; import org.apache.hadoop.io.I ...
- 转载:futex同步机制详解
在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序", ...
- Java-小技巧-004-jdk时间,jdk8时间,joda,calendar,获取当前时间前一周、前一月、前一年的时间
1.推荐使用java8 localdate等 线程安全 支持较好 地址 2.joda 一.简述 查看SampleDateFormat源码,叙述有: * Date formats are not syn ...