函数约定调用
来源:互联网 发布:淘宝二手店铺怎么开 编辑:程序博客网 时间:2024/06/04 23:21
函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理
常见的函数调用约定:stdcall cdecl fastcall thiscall naked call
__cdecl
调用方
推入堆栈的参数,按相反的顺序 (从右向左)
__clrcall
无
按顺序加载在 CLR 表达式堆栈上的参数 (从左到右)。
__stdcall
被调用方
推入堆栈的参数,按相反的顺序 (从右向左)
__fastcall
被调用方
存储在注册,然后被推入堆栈
__thiscall
被调用方
推入堆栈;在 ECX 存储的 这 指针
着重讲一下stdcall cdecl fastcall,
stdcall 与cdecl有相同的参数传递顺序 ,参数从右向左压入堆栈,不同的是清理堆栈工作由谁完成。stdcall由调用的子函数完成,cdecl由调用的函数完成。
VC中 C/C++ 默认调用约定是cdecl.
上代码,如下。
#include <stdio.h>//__fastcall 调用int __fastcall sum_fas(int a, int b, int c){ return (a + b + c); } //__stdcall 调用 int __stdcall sum_std(int a, int b, int c){ return (a + b + c); } //__cdecl 调用int __cdecl sum_cde(int a, int b, int c){ return (a + b + c); } //VC中 C/C++ 默认调用int sum (int a, int b, int c){ return (a + b + c); } int main() { int c1,c2,c3,c4; c1 = sum_fas(2, 3, 5); c2 = sum_std(2, 3, 5); c3 = sum_cde(2, 3, 5); c4 = sum(2,3,5); return 0; }
汇编代码:
int main() { 011D1500 push ebp 011D1501 mov ebp,esp 011D1503 sub esp,0F0h 011D1509 push ebx 011D150A push esi 011D150B push edi 011D150C lea edi,[ebp-0F0h] 011D1512 mov ecx,3Ch 011D1517 mov eax,0CCCCCCCCh 011D151C rep stos dword ptr es:[edi] int c1,c2,c3,c4; c1 = sum_fas(2, 3, 5);011D151E push 5 011D1520 mov edx,3 011D1525 mov ecx,2 011D152A call sum_fas (011D1037h) 011D152F mov dword ptr [c1],eax c2 = sum_std(2, 3, 5);011D1532 push 5 011D1534 push 3 011D1536 push 2 011D1538 call sum_std (011D10E6h) 011D153D mov dword ptr [c2],eax c3 = sum_cde(2, 3, 5);011D1540 push 5 011D1542 push 3 011D1544 push 2 011D1546 call sum_cde (011D10B4h) 011D154B add esp,0Ch 011D154E mov dword ptr [c3],eax c4 = sum(2,3,5);011D1551 push 5 011D1553 push 3 011D1555 push 2 011D1557 call sum (011D1113h) 011D155C add esp,0Ch 011D155F mov dword ptr [c4],eax return 0;011D1562 xor eax,eax }参考:http://technet.microsoft.com/zh-cn/interopmigration/984x0h58
- 函数调用约定
- 函数调用约定
- 函数调用约定
- 论函数调用约定
- 函数调用约定解析
- 论函数调用约定
- 函数调用约定
- 函数调用约定
- 论函数调用约定
- 函数调用约定解析
- 函数调用约定
- 函数调用约定
- 论函数调用约定
- 函数调用约定
- 论函数调用约定
- 论函数调用约定
- 函数调用约定
- 论函数调用约定()
- Oracle 联合索引
- NS2的安装方法
- UNIX网络编程编译环境配置方法
- C++至今不可替代
- 去除输入字符串中的多余空格
- 函数约定调用
- 内核中如何实现周期性的任务执行
- Delphi对Windows通知栏图标编程示例
- Cocos2d-x学习(二十一):cocos2d-x引擎结构
- 杭电 ACM 1.3.7
- nand ubi -1 nand基础
- request getHeader
- linux下之定时器timer实例
- shell命令学习