vs开发64位程序无法使用内联汇编,如果一定要使用汇编,需要将汇编放到一个单独文件中编译链接。

具体步骤如下:

  1. vs工程下新建或者导入已有的汇编源文件。以asm.asm为例,以下是模板:

;64位汇编程序模板 (Template)
;声明一个ExitProcess函数
ExitProcess PROTO

.data
	;在这里声明变量

.code 
myAsmTest PROC
	;这里写自己的代码
	
	mov rcx,0
	call ExitProcess
myAsmTest ENDP
END
  1. 在asm.asm文件上右键,在弹出菜单中点击“属性”,然后点击“常规”,“从生成中排除”点击“”, “项类型”选择“自定义生成工具”,最后点击”确定“或者”应用“,此时菜单栏会多出一个选项按钮"自定义生成工具":

在这里插入图片描述

接着,点击”自定义生成工具“,在”命令行“中输入如下命令:

ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

在”输出“中输入如下命令:

$(IntDir)%(fileName).obj

最后点击确定。

在这里插入图片描述

  1. 将汇编函数导出。在其他c/c++源文件添加如下代码,代表该函数是外部导入函数,链接器链接时会在其他obj文件中查找该函数:
extern "C" int myAsmTest(int);
  1. 如果工程的主程序main函数也在汇编中,那么还需要修改工程的入口点,请自行百度VS修改程序入口点的设置。

接下来,汇编文件就可以单独编译了:

在这里插入图片描述

在masm中,extern和import都表示外部导入函数,export代表导出函数。

但是在vs嵌入式汇编中,export和import被废弃,只有extern关键字被保留,表示外部导入函数,可以被汇编调用。

64位嵌入式汇编下,导入函数和变量的格式不同,例子如下:

EXTERN	targetFunction:PROC		;引用外部函数
EXTERN  targetVariable:DQ		;引用外部变量

当然,汇编中没有类型,所以变量的类型DQ、 DD 、DW、DB都是一样的,都是地址,只是指向一个值。

参考链接:

  1. https://blog.csdn.net/freeking101/article/details/104623548
  2. https://blog.csdn.net/zyhse/article/details/134063519
Logo

一站式 AI 云服务平台

更多推荐