如何在x86 MASM VS2022中输出"Hello World"?无需第三方SDK
不依赖MASM32/Irvine32的汇编Hello World实现
完全可以不依赖第三方工具集,直接调用Windows原生API实现"Hello World",以下是32位和64位的纯MASM实现,仅依赖系统自带的基础库。
32位版本(x86)
代码实现
.386 .model flat, stdcall option casemap :none ; 手动声明所需Windows API函数,替代MASM32的.inc文件内容 GetStdHandle proto :dword WriteConsoleA proto :dword, :ptr byte, :dword, :ptr dword, :dword ExitProcess proto :dword ; 定义系统常量 STD_OUTPUT_HANDLE equ -11 .data msg db 'Hello, World!', 0Dh, 0Ah ; 包含回车换行的输出消息 msg_len equ $ - msg ; 计算消息的字节长度 .code start: ; 获取标准输出设备句柄 push STD_OUTPUT_HANDLE call GetStdHandle ; 向控制台写入消息 push 0 ; 保留参数,传0 push 0 ; 接收写入字节数的指针(无需获取则传0) push msg_len push offset msg push eax ; 传入之前获取的输出句柄 call WriteConsoleA ; 退出程序 push 0 call ExitProcess end start
编译链接步骤
使用Visual Studio自带的ml.exe(32位MASM编译器)执行以下命令:
- 编译生成目标文件:
ml /c /coff hello.asm - 链接生成可执行文件(依赖系统自带的
kernel32.lib):link /subsystem:console hello.obj kernel32.lib
64位版本(x64)
代码实现
64位汇编采用fastcall调用约定,参数通过寄存器传递:
.code ; 引用系统API函数,替代MASM32的.inc声明 EXTERN GetStdHandle:PROC EXTERN WriteConsoleA:PROC EXTERN ExitProcess:PROC STD_OUTPUT_HANDLE EQU -11 main PROC ; 获取标准输出句柄 mov rcx, STD_OUTPUT_HANDLE call GetStdHandle ; 写入控制台消息 mov rcx, eax ; 第一个参数:输出句柄 lea rdx, msg ; 第二个参数:消息指针 mov r8, msg_len ; 第三个参数:消息长度 mov r9, 0 ; 第四个参数:接收写入字节数的指针(传0忽略) push 0 ; 第五个参数:保留值,需通过栈传递 call WriteConsoleA ; 退出程序 mov rcx, 0 call ExitProcess main ENDP .data msg db 'Hello, World!', 0Dh, 0Ah msg_len equ $ - msg END
编译链接步骤
使用Visual Studio自带的ml64.exe(64位MASM编译器)执行:
ml64 hello.asm /link /subsystem:console
关键说明
- 所有代码未使用MASM32/Irvine32提供的任何.inc或.lib文件,完全手动声明/引用Windows原生API。
- 链接时依赖的
kernel32.lib是Windows系统自带的核心库,无需额外安装第三方工具集,只要使用标准的MASM编译环境(如Visual Studio命令行工具)即可自动找到。
内容的提问来源于stack exchange,提问作者een rii
相关产品推荐
相关产品推荐

