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
相关产品推荐
相关产品推荐

