调用约定 C++对照及汇编详解
来源:互联网 发布:dhcp 端口 67 68 编辑:程序博客网 时间:2024/06/07 13:10
_cdecl(C declration)是C语言函数的默认调用约定规则,也是VS编译器函数默认的调用约定规则,参数从右到左依次push入栈。需要调用者手动平衡栈。使用__cdecl编定规则之后,传递了多少参数和什么类型的参数,被调用者都不会知道,即使不同参数个数和类型都不会产生编译期的错误(PS:以上是指C代码中,C++因为函数名与参数直接关联,所以在编译期是会产生错误)
C++及汇编解析
声明:void __cdecl test(int p1, int p2, int p3)
调用:test(1,2,3)
push 3
push 2
push 1 ;从右到左依次入栈
call test
add esp, 0ch ; 调数外手动平衡栈, 3个参数size为12即0x0c
__stdcall(standard call)是C++的标准调用约定规则,参数也是从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。与__cdecl不同的是调用者必需严格遵守参数个数,否则编译期将产生错误。并且栈平衡是在被调用者函数中通过ret指令来平衡栈指针的。
声明:void __stdcall test(int p1, int p2, int p3)
调用:test(1,2,3)
push 3
push 2
push 1; 从右到左依次入栈
call test
; PS: 与__cdecl不同的是少了add esp, 0ch, 因为栈已经在test里面通过ret 0ch 平衡
__fastcall(fast call)是编译器指定的快速调用约定规则。优点是在参数个数较少时,通过寄存器参数传递的方式代替栈参数传递,提高调用的效率。一般fallcall的调用约定规则是将前两个(个数由编译器确定)参数由寄存器传递,其它基本参数还是使用栈指针的方式,和__stdcall 相似
声明:void __fastcall test(int p1, int p2, int p3, int p4)
调用:test(1,2,3,4)
push 4
push 3 ;与__stdcall相似
mov edx,2
mov ecx,1 ;前两个参数通过寄存器传递
call test ;栈平衡在test里面平衡
- 调用约定 C++对照及汇编详解
- 汇编中的调用约定
- C/C++函数调用约定详解
- 从汇编角度查看C语言函数调用约定
- C6000嵌入汇编C与汇编对照及功能说明
- C6000嵌入汇编C与汇编对照及功能说明
- C6000嵌入汇编C与汇编对照及功能说明
- C6000嵌入汇编C与汇编对照及功能说明
- 反汇编时的函数识别及各函数调用约定的汇编代码分析
- 反汇编时的函数识别及各函数调用约定的汇编代码分析
- Win32调用约定详解
- C 调用约定和 C++调用约定
- C函数调用约定
- c调用约定
- C/C++调用约定
- C调用约定
- C/C++调用约定
- c/c++调用约定
- Lesson 16 线程同步与异步套接字
- 最大公约数和最小公倍数求法总结
- 关于sqlserver和ORACLE之间数据交换的问题
- .Net 常用中间件积累
- .net获取域名
- 调用约定 C++对照及汇编详解
- 普通的get和set
- springMVC多视图解析器
- 数据库与java类型映射
- Lesson17进程间通信
- JDBC - executeQuery、executeUpdate 和 execute
- iOS 数据持久化 NSUserDefault 的使用 NSUserDefaults读取和写入自定义对象
- 转载:SSH下mysql中文乱码问题
- 交换机的端口工作模式