NASM汇编实现文件读写功能出现文件名异常变更问题求助
NASM文件操作程序问题排查
核心错误点
- 路径字符串缺少null终止符:Linux内核中所有文件路径都是C风格的null终止字符串,你定义的
idfile没有追加0,内核读取路径时会向后越界读取msgfile的"Hello"内容,直接导致文件名异常。 - 误用系统调用返回值:
creat(eax=8)、open(eax=5)调用成功后,会将文件描述符返回在eax寄存器中,你完全没有保存该返回值,后续操作直接使用错误的参数。 - 寄存器参数传值逻辑错误:
open、write、close调用中,ebx需要传入的是路径地址/文件描述符,你用了[idfile],相当于把路径字符串的前4字节ASCII值当作地址/描述符传入,完全不符合调用约定。write调用的ecx需要传入写入内容的地址,你用了[msgfile],相当于把"Hello"的前4字节内容当作地址传入,自然无法写入正确内容。
- 系统调用参数混淆:
open(eax=5)的第三个参数ecx是打开模式(如O_RDWR=2),文件权限是第四个参数edx的值,你错误将权限填入ecx位。且creat调用本身已经返回可写的文件描述符,不需要额外执行一次open操作。
修正后的完整代码
section .data idfile db '/home/alvaro/nasm/tfile.txt', 0 ; 追加0作为字符串终止符 msgfile db 'Hello' lonmsg equ $-msgfile section .text global _start _start: ; 创建文件,返回文件描述符到eax mov eax, 8 mov ebx, idfile mov ecx, 777o int 0x80 ; 保存文件描述符到ebx,后续write、close都直接用 mov ebx, eax _editfile: ; 写入内容 mov eax, 4 mov ecx, msgfile ; 传字符串地址,不是取内存内容 mov edx, lonmsg int 0x80 _closefile: ; 关闭文件,ebx已经是文件描述符 mov eax, 6 int 0x80 _finalize: ; 退出程序 mov eax, 1 mov ebx, 0 int 0x80
修改说明
- 给
idfile路径末尾追加0,符合内核字符串格式要求,解决文件名异常问题 - 直接复用
creat返回的文件描述符,省略冗余的open步骤 - 所有系统调用的参数严格遵循32位x86 Linux系统调用约定,传地址时不加中括号,正确使用返回的文件描述符
内容的提问来源于stack exchange,提问作者Alvaro Garcia
相关产品推荐
相关产品推荐

