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

Linux x86汇编系统调用读写文件失败:无法写入目标文件求助

x86汇编系统调用文件读写:写入失败的问题排查与解决

问题描述

我正在学习仅用系统调用在x86汇编里实现文件的打开、读取和写入操作,目标是读取file1.txt的内容并写入fileOUT.txt。程序运行时没有明显报错,但就是写不出内容。在Linux x86环境下用strace排查后,发现是写入操作的字节数参数出了问题,最终定位错误并解决。

错误原因分析

原代码里的读取和写入步骤中,用了mov edx, len来传递要读写的字节数。但len是.data段里用db定义的字节型变量,直接写len取到的是这个变量的内存地址,不是它存储的数值15。这就导致系统调用拿到的是一个无效的大数值,自然无法正确写入内容。

正确的写法是读取len变量里存的数值,用movzx edx, byte [len]——这条指令会把字节型的数值零扩展加载到双字寄存器edx里,确保传递给系统调用的是正确的字节数15。

修正后的完整代码

section .data
        readFile:    db      "file1.txt", 0
        len:         db      15
        writeFile:   db      "fileOUT.txt", 0
section .bss
        fd_outfile:  resb 4
        fd_infile:   resb 4
        buffer:      resb 15

section .text
        global main

main:
        ; 初始化栈帧
        push ebp
        mov  ebp, esp
        
        ; 打开file1.txt(sys_open,系统调用号5)
        mov eax,    5
        mov ebx,    readFile
        mov ecx,    0          ; 只读模式
        mov edx,    0777       ; 文件权限
        int 80h

        ; 保存文件描述符
        mov  [fd_infile], eax       
    
        ; 读取文件内容(sys_read,系统调用号3)
        mov eax, 3
        mov ebx, [fd_infile]
        mov ecx, buffer
        movzx edx, byte [len]  ; 修正:加载len变量的数值而非地址
        int 80h
        
        ; 关闭file1.txt(sys_close,系统调用号6)
        mov eax,6
        mov ebx,[fd_infile]
        int 80h

        ; 打开fileOUT.txt(可写模式)
        mov eax,    5
        mov ebx,    writeFile
        mov ecx,    1          ; 只写模式,文件不存在则创建
        mov edx,    0777
        int 80h

        ; 保存输出文件描述符
        mov [fd_outfile], eax
        
        ; 写入内容到fileOUT.txt(sys_write,系统调用号4)
        mov eax,    4               
        mov ebx,    [fd_outfile]    
        mov ecx,    buffer          
        movzx edx, byte [len]       ; 修正:加载len变量的数值而非地址
        int 80h
        
        ; 关闭fileOUT.txt
        mov eax,6
        mov ebx,[fd_outfile]
        int 80h

        ; 退出程序
        mov esp, ebp
        pop ebp
        ret

额外提示

  • 除了固定长度的len,更合理的做法是用sys_read的返回值作为实际写入的字节数,避免当file1.txt内容不足15字节时写入冗余数据。
  • strace是排查系统调用类问题的利器,能清晰看到每个系统调用的参数、返回值,快速定位参数传递错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:35:49