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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:39:53