x64编译环境下cpp函数与汇编函数互相调用

x64 编译环境下调用汇编函数和 x32 下是不一样的。接下来我们简明的讲解一下 x64 编译环境下,如何在 C++ 源文件中调用汇编函数,以及如何在汇编中调用 C++ 源文件中提供的函数和变量。

首先我们要设置一下汇编的环境,新建一个 x64 项目后,首先要右键项目 -> 生成依赖项 -> 生成自定义 -> 勾选 masm(.targets,.props),然后在源文件下新建一个 Asm.asm 汇编文件,右键属性设置为:

一、C++ 源文件中调用汇编函数

编写汇编文件,其中 .codeend 是必须的,不填写会报错,我们编写一个简单的加法函数 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

结果如下:

posted @ 2024-09-02 08:46  lostin9772  阅读(40)  评论(0)    收藏  举报