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
相关产品推荐
相关产品推荐

