2025年1月5日 / 2 min read 使用 Visual Studio 进行x86汇编环境配置 windows , asm , vs 下载MASM32 下载地址 下载后安装到D:\masm32目录下。 头文件在D:\masm32\include目录下。 静态库在D:\masm32\lib目录下。 配置Visual Studio 新建一个工程,选择空项目。 选择生成依赖项 选择MASM32 创建一个main.asm文件,输入以下代码: .686.model flat, stdcalloption casemap:none include windows.incinclude user32.incinclude kernel32.inc .dataszText db "Hello World", 0 .codestart: invoke MessageBoxA, NULL, addr szText, addr szText, MB_OK invoke ExitProcess, 0 end start 配置头文件路径 此时就可以编译了。 使用C库函数配置 修改代码,静态链接CRT库。 .686.model flat, stdcalloption casemap:none include windows.incinclude user32.incinclude kernel32.inc ; 静态链接CRT库includelib libcmt.libincludelib libvcruntime.libincludelib libucrt.lib .dataszText db "Hello World", 0 .codemain proc c invoke MessageBoxA, NULL, addr szText, addr szText, MB_OK invoke ExitProcess, 0main endpend 创建一个stdc.inc头文件,用来声明CRT函数。 .686option casemap :none ; 主要用来声明一些C运行时库的函数ifndef _stdc_inc_stdc_inc EQU 1 fgets proto c :DWORD, :DWORD, :DWORD fprintf proto c :DWORD, :DWORD, :VARARG ; 0:stdin, 1:stdout, 2:stderr __acrt_iob_func proto c :DWORD ; 因为没有stdin, stdout, stderr这些文件指针,所以需要通过这个函数获取 endif 完整代码: .686.model flat, stdcalloption casemap:none include windows.incinclude user32.incinclude kernel32.inc include stdc.inc includelib libcmt.libincludelib libvcruntime.libincludelib libucrt.lib .dataszText db "Hello World", 0 .code main proc c local @stdin:DWORD local @stdout:DWORD local @input_buf[100]: BYTE invoke __acrt_iob_func, 0h mov @stdin, eax invoke __acrt_iob_func, 1h mov @stdout, eax invoke fgets, addr @input_buf, 100, @stdin invoke fprintf, @stdout, addr @input_buf invoke ExitProcess, 0main endp end