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

基于ASM 8086(DosBox)实现文本文件追加写入数据

8086汇编在DOSBox中追加写入文件的实现

要实现向已有文件末尾追加数据且不覆盖原有内容,必须同时使用int 21h的42h(移动文件指针)和40h(写文件)功能——直接打开文件后默认指针在开头,直接写入会覆盖内容,因此需要先将指针移到文件末尾,再执行写入操作。

具体实现步骤

  1. 打开目标文件
    使用int 21h的3Dh功能,以读写模式(AL=02h)打开文件,成功后AX返回文件句柄,需保存到BX供后续操作使用。
  2. 移动指针到文件末尾
    调用int 21h的42h功能,设置AL=02h(从文件末尾开始偏移),CX:DX设为0(偏移量为0,直接定位到末尾),将文件指针移至原有数据的最后位置。
  3. 写入新数据
    调用int 21h的40h功能,传入文件句柄、要写入的字节数和数据缓冲区地址,完成追加写入。
  4. 关闭文件
    使用int 21h的3Eh功能关闭文件,释放资源。

完整示例代码

; 8086汇编:向test.txt追加写入数据,实现Banana$ → BananaBanana$的效果
; 注:原文件test.txt内容为"Banana$",追加内容为"Banana"(不含$,保留原文件的结束符)

data segment
    filename  db 'test.txt',0       ; 目标文件名,以0结尾
    write_data db 'Banana'          ; 要追加的内容(6字节)
    data_len   equ $ - write_data   ; 计算要写入的字节数
    err_open   db 'Open file failed!$'
    err_move   db 'Move pointer failed!$'
    err_write  db 'Write file failed!$'
data ends

code segment
start:
    mov ax, data
    mov ds, ax

    ; 1. 打开文件(读写模式)
    mov ah, 3Dh
    mov al, 02h        ; AL=02h:读写访问,文件存在则打开,指针默认在开头
    lea dx, filename
    int 21h
    jc open_fail       ; CF置位表示打开失败
    mov bx, ax         ; 保存文件句柄到BX

    ; 2. 移动文件指针到末尾
    mov ah, 42h
    mov al, 02h        ; AL=02h:从文件末尾开始偏移
    xor cx, cx         ; CX:DX=0,偏移量为0 → 直接定位到末尾
    xor dx, dx
    int 21h
    jc move_fail       ; CF置位表示指针移动失败

    ; 3. 追加写入数据
    mov ah, 40h
    mov cx, data_len   ; 要写入的字节数
    lea dx, write_data
    int 21h
    jc write_fail      ; CF置位表示写入失败
    cmp ax, cx         ; 检查实际写入字节数是否符合预期
    jne write_fail

    ; 4. 关闭文件
    mov ah, 3Eh
    int 21h

    ; 程序正常退出
    mov ah, 4Ch
    int 21h

; 错误处理分支
open_fail:
    lea dx, err_open
    jmp print_err

move_fail:
    lea dx, err_move
    jmp print_err

write_fail:
    lea dx, err_write
    jmp print_err

print_err:
    mov ah, 09h        ; 打印错误信息
    int 21h
    mov ah, 4Ch        ; 错误退出
    int 21h
code ends
end start

关键细节说明

  • 文件打开模式:必须用AL=02h(读写模式),只读模式(AL=01h)无法执行写入,创建模式(AL=03h)虽也能打开文件,但02h更贴合“追加已有文件”的场景。
  • 指针移动参数:AL=02h是核心,该参数指定从文件末尾计算偏移量,配合偏移量0,直接将指针定位到原有数据的下一个字节位置,确保写入不会覆盖原有内容。
  • 写入长度校验:调用40h功能后,AX会返回实际写入的字节数,需与预期长度对比,避免因磁盘满等问题导致写入不完整。

内容的提问来源于stack exchange,提问作者Alden Ling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:23:12