我试图运行我的汇编语言程序,当我尝试输入第二个输入时,光标冻结,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
我可以看到三个错误(有些也在评论中发现)。
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 字符。