汇编使用特性小讲解
2018-10-11 本文已影响0人
MagicalGuy
// 01调用约定.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//1.c调用方式 :从右到左入栈,函数外部平衡堆栈
int _cdecl fun_cdecl(int a,int b)
{
return a + b;
}
//2.stdcall windowsAPI调用约定 :从右到左入栈,函数内部平衡堆栈 : ret 8
int _stdcall fun_stdcall(int a, int b)
{
return a + b;
}
//3.fastcall快速调用约定 :从右到左入栈,函数内部平衡堆栈
int _fastcall fun_fastcall(int a, int b,int c,int d )
{
return a + b+c+d;
}
//4.this c++调用约定 从右到左入栈,函数内部平衡堆栈
class OBJ {
public:
int fun_thiscall(int a, int b, int c, int d)
{
return a + b + c + d;
}
int m_number;
};
int main()
{
//1.c调用方式
//fun_cdecl(1, 2);
//2.stdcall windowsAPI调用约定
//fun_stdcall(1, 2);
//3.fastcall快速调用约定
//fun_fastcall(1, 2,3,4);
//4.this c++调用约定
OBJ obj;
obj.fun_thiscall(1, 2, 3, 4);
return 0;
}
================
// 02x64汇编.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//x64函数调用
long long fun(long long a, long long b, long long c, long long d, long long x)
{
return a + b + c + d + x;
}
int main()
{
//64位调用
fun(0x1, 0x2, 0x3, 0x4, 0x5);
return 0;
}
==================
// 03裸函数.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//裸函数 编译器不做任何优化
void _declspec(naked) fun1()
{
_asm mov eax,99
_asm ret
}
//普通函数
void fun2()
{
//会添加开辟栈帧
}
int main()
{
//1.裸函数函数调用
fun1();
//2.普通属性
fun2();
return 0;
}
===================
// 04x64混合编程.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//声明函数
extern "C" long add_fun(int a, int c);
int main()
{
//调用汇编函数
int a =add_fun(5, 6);
return 0;
}
asmfun.asm
.code
;加法操作 rcx:参数1,rdx:参数2
add_fun proc
xor rax,rax
mov rax,rcx
add rax,rdx
ret
add_fun endp
end
X64混合编程
1.设置VS的编译环境为X64
2.添加一个.asm的文件
3.设置项目属性
4.设置文件属性
image.png image.png
5.在asm中编写汇编代码
image.png6.在源文件中声明外部函数
// 声明一个外部函数,来自其它文件
// extern"C" 防止C++的名称粉碎机制,被c++名称粉碎机制糟蹋后
// 链接器就会报无法解析的外部符号的错误。
// 因为.asm文件的函数名没有经过名称粉碎机制
extern"C" int Max( int left , int right );