You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows平台下NASM汇编代码链接失败问题求助

解决MinGW下NASM汇编链接时undefined reference to WinMain@16'的问题

问题根源

你写的是Linux x86架构的汇编代码:用了Linux专属的int 0x80系统调用,入口点是Linux程序标准的_start。但你在Windows的MinGW环境下用gcc链接,MinGW是Windows平台的工具链,默认会找Windows程序的入口(WinMain@16或main),且完全不支持Linux的系统调用机制,因此触发链接错误。

两种解决方案

方案1:改代码适配Windows平台

把代码改成Windows平台的调用逻辑,用Windows API实现输出和退出,入口点改为_main:

section .data
    hello db 'Hello, World!', 0dh, 0ah, 0  ; 带Windows换行符的字符串

section .text
    global _main
    extern _printf
    extern _ExitProcess@4

_main:
    ; 调用printf输出字符串
    push hello
    call _printf
    add esp, 4  ; 清理栈上的参数

    ; 调用ExitProcess退出程序,返回码0
    push 0
    call _ExitProcess@4

对应的汇编、链接命令:

nasm -f win32 hello.asm -o hello.o
gcc -m32 hello.o -o hello.exe

方案2:用Linux环境编译(推荐学Linux汇编时用)

如果你的目标是学习Linux汇编,别在Windows的MinGW里折腾,直接用WSL(Windows子系统Linux)、虚拟机Linux或者Docker,在纯Linux环境下编译链接:

nasm -f elf32 hello.asm -o hello.o
ld -m elf_i386 hello.o -o hello
./hello

如果非要在MinGW里强行链接Linux风格代码(生成的程序只能在Linux跑),可以让gcc跳过标准库链接,指定入口点:

nasm -f elf32 hello.asm -o hello.o
gcc -m32 -nostdlib -static hello.o -o hello

错误详情说明

undefined reference to WinMain@16' 是因为MinGW的gcc默认会链接libmingw32.a库,这个库要求程序入口是Windows图形程序的WinMain@16,或者控制台程序的main。你的代码用了Linux的_start入口,链接器找不到对应符号,因此报错。

内容的提问来源于stack exchange,提问作者Andrew Rusanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:57:09