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

MASM3下16位DOS COM程序数据段不可访问及文件写入异常

问题修复方案

一、MASM3编译错误修复

错误原因

原代码中END data指令放置在数据定义中间,违反了汇编规则——整个程序只能有一个END指令,且需放在末尾指定入口点。该错误导致MASM3无法识别后续代码段,进而抛出"无法找到数据段"的错误。

修复步骤

  1. 移除END data指令:删除数据段末尾的END data,仅保留程序末尾的end start。
  2. 调整数据定义位置:TINY模型(COM程序)下,代码、数据、栈共享同一个段,无需单独声明数据段。将数据直接放在代码段的org 100h之前即可。

二、文件写入过多内容修复

错误原因

DOS中断int 21h的40h功能(文件写入)要求cx寄存器指定精确写入字节数。原代码中cx=100会从usermsg地址开始写入100字节,包含后续所有消息文本(因为它们在内存中连续存放)。

修复步骤

使用汇编器自动计算字符串长度,替代固定值100:

usermsg   db "write me$"
usermsg_len equ $ - usermsg  ; 自动计算当前地址与usermsg的偏移量,即字符串长度

写入时将cx设置为该计算值:mov cx, usermsg_len。

修正后的完整代码

.8086
.model tiny
.stack 100h

.code
org 100h

; 数据定义(TINY模型下无需单独数据段)
filename  db "test1.txt", 0
handle    dw 0
usermsg   db "write me$"
usermsg_len equ $ - usermsg  ; 自动计算字符串长度
msg_open  db "Error opening file!$"
msg_seek  db "Error seeking file!$"
msg_write db "Error writing file!$"
msg_close db "Error closing file!$"

start:
   ; 打开文件
   mov ah, 3dh
   mov al, 2          ; 读写模式
   mov dx, offset filename
   int 21h
   jc err_open

   mov [handle], ax

   ; 移动文件指针到末尾
   mov bx, ax
   mov ah, 42h        ; lseek功能
   mov al, 2          ; 相对文件末尾偏移
   mov cx, 0          ; 高位偏移
   mov dx, 0          ; 低位偏移(偏移0即末尾)
   int 21h
   jc err_seek

   ; 写入文件
   mov bx, [handle]
   mov dx, offset usermsg
   mov cx, usermsg_len ; 使用计算好的长度
   mov ah, 40h
   int 21h
   jc err_write

   ; 关闭文件
   mov bx, [handle]
   mov ah, 3eh
   int 21h
   jc err_close

exit:
   mov ax, 4c00h
   int 21h

err_open:
   mov dx, offset msg_open
   jmp error

err_seek:   
   mov dx, offset msg_seek
   jmp error

err_write:
   mov dx, offset msg_write
   jmp error

err_close:
   mov dx, offset msg_close
   ; 直接进入error处理

error:
   mov ah, 09h        ; DOS字符串输出功能
   int 21h

   mov ax, 4c01h      ; 带错误码退出
   int 21h

end start

额外说明

  • 如果不需要写入$符号,只需将usermsg修改为db "write me",长度会自动重新计算。
  • 修正后的代码同时兼容MASM3和MASM611,可正常编译执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:21:57