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

64位Windows下汇编调用printf无输出问题求助

64位Windows汇编调用printf无输出的解决办法

你的汇编代码无法输出内容,核心是两个问题没处理好:

1. 违反了Microsoft x64调用约定

printf是可变参数函数,按照Windows x64调用规则,必须把AL寄存器设为通过XMM寄存器传递的浮点参数个数——这里你没有传浮点参数,所以得把AL置0。之前的代码里漏掉了这一步,导致printf内部逻辑出错,没法正常执行输出。

2. 标准输出缓冲区未刷新

你定义的字符串没有换行符\n,stdout默认是行缓冲模式,程序直接退出时缓冲区里的内容还没被刷到控制台,自然看不到输出。

修正后的完整代码

; hello.asm
section .data
    hello db 'Hello, World!', 0xA, 0   ; 加上换行符0xA,强制缓冲区刷新

section .text
    global main
    extern printf
    extern ExitProcess

main:
    mov rdi, hello       ; 第一个参数存入rdi(符合Windows x64调用约定)
    xor al, al           ; 标记无浮点参数传递
    call printf          

    mov eax, 0           
    call ExitProcess     

编译链接命令不变

编译:

nasm -f win64 hello.asm -o hello.obj

链接:

gcc -o hello.exe hello.obj -lkernel32 -lmsvcrt

额外说明:Windows x64调用约定里,前4个整数/指针参数要依次放在RCX、RDX、R8、R9,可变参数函数必须用AL声明浮点参数数量,这些规则一定要遵守,不然很容易出现诡异的运行错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:54:59