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

Windows11 x64环境下64位汇编程序运行无窗口显示问题求助

64位Windows汇编程序无窗口显示的问题解决

核心原因

你的程序是控制台程序,而非带GUI窗口的应用,所以不会弹出独立图形窗口。出现无窗口现象,本质是运行方式和代码逻辑的问题:

1. 双击运行的问题

  • 带call ExitProcess的版本:程序执行完输出后立即退出,Windows创建的临时控制台窗口会随之关闭,导致你看不到任何界面。
  • 带jmp b死循环的版本:控制台窗口其实已创建,但可能被最小化或其他窗口遮挡,任务管理器中能看到运行进程就是证明。无限空循环会占满一个CPU核心,所以你看到9-10%的CPU占用(对应10核CPU的单核心负载)。

2. 正确的运行方式

要看到程序输出,必须在已打开的命令提示符(CMD)或PowerShell窗口中运行程序:

  1. 打开CMD/PowerShell,切换到程序所在目录
  2. 输入test.exe并回车,程序输出会直接显示在当前控制台窗口中,程序退出后窗口不会关闭,你能清楚看到结果。

代码修正建议

保留call ExitProcess作为正确退出方式,同时保证栈操作规范性(虽然ExitProcess不会返回,但恢复栈是良好的汇编习惯)。修正后的完整代码如下:

default rel

extern GetStdHandle
extern WriteFile
extern ExitProcess

section .text
global main
main:
    sub     rsp, 40          ; 预留阴影空间并将栈对齐到16字节边界
    mov     rcx, -11         ; 指定获取标准输出句柄(STD_OUTPUT_HANDLE = -11)
    call    GetStdHandle

    ; 调用WriteFile:参数依次放入rcx, rdx, r8, r9,第五个参数入栈
    mov     rcx, rax         ; 第一个参数:标准输出句柄
    lea     rdx, [msg]       ; 第二个参数:输出缓冲区地址(RIP相对寻址)
    mov     r8d, msg.len     ; 第三个参数:要写入的字节数(32位立即数)
    lea     r9, [rsp+48]     ; 第四个参数:存储已写字节数的指针(使用预留的阴影空间)
    mov     qword [rsp + 32], 0   ; 第五个参数:lpOverlapped = NULL(64位空指针)
    call    WriteFile

    add     rsp, 40          ; 恢复栈空间(可选,但符合规范)
    xor     ecx, ecx         ; ExitProcess的参数:退出码0
    call    ExitProcess

section .data
    msg:  db "Test", 13, 10    ; 包含回车换行符,保证输出为独立一行
    .len equ  $-msg            ; 让汇编器自动计算字符串长度

汇编与链接命令验证

你使用的命令是正确的:

  • 汇编:nasm -f win64 test.asm
  • 链接:golink /entry main /mix test.obj kernel32.dll

/entry main指定了程序入口点为main,kernel32.dll包含所有用到的系统函数,无需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:54:55