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

Windows 10下NASM编译HelloWorld汇编代码报错求助

解决Windows 10下NASM+GCC编译32位Hello World汇编程序的链接不兼容问题

我来帮你搞定这个链接错误!你在Windows 10环境下用NASM配合Cygwin版GCC编译32位汇编程序时遇到的ld: skipping incompatible...错误,本质是64位的Cygwin链接器无法正确处理32位目标文件,或者你的环境缺少32位编译依赖组件。

先回顾下你提供的代码和编译步骤:

你的汇编代码(helloworld.asm)

global _main
extern _printf
section .text
_main:
 push message
 call _printf
 add esp, 4
 ret
message:
 db 'Hello, World', 10, 0

你执行的编译命令

nasm -f win32 helloworld.asm
gcc -m32 helloworld.obj -o helloworld.exe

错误核心原因

你使用的是64位Cygwin环境,默认的GCC和链接器都是64位的。虽然加了-m32参数告诉GCC生成32位程序,但如果没有安装32位的系统库和编译组件,链接器找不到对应的32位依赖文件,就会抛出“跳过不兼容文件”的错误。


解决方案

1. 安装Cygwin的32位开发依赖

打开Cygwin的安装程序(setup-x86_64.exe),在包选择界面搜索并安装以下32位组件:

  • gcc-core:i686:32位GCC核心编译工具
  • libgcc1:i686:32位GCC运行时库
  • libc-devel:i686:32位C标准库的头文件与静态库
  • 确保nasm已正确安装(NASM本身支持多架构,无需特意选32位版本)

2. 调整链接命令

安装完成后,使用32位专属的GCC命令来链接,避免环境混淆:

i686-pc-cygwin-gcc -m32 helloworld.obj -o helloworld.exe

如果你的环境配置正确,原来的gcc -m32命令也能正常工作,但使用指定架构的GCC命令更稳妥。

(可选)优化栈对齐适配GCC要求

部分版本的32位GCC要求栈对齐到16字节,如果你后续遇到运行时错误,可以修改汇编代码调整栈对齐:

global _main
extern _printf
section .text
_main:
 push ebp
 mov ebp, esp
 sub esp, 4  ; 调整栈到16字节对齐
 push message
 call _printf
 add esp, 8  ; 释放参数和对齐空间
 mov esp, ebp
 pop ebp
 ret
message:
 db 'Hello, World', 10, 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:27:29