DOSbox自动死机并崩溃,没有任何提示警告

问题描述 投票:0回答:1

我试图运行我的汇编语言程序,当我尝试输入第二个输入时,光标冻结,DOSbox 模拟器会在延迟几秒钟后崩溃。

我尝试过运行其他汇编语言程序,它们似乎工作正常。我不确定这背后的原因,这可能是我的代码(MASM 格式)中的错误/没有足够的 RAM 来运行程序?我的代码附在下面,运行该程序时我有 1.5GB 的可用 RAM。

.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
    
    MOV AH, 09H
    LEA AX, msg3
    INT 21H
    
    XOR AX, AX
    SUB Quantity, '0'
    SUB Unit_price, '0'
    
    MOV AL, Quantity
    MUL Unit_price
    MOV Total, AL
    
    XOR AX, AX
    MOV DX, 10H
    DIV DX
    MOV Q, AL
    MOV R, AH
    
    MOV AH, 02H
    MOV DL, Q
    INT 21H
    
    MOV AH, 02H
    MOV DL, R
    INT 21H
    
    MOV AH, 4CH
    INT 21H
    
MAIN ENDP
END MAIN
    
assembly dosbox
1个回答
0
投票

我可以看到三个错误(有些也在评论中发现)。


    MOV AH, 09H
    LEA AX, msg3
    INT 21H

看起来像是

LEA DX, msg3
的拼写错误。按照目前的情况,您将在 AH 中获得一个随机值(
msg3
地址的高字节,并且将执行一些随机 DOS 功能。

此外,比此处(以及其他类似实例中)的

LEA
更高效的是
MOV DX, OFFSET msg3
,它具有相同的效果并节省一个字节。


    XOR AX, AX
    MOV DX, 10H
    DIV DX

首先,您将

AX
归零,从而丢弃了您仔细计算的总值(请记住,
AX
包含
AH
AL
)。其次,
DIV r/m16
是32乘16位除法:它将
DX:AX
中的32位无符号值除以
r/m16
中的值,商放在
AX
中,余数放在
DX
中。所以这里你将
100000H
除以
10H
;商是
10000h
,它溢出了16位,所以你会得到一个除法溢出异常。

我想你可能是说

    XOR AH, AH    ; zero-extend AL into AX
    MOV DL, 10H
    DIV DL

AL
中的数字(用零扩展以在
AX
中生成 16 位值)除以
10H
,将商放入
AL
,将余数放入
AH 
.


    MOV AH, 02H
    MOV DL, Q
    INT 21H

您需要将

0
添加到值
Q
R
来创建用于输出的可打印 ASCII 字符。

© www.soinside.com 2019 - 2024. All rights reserved.