基于ASM 8086(DosBox)实现文本文件追加写入数据
8086汇编在DOSBox中追加写入文件的实现
要实现向已有文件末尾追加数据且不覆盖原有内容,必须同时使用int 21h的42h(移动文件指针)和40h(写文件)功能——直接打开文件后默认指针在开头,直接写入会覆盖内容,因此需要先将指针移到文件末尾,再执行写入操作。
具体实现步骤
- 打开目标文件
使用int 21h的3Dh功能,以读写模式(AL=02h)打开文件,成功后AX返回文件句柄,需保存到BX供后续操作使用。 - 移动指针到文件末尾
调用int 21h的42h功能,设置AL=02h(从文件末尾开始偏移),CX:DX设为0(偏移量为0,直接定位到末尾),将文件指针移至原有数据的最后位置。 - 写入新数据
调用int 21h的40h功能,传入文件句柄、要写入的字节数和数据缓冲区地址,完成追加写入。 - 关闭文件
使用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
相关产品推荐
相关产品推荐

