汇编语言乘法程序输出乱码问题求助:计算结果不符预期
汇编乘法程序错误分析与修正
核心错误点
1. 输入存储顺序颠倒
原代码里,调用DOS输入中断(int 21h,AH=01h)前就把AL的值存入变量,但此时AL还没获取到用户输入的字符,存的是随机垃圾值。正确逻辑是先执行中断拿到输入,再把AL里的ASCII字符存进变量。
2. (潜在问题)多位数结果无法正常显示
当前代码只处理乘积0-9的情况,要是乘积≥10,直接加'0'会得到非数字的ASCII字符,后续需要扩展多位数输出逻辑,但当前导致错误的主要原因是输入顺序问题。
修正后的代码
.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 .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 ; 先获取输入,再存储到变量 ; 将ASCII字符转换为数值 sub Quantity, '0' sub Unit_price, '0' ; 执行乘法运算 mov AL, Quantity mul Unit_price ; AL * Unit_price,结果存于AX mov Total, AL ; 乘积存入Total ; 转换为ASCII字符(仅适用于0-9的结果) add Total, '0' mov AH, 09h lea DX, msg3 int 21h mov AH, 02h mov DL, Total int 21h mov AX, 4C00H int 21h MAIN ENDP END MAIN
修正说明
- 调整输入代码顺序,确保先通过
int 21h拿到用户输入的ASCII字符,再存入Quantity和Unit_price变量。 - 保留了原有的单数字结果转换逻辑,若要处理乘积≥10的情况,需要添加多位数拆分输出的代码(比如把AX中的值拆成十位和个位,分别转成ASCII后输出)。
内容的提问来源于stack exchange,提问作者zuo hao
相关产品推荐
相关产品推荐

