调用约定
调用约定 | 传参方式 | 平衡栈 |
---|---|---|
cdecl(c语言调用约定) | 从右向左 | 调用者平衡堆栈,add esp,xx方式平衡 |
stdcall(标准调用约定) | 从右向左 | 被调用者平衡堆栈,ret xx方式平衡 |
fastcall(快速调用约定) | 前两个参数使用ecx,edx传递,后续参数从右向左依次入栈 | 被调用者平衡,ret xx方式 |
thiscall(对象调用约定) | 通过ecx保存this指针,参数从右向左依次入栈 | 被调用者平衡,ret xx方式 |
三大结构
顺序结构
…
选择结构
- if … else if … else (c)
1 | int nDay=0; |
汇编
1 | .386 |
switch … case
1 | int nDay=0; |
汇编(跳转表)
1 | .386 |
循环结构
- while
1 | int i=0; |
汇编
1 | .386 |
- do … while
1 | int i=0; |
汇编
1 | .386 |
- for
1 | for(int i=0 ; i<100 ; i++){ |
for循环同while循环
函数栈帧
1 | fun proc |
x64堆栈分配
内联汇编
32位
1 | int n=0; |
混合编程
64位
.cpp
1 | #include <stdio.h> |
.asm
1 | .code |
裸函数
对于使用 naked 特性声明的函数,编译器将生成编码,而无需 prolog 和 epilog 代码。 可以使用此功能来编写使用汇编程序代码的您自己的 prolog/epilog 代码顺序。 裸函数尤为用在编写虚拟设备驱动程序。请注意 naked 特性仅适用于 x86和ARM,并不用于 x64 。
备注
由于 naked 属性仅与函数定义相关且不是类型修饰符,因此裸函数必须使用扩展属性语法和 __declspec 关键字。
该编译器无法生成具有 naked 特性的内联函数,即使该函数也标有 __forceinline 关键字。
如果 naked 特性应用于任何非成员方法定义,该编译器会释放一个错误。
此代码用 naked 特性定义了函数:
1 | __declspec( naked ) int func( formal_parameters ) {} |
或者
1 | #define Naked __declspec( naked ) |
1 | void __declspec(naked) main() |