Windows10下使用GCC编写汇编代码调用printf无输出问题求助
汇编程序无输出问题的排查与解决
问题描述
我是汇编语言新手,希望通过汇编为C/C++扩展功能,目前处于入门阶段。编写的汇编代码可正常编译运行,控制台窗口会弹出,但无论是控制台本身还是运行命令的PowerShell窗口都没有输出内容。
汇编代码
.extern printf .extern scanf .global main .text main: mov %rsp, %rbp sub $0x30, %rsp movabsq $formatStr, %rcx mov $0x6, %edi mov $0x0, %al call printf xor %rax, %rax add $0x30, %rsp pop %rbp ret .data formatStr: .asciz "The int is %d\n" .end
编译与运行命令
编译命令(PowerShell中执行):
gcc "D:\Code\foo.s" -o "D:\Code\foo.exe"
运行命令(PowerShell中执行):
Start-Process -FilePath "D:\Code\foo.exe"
环境:使用GCC 13.1.0,汇编文件末尾已添加换行符
问题原因与解决方法
1. 函数参数传递不符合调用约定
Windows平台的GCC遵循Windows x64调用约定,但代码中printf的参数传递完全错误:
- Windows x64下,
printf的第一个参数(格式字符串)需放在%rcx寄存器,第二个参数(对应%d的整数)需放在%rdx寄存器。 - 原代码把要打印的整数
0x6放到了%edi寄存器(32位寄存器),这对应System V调用约定的参数位置,和Windows的调用约定不匹配,导致printf无法正确解析参数,进而没有输出。
修正后的参数传递代码:
mov $formatStr, %rcx ; 第一个参数:格式字符串地址(Windows下地址在低范围,无需movabsq) mov $0x6, %rdx ; 第二个参数:要打印的整数(使用64位寄存器,符合调用约定) mov $0x0, %al call printf
2. Start-Process的运行方式导致输出无法被捕获
PowerShell的Start-Process默认会新开独立控制台窗口运行程序,程序执行完毕后窗口会立即关闭,根本来不及查看输出;同时该命令默认不会将程序输出重定向到当前PowerShell窗口,所以原窗口也看不到内容。
修正后的运行命令:
直接在PowerShell中执行程序路径即可,程序会在当前窗口运行,输出会直接显示:
D:\Code\foo.exe
内容的提问来源于stack exchange,提问作者Ashley Ben Story
相关产品推荐
相关产品推荐

