在64位系统中,不能使用_asm在.cpp或.c文件中直接编写内联汇编了,需要把汇编代码编写到.asm文件中,当.cpp或.c文件需要调用时再声明。
一、简单调用.asm文件中的汇编函数
1、创建空项目,在源文件中新建myAdd.asm文件,编写汇编代码。
.CODE
myAdd PROC
add rcx,rdx
mov rax,rcx
ret
myAdd ENDPEND
rcx,rdx中存放的是函数参数。
在x86-64架构的调用约定中,前四个整型参数会分别通过寄存器RCX、RDX、R8和R9来传递。
2、修改myAdd.asm文件的属性。
命令行:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm
输出:$(IntDir)%(fileName).obj
3、在需要引入汇编子程序的.cpp文件中声明函数。
#include<Windows.h>
EXTERN_C DWORD myAdd(DWORD u1, DWORD u2);
4、注意!!!项目需要x64环境。
5、编写测试程序,运行。
二、在汇编函数中调用另一个汇编函数
1、在源文件中新建myAddOne.asm文件。
.CODE
myAddOne PROC
add rcx, 1
mov rax, rcx
ret
myAddOne ENDPEND
2、修改myAddOne.asm文件属性(同上)。
3、修改myAdd.asm代码,在相加后调用myAddOne函数。
EXTERN myAddOne:PROC ;引用外部函数
.CODE
myAdd PROC
add rcx,rdx
call myAddOne
mov rax,rcx
ret
myAdd ENDP
END
4、运行测试。
三、总结
命令行:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm
输出:$(IntDir)%(fileName).obj
引入外部函数(c):EXTERN_C DWORD myAdd(DWORD u1, DWORD u2);
引入外部函数(asm):EXTERN myAddOne:PROC