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

求助修复汇编语言计算器的乘法与除法功能异常问题

汇编计算器乘除功能异常修复

问题现象

编写的x86汇编计算器中,加法、减法功能运行正常,但乘法与除法功能存在异常:程序会跳过第一个输入数字的提示,直接进入第二个输入数字的提示环节,无法正常获取第一个运算数,导致功能完全失效。

问题根源

查看乘除法代码段可发现核心错误:

  1. 未读取第一个运算数:MULTIPLICATION和DIVISION段仅显示了第一个数字的提示信息,但没有调用INT 21H AH=1读取用户输入并存储到NUM1变量,直接跳转到第二个数字提示。
  2. 运算逻辑混乱:
    • 乘法段直接使用未初始化的NUM1执行运算,结果必然错误。
    • 除法段存在逻辑错误,用NUM1自身作为除数,完全不符合除法运算逻辑。

修正后的完整代码

.MODEL SMALL ; 声明内存模型为SMALL
.STACK 100H ; 设置栈大小为100H

.DATA ; 数据段声明

; 用户提示信息
MSG1 DB 'Enter 1 for Addition $'
MSG2 DB 10,13,'Enter 2 for Subtraction $'
MSG3 DB 10,13,'Enter 3 for Multiplication $'
MSG4 DB 10,13,'Enter 4 for Division $'
MSG5 DB 10,13,'Choose Any One: $'
MSG6 DB 10,13,10,13,'Enter 1st Number : $'
MSG7 DB 10,13,'Enter 2nd Number : $'
MSG8 DB 10,13,10,13,'The Result is : $'
MSG DB 10,13,10,13,' ------- THANK YOU FOR USING THE CALCULATOR -------$'

NUM1 DB ? ; 存储第一个输入数字
NUM2 DB ? ; 存储第二个输入数字
RESULT DB ? ; 存储运算结果

.CODE ; 代码段开始

MOV AX,@DATA ; 将数据段地址加载到AX
MOV DS,AX ; 设置DS寄存器指向数据段

; 显示功能选择菜单
LEA DX,MSG1
MOV AH,9
INT 21H

LEA DX,MSG2
MOV AH,9
INT 21H

LEA DX,MSG3
MOV AH,9
INT 21H

LEA DX,MSG4
MOV AH,9
INT 21H

LEA DX,MSG5
MOV AH,9
INT 21H

; 读取用户选择的功能
MOV AH,1
INT 21H
MOV BH,AL
SUB BH,48 ; ASCII转数值

; 分支跳转
CMP BH,1
JE ADDITION 

CMP BH,2
JE SUBTRACTION 

CMP BH,3
JE MULTIPLICATION 

CMP BH,4
JE DIVISION 

ADDITION:
LEA DX,MSG6
MOV AH,9
INT 21H

MOV AH,1
INT 21H
MOV BL,AL

LEA DX,MSG7
MOV AH,9
INT 21H

MOV AH,1
INT 21H
MOV CL,AL

ADD AL,BL
MOV AH,0
AAA ; ASCII加法调整

MOV BX,AX
ADD BH,48
ADD BL,48

LEA DX,MSG8
MOV AH,9
INT 21H

MOV AH,2
MOV DL,BL
INT 21H

JMP EXIT_P

SUBTRACTION:
LEA DX,MSG6
MOV AH,9
INT 21H

MOV AH,1
INT 21H
MOV BL,AL

LEA DX,MSG7
MOV AH,9
INT 21H

MOV AH,1
INT 21H
MOV CL,AL

SUB BL,CL
ADD BL,48

LEA DX,MSG8
MOV AH,9
INT 21H

MOV AH,2
MOV DL,BL
INT 21H

JMP EXIT_P

MULTIPLICATION:
LEA DX,MSG6 ; 显示第一个数字提示
MOV AH,9
INT 21H

MOV AH,1 ; 读取第一个数字
INT 21H
SUB AL,48 ; ASCII转数值
MOV NUM1,AL ; 存储到NUM1

LEA DX,MSG7 ; 显示第二个数字提示
MOV AH,9
INT 21H

MOV AH,1 ; 读取第二个数字
INT 21H
SUB AL,48
MOV NUM2,AL

MOV AL,NUM1 ; 将第一个数加载到AL
MUL NUM2 ; AL = NUM1 * NUM2
AAM ; ASCII乘法调整

MOV BX,AX
ADD BH,48
ADD BL,48

LEA DX,MSG8
MOV AH,9
INT 21H

MOV AH,2
MOV DL,BH ; 显示高位数字
INT 21H

MOV AH,2
MOV DL,BL ; 显示低位数字
INT 21H

JMP EXIT_P

DIVISION:
LEA DX,MSG6
MOV AH,9
INT 21H

MOV AH,1
INT 21H
SUB AL,48
MOV NUM1,AL

LEA DX,MSG7
MOV AH,9
INT 21H

MOV AH,1
INT 21H
SUB AL,48
MOV NUM2,AL

; 除法准备:AX = NUM1(被除数),NUM2为除数
MOV AL,NUM1
MOV AH,0
DIV NUM2 ; AL=商,AH=余数

AAM ; ASCII除法调整
MOV BX,AX
ADD BH,48
ADD BL,48

LEA DX,MSG8
MOV AH,9
INT 21H

MOV AH,2
MOV DL,BL ; 显示商的低位(如果是个位数则高位为0)
INT 21H

JMP EXIT_P

EXIT_P:
LEA DX,MSG
MOV AH,9
INT 21H

EXIT:
MOV AH,4CH
INT 21H ; 程序退出

ENDS ; 段结束
END ; 程序结束

修正说明

  1. 补充第一个数字读取逻辑:在乘除法段显示MSG6后,添加输入读取和数值转换代码,将第一个运算数存入NUM1。
  2. 修正乘法运算逻辑:将NUM1加载到AL寄存器后,再与NUM2执行乘法运算,确保运算数正确。
  3. 修正除法运算逻辑:将被除数NUM1放入AX寄存器(AH清零),以NUM2为除数执行除法,获取商后进行ASCII调整再显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:12:34