x64编译环境下cpp函数与汇编函数互相调用
x64 编译环境下调用汇编函数和 x32 下是不一样的。接下来我们简明的讲解一下 x64 编译环境下,如何在 C++ 源文件中调用汇编函数,以及如何在汇编中调用 C++ 源文件中提供的函数和变量。
首先我们要设置一下汇编的环境,新建一个 x64 项目后,首先要右键项目 -> 生成依赖项 -> 生成自定义 -> 勾选 masm(.targets,.props),然后在源文件下新建一个 Asm.asm 汇编文件,右键属性设置为:

一、C++ 源文件中调用汇编函数
编写汇编文件,其中 .code 和 end 是必须的,不填写会报错,我们编写一个简单的加法函数 Asm_add:
.code
Asm_add proc
sub rsp,100h
mov rax,rcx
add rax,rdx
add rsp,100h
ret
Asm_add endp
end
最后我们在需要引用的源文件中声明该汇编函数就可以调用了:
#include <stdio.h>
#include <Windows.h>
extern "C" int Asm_add(int a, int b);
int main()
{
printf("Asm_add 的结果:%d\r\n", Asm_add(1, 2));
system("pause");
return 0;
}
结果如下:

二、汇编文件中调用 C++ 源文件提供的函数和变量
首先我们需要在 C++ 源文件中定义需要被调用的函数和被引用的全局变量:
#include <stdio.h>
#include <Windows.h>
extern "C" int __stdcall Asm_add(int a, int b);
extern "C" int var = 100; // 定义一个用于汇编引用的全局变量
int main()
{
printf("Asm_add 的结果:%d\r\n", Asm_add(1, 2));
system("pause");
return 0;
}
// 定义一个用于汇编调用的函数
extern "C" void __stdcall func()
{
int a = 1, b = 2;
printf("调用了 cpp 函数,a=1,b=2,a+b的结果为:%d\r\n", a + b);
}
然后在汇编中调用和引用即可:
extern var : far
extern func : proc ; 这里用 far 代替 proc 也可以,表示一个指针
.code
Asm_add proc
sub rsp,100h
mov rax,qword ptr [var] ;汇编中使用 cpp 中的全局变量
add rax,rcx
add rax,rdx
push rax ; func 函数的返回值会改变 rax 的值,先保存
call func ; 汇编中调用 cpp 函数
pop rax
add rsp,100h
ret
Asm_add endp
end
结果如下:


浙公网安备 33010602011771号