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

如何在DOSBox中用DEBUG运行.txt/.asm文件?汇编程序崩溃求助

DOSBox中Debug汇编程序崩溃问题排查

问题场景

在DOSBox环境下使用debug.exe编写并运行汇编程序时,程序频繁崩溃,执行后弹出异常终止的错误界面。以下是使用的Debug命令及汇编代码:

a200
db 50

a260
db 'Enter text' 0D 0A '$'

a100
mov ah, 09
mov dx, 260
int 21
mov ah, 0A
mov dx, 200
int 21
mov ah, 02
mov dl, 0d
int 21
mov ah, 02
mov dl, 0a
int 21
xor cx, cx
mov bx, 201
mov cl, [bx]
inc bx
mov dl, [bx]
cmp dl, 41
db 74 04 
mov ah, 02
int 21
db e2 f2
mov ah, 4c
int 21

n hello.com

r cx
500
w

q

问题根源及修复方案

1. INT 0AH输入缓冲区格式错误

DOS中断INT 0AH(字符串输入)要求缓冲区结构为:

  • 第1字节:缓冲区最大容量
  • 第2字节:实际输入字符数(由系统自动填充)
  • 第3字节起:输入的字符内容

你仅在a200处定义了db 50,缺少第2字节的预留空间,导致INT 0AH执行时破坏后续内存数据,直接引发崩溃。
修复:将a200处代码改为db 50, 0,预留第二个字节。

2. 跳转与循环指令逻辑错误

  • 直接用db 74 04、db e2 f2写机器码易出错,且循环逻辑缺失关键步骤:未更新字符指针BX、未正确递减循环计数器CX,导致无限循环或访问非法内存。
    修复:用汇编指令替代机器码,重构循环逻辑:
a100
mov ah, 09
mov dx, 260
int 21
mov ah, 0A
mov dx, 200
int 21
mov ah, 02
mov dl, 0d
int 21
mov ah, 02
mov dl, 0a
int 21
xor cx, cx
mov bx, 201
mov cl, [bx]  ; 获取实际输入字符数
jcxz exit     ; 无输入则直接退出
inc bx        ; 指向第一个输入字符
print_loop:
mov dl, [bx]
cmp dl, 41h   ; 判断是否为大写字母'A'(ASCII值41h)
je skip_char  ; 是'A'则跳过打印
mov ah, 02
int 21        ; 打印当前字符
skip_char:
inc bx        ; 移动到下一个字符
loop print_loop  ; CX递减,不为0则继续循环
exit:
mov ah, 4c
int 21

3. 文件写入长度冗余

r cx设置为500,远大于实际程序长度,会写入大量垃圾数据。修复:执行r cx后输入实际代码长度(可通过Debug中查看CS:IP到程序结束的字节数确定)。

修复后的完整Debug命令序列

a200
db 50, 0  ; 修正输入缓冲区格式

a260
db 'Enter text' 0D 0A '$'

a100
mov ah, 09
mov dx, 260
int 21
mov ah, 0A
mov dx, 200
int 21
mov ah, 02
mov dl, 0d
int 21
mov ah, 02
mov dl, 0a
int 21
xor cx, cx
mov bx, 201
mov cl, [bx]
jcxz exit
inc bx
print_loop:
mov dl, [bx]
cmp dl, 41h
je skip_char
mov ah, 02
int 21
skip_char:
inc bx
loop print_loop
exit:
mov ah, 4c
int 21

n hello.com
r cx
; 输入实际代码长度(如30)
w
q

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:10:44