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

DOSBox运行MASM汇编程序时无提示冻结崩溃问题求助

问题原因及修复方案

你的程序崩溃和内存无关,完全是代码错误导致的,核心问题及修复如下:

1. 输出msg3时的寄存器误用

调用DOS中断INT 21H的09H功能(输出字符串),要求DX寄存器指向字符串首地址,但你代码里错误地使用了AX:

MOV AH, 09H
LEA AX, msg3  ; 错误:应使用DX而非AX
INT 21H

这会导致DX中是随机值,DOS尝试访问非法内存地址,直接引发崩溃。

2. 除法逻辑错误

你想把Total的值拆分为十位和个位,但当前除法代码逻辑完全无效:

XOR AX, AX
MOV DX, 10H
DIV DX  ; 16位除法中,被除数是DX:AX(此时为0),除数是DX=10H,结果无意义

正确做法是将Total放入AL,用8位除法除以10:

MOV AL, Total
MOV BL, 10
DIV BL  ; AL=商(十位),AH=余数(个位)
MOV Q, AL
MOV R, AH

3. 数字输出未转ASCII码

直接输出Q、R的数值(比如5),DOS会将其当作ASCII控制字符处理,需给数值加上'0'转换为可显示字符:

MOV AH, 02H
MOV DL, Q
ADD DL, '0'  ; 转换为ASCII字符
INT 21H

MOV AH, 02H
MOV DL, R
ADD DL, '0'  ; 转换为ASCII字符
INT 21H

修复后的完整代码

.MODEL SMALL
.STACK
.DATA
    msg1 DB "Quantity (unit): $"
    msg2 DB 13,10,"Unit price (RM): $"
    msg3 DB 13,10,"Total amount is RM$"
    Quantity DB 0
    Unit_price DB 0
    Total DB 0
    Q DB 0
    R DB 0
    
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX
    
    ; 输出数量输入提示
    MOV AH, 09H
    LEA DX, msg1
    INT 21H
    
    ; 读取数量
    MOV AH, 01H
    INT 21H
    MOV Quantity, AL
    
    ; 输出单价输入提示
    MOV AH, 09H
    LEA DX, msg2
    INT 21H
    
    ; 读取单价
    MOV AH, 01H
    INT 21H
    MOV Unit_price, AL
    
    ; 输出总价提示(修复DX寄存器错误)
    MOV AH, 09H
    LEA DX, msg3
    INT 21H
    
    ; ASCII字符转数字
    SUB Quantity, '0'
    SUB Unit_price, '0'
    
    ; 计算总价
    MOV AL, Quantity
    MUL Unit_price
    MOV Total, AL
    
    ; 拆分十位和个位(修复除法逻辑)
    MOV AL, Total
    MOV BL, 10
    DIV BL
    MOV Q, AL
    MOV R, AH
    
    ; 输出十位(转ASCII)
    MOV AH, 02H
    MOV DL, Q
    ADD DL, '0'
    INT 21H
    
    ; 输出个位(转ASCII)
    MOV AH, 02H
    MOV DL, R
    ADD DL, '0'
    INT 21H
    
    ; 退出程序
    MOV AH, 4CH
    INT 21H
    
MAIN ENDP
END MAIN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:16:20