Windows11 x64环境下64位汇编程序运行无窗口显示问题求助
64位Windows汇编程序无窗口显示的问题解决
核心原因
你的程序是控制台程序,而非带GUI窗口的应用,所以不会弹出独立图形窗口。出现无窗口现象,本质是运行方式和代码逻辑的问题:
1. 双击运行的问题
- 带
call ExitProcess的版本:程序执行完输出后立即退出,Windows创建的临时控制台窗口会随之关闭,导致你看不到任何界面。 - 带
jmp b死循环的版本:控制台窗口其实已创建,但可能被最小化或其他窗口遮挡,任务管理器中能看到运行进程就是证明。无限空循环会占满一个CPU核心,所以你看到9-10%的CPU占用(对应10核CPU的单核心负载)。
2. 正确的运行方式
要看到程序输出,必须在已打开的命令提示符(CMD)或PowerShell窗口中运行程序:
- 打开CMD/PowerShell,切换到程序所在目录
- 输入
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
相关产品推荐
相关产品推荐

