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
关键修正点
- 保存
fopen返回的文件指针(%rax),确保fprintf和fclose操作的是正确的文件流。 - 新增格式化字符串
fmt_str,严格遵循fprintf的参数传递规则。 - 增加文件打开失败的检查逻辑,提升代码健壮性。
内容的提问来源于stack exchange,提问作者michael29
相关产品推荐
相关产品推荐

