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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:54:05