VS2022使用Yasm

添加环境变量
YASMPATH=G:\yasm-1.3.0-win64\
注意结尾的\不要漏

Or:
mkdir D:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\bin\
copy yasm-1.3.0-win64\yasm.exe D:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\bin\

https://github.com/ShiftMediaProject/VSYASM
下载
yasm.props yasm.targets yasm.xml
拷贝到
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

或者
Visual Studio 2015: 
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations
Visual Studio 2017: 
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\BuildCustomizations
Visual Studio 2019: 
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations


Open VS2022 Project
项目右键 - 生成依赖项 - 生成自定义 - 查找现有的
Add C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\yasm.targets

右键单击 asm 文件,属性 - 项类型 - Yasm Assembler

Debug模式生成调试信息:
项目属性 - Debug - Yasm Modular Assembler - Generate Debug Information: 是(-g cv8)

报错:
无法解析的外部符号 _mainCRTStartup
或
无法解析的外部符号 _main,函数 "int __cdecl __scrt_common_main_seh(void)"
解决方法:
项目属性 - 链接器 - 高级 - 入口点:
x86:
main
x64:
_main


由于 yasm 并不能在汇编代码里区分是 Win32 还是 x64 模式,所以同一个项目里如果同时具有 Win32 和 x64 两种模式的汇编代码,是不能同时都编译的,会报错的。解决方法是,我们可以使用自定义生成工具里提供的排除功能,在 Win32 模式下排除所有 64 位汇编文件的生成,在 x64 模式下排除所有 32 位汇编文件的生成


Test Code:
global _main
;extern _printf
section .text
_main:
    mov eax,01H
    add eax,02H
    ;push message
    ;call _printf    ;调用C的printf
    ;add esp,4
    ret
message:
    db  'hello,world',10,0