Loading... # 前置知识 我们常说的编译过程,严谨地说有三个环节:编译->汇编->链接。 在高级语言没有诞生前,写 asm 汇编代码,就只存在 汇编->链接 两个过程,当时 Windows 平台下对应的工具为: * masm.exe 汇编器,将 asm 汇编成为 obj 对象文件 * link.exe 链接器,将 obj 对象文件链接生成 exe/dll 等 高级语言(指编译型语言,非解释型语言) 诞生后,常用的 VS IDE 可以一键完成程序的编译->汇编->链接过程,用户没有感知,但其实对应的各环节工具还是各自存在的,以 VS 对 C/C++ 编译的支持工具为例: * cl.exe,将 c/cpp 文件编译为 asm 文件 * ml.exe / ml64.exe 汇编器,将 asm 汇编成为 obj 对象文件 * link.exe,将 obj 对象文件链接生成 exe/dll 等 如 VS2017 : ![图片.png](http://47.117.131.13/usr/uploads/2022/01/4139846208.png) # 项目中同时编译 C/C++ 和 asm 文件 但是在 VS 中新创建一个 C/C++ 控制台程序等,默认是不支持项目中的 asm 文件编译的,项目编译无法通过。如下 NtCreateFile 等函数就是 asm 文件中的,但是编译时并没有生成 asm 对应的 obj 对象文件,在链接时就会发生错误: ![图片.png](http://47.117.131.13/usr/uploads/2022/01/270617946.png) 解决方法是为项目添加【生成自定义】项->masm ![图片.png](http://47.117.131.13/usr/uploads/2022/01/1195154733.png) ![图片.png](http://47.117.131.13/usr/uploads/2022/01/3885525951.png) 然后对 asm 文件再指定编译器 ![图片.png](http://47.117.131.13/usr/uploads/2022/01/3845216051.png) 此时可顺利编译通过了。 但此时 VS 只支持 32 位 asm 代码,要支持 64 位 asm,参考:https://blog.csdn.net/lanzhengpeng2/article/details/2947262。 示例 masm64.rules:[masm64.rules](http://47.117.131.13/usr/uploads/2022/01/2925346866.txt) 最后修改:2022 年 05 月 10 日 07 : 50 AM © 允许规范转载