MASM3下16位DOS COM程序数据段不可访问及文件写入异常
问题修复方案
一、MASM3编译错误修复
错误原因
原代码中END data指令放置在数据定义中间,违反了汇编规则——整个程序只能有一个END指令,且需放在末尾指定入口点。该错误导致MASM3无法识别后续代码段,进而抛出"无法找到数据段"的错误。
修复步骤
- 移除
END data指令:删除数据段末尾的END data,仅保留程序末尾的end start。 - 调整数据定义位置: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
相关产品推荐
相关产品推荐

