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

如何将使用int 80h系统调用的NASM汇编代码在Windows环境下编译生成可双击运行的EXE文件

如何把NASM汇编代码转成Windows可双击运行的EXE

嘿,我来帮你搞定这个问题!首先得明确:你当前的汇编代码是Linux x86专属的——用了int 80h这种Linux系统调用,Windows完全不识别这套逻辑。所以咱们得先把代码改成Windows平台适配的版本,再走编译链接的步骤。

第一步:改成Windows兼容的汇编代码

下面是适配Win32控制台的版本,用Windows官方API实现和你原代码一样的功能(提示输入名字,输出问候):

extern _GetStdHandle@4
extern _WriteConsoleA@20
extern _ReadConsoleA@20
extern _ExitProcess@4

section .data
    msg         db  "Enter your name: ", 0Dh, 0Ah
    msg_len     equ $ - msg
    hello       db  "Hello, "
    hello_len   equ $ - hello

section .bss
    name        resb 255
    bytes_read  resd 1
    bytes_written resd 1

section .text
    global _main
_main:
    ; 获取标准输出句柄
    push    -11                 ; STD_OUTPUT_HANDLE的常量值
    call    _GetStdHandle@4
    mov     ebx, eax

    ; 打印提示信息
    push    0
    push    bytes_written
    push    msg_len
    push    msg
    push    ebx
    call    _WriteConsoleA@20

    ; 获取标准输入句柄
    push    -10                 ; STD_INPUT_HANDLE的常量值
    call    _GetStdHandle@4
    mov     ebx, eax

    ; 读取用户输入的名字
    push    0
    push    bytes_read
    push    255
    push    name
    push    ebx
    call    _ReadConsoleA@20

    ; 再次获取标准输出句柄
    push    -11
    call    _GetStdHandle@4
    mov     ebx, eax

    ; 打印"Hello, "
    push    0
    push    bytes_written
    push    hello_len
    push    hello
    push    ebx
    call    _WriteConsoleA@20

    ; 打印用户输入的名字
    push    0
    push    bytes_written
    push    dword [bytes_read]
    push    name
    push    ebx
    call    _WriteConsoleA@20

    ; 退出程序
    push    0
    call    _ExitProcess@4

第二步:用NASM + MinGW ld编译链接

假设你已经装好了NASM和MinGW,并且把它们的路径加到了系统PATH里(这样CMD里能直接调用nasm和ld),跟着下面的步骤来:

  • 把上面的代码存成hello.asm
  • 打开命令提示符,切换到代码所在的文件夹,先执行汇编命令:
    nasm -f win32 hello.asm -o hello.obj
    
    这里-f win32是告诉NASM生成32位Windows目标文件,格式是COFF。
  • 接着用MinGW的ld链接成EXE:
    ld -m i386pe hello.obj -o hello.exe -lkernel32
    
    • -m i386pe指定生成Windows的PE格式可执行文件
    • -lkernel32是链接kernel32.dll——咱们用到的那些Win32 API都在这个动态库里

做完这两步,你就能双击生成的hello.exe了,它会弹出控制台窗口,让你输入名字,然后输出问候语。

为啥你的原代码不能直接转?

再给你解释下本质问题:你的原代码用的是int 80h,这是Linux的系统调用入口,Windows的系统调用机制完全不一样(用的是int 2Eh或者syscall,参数传递规则也不同)。另外,Windows的可执行文件是PE格式,Linux是ELF格式,两者结构完全不兼容,所以必须改写代码并重新编译成PE格式的EXE才行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:47:42