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

x86-64汇编写入file.txt无报错但文件为空,求代码问题排查

汇编代码写入文件失败的问题排查与修复

问题根源

你的代码核心错误是误用文件名字符串而非文件指针,另外fprintf的参数传递也不符合规范:

  • fopen调用成功后,会将FILE*类型的文件句柄返回至%rax寄存器,但后续调用fprintf和fclose时,你传入的第一个参数是filename(字符串地址),而非这个文件句柄。C库的fprintf、fclose要求第一个参数是文件流指针,不是文件名,这导致数据根本没写入目标文件流。
  • fprintf的第二个参数需要是格式化字符串,你直接传入message的写法不符合函数调用规范。

修正后的代码

.text

filename: .asciz "file.txt"
mode: .asciz "w"
message: .asciz "hello"
fmt_str: .asciz "%s"  ; 用于字符串输出的格式化模板

.global main

main:
    pushq   %rbp            
    movq    %rsp, %rbp      

    ; 打开文件,返回的FILE*存储在%rax中
    movq $filename , %rdi      
    movq $mode , %rsi         
    call fopen               

    ; 可选:检查文件是否成功打开,避免空指针操作
    testq %rax, %rax
    jz exit_main  ; 如果返回NULL,直接跳转至退出逻辑

    ; 写入文件:第一个参数是FILE*,第二个是格式化字符串,第三个是要输出的内容
    movq %rax, %rdi    
    movq $fmt_str, %rsi
    movq $message, %rdx
    call fprintf            

    ; 关闭文件:参数为之前获取的FILE*
    movq %rax, %rdi 
    call fclose

exit_main:
    movq    %rbp, %rsp     
    popq    %rbp            
    movq    $0, %rdi        
    call    exit 

关键修正点

  1. 保存fopen返回的文件指针(%rax),确保fprintf和fclose操作的是正确的文件流。
  2. 新增格式化字符串fmt_str,严格遵循fprintf的参数传递规则。
  3. 增加文件打开失败的检查逻辑,提升代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:45:21