设计一个四则运算器,从键盘输入十六进制表达式,在屏幕上显示结果,可以一直运算,直到按下ESC键。(如果是除法则舍去余数,显示整数值,类似C语言整数的除法,采用原码运算的方法,故不支持负数运算)
- 解题思路:
这里只举例加法的设计思路,另外三则运算类似,先比较输入是否为ESC, ,
然后检测第一个输入值,它应该是运算的数字,判断是否大于等于,如果大于10则为ABCDEF,则减掉37H作为ASCII码值的10,11,12,13,14,15。对应。
之后检测第二个键入值,判断执行加减乘除的操作
之后调用根据加减乘除调用子程序,这是加法举例。
最后显示结果,并跳回程序初始,这里要注意的是依旧要对是否为0到9还是A到F进行判断处理,而且这里运算结果是两位的,因为15乘15,一位肯定显示不出来。如果答案是一位,我们就在前面补0.(这里又需要一些判断),这里注意因为16进制,所以用10H来取模还有就是我们要把ASCII转化为字符值,因为0到9和A到F是不紧挨的。要选择加多少,0到9就加30H,A到F就加37H。对应为,就不详细解读了
- 流程图
- 程序
DSEG SEGMENT
X DB ?
Y DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:
MOV AH,01H
INT 21H
MOV BL,1BH ;ESC键ASCII为1BH
CMP AL,BL
JE OPEND2
MOV CL,AL
SUB AL,30H
MOV BL,0AH
CMP AL,BL ;判断是否小于10
JB OPT
SUB CL,37H ;将16进制字符A到F~换成数字
MOV AL,CL
OPT: ;选择执行什么操作
MOV X,AL ;将值装入X
MOV AL,01H
INT 21H
MOV BL,'+'
CMP AL,BL
JE NADD
MOV BL,'-'
CMP AL,BL
JE NDEL
MOV BL,'*'
CMP AL,BL
JE NMUL
MOV BL,'/'
CMP AL,BL
JE NDIV
OPEND1:
JMP OPEND2
NADD:
CALL ADD8
ADD8 proc
MOV AH,01H
INT 21H
MOV CL,AL
SUB AL,30H
MOV BL,0AH
CMP AL,BL ;判断是否小于10
JB NADDH
SUB CL,37H;将16进制字符A到F~换成数字
MOV AL,CL
NADDH:
ADD AL,X
MOV Y,AL ;将值装入Y
JMP COUT
ADD8 ENDP
NDEL:
CALL DEL8
DEL8 proc
MOV AH,01H
INT 21H
MOV CL,AL
SUB AL,30H
MOV BL,0AH
CMP AL,BL ;判断是否小于10
JB NDELH
SUB CL,37H;将16进制字符A到F~换成数字
MOV AL,CL
NDELH:
SUB X,AL
MOV DL,X
MOV Y,DL ;将值装入Y
JMP COUT
DEL8 ENDP
NMUL:
CALL MUL8
MUL8 proc
MOV AH,01H
INT 21H
MOV CL,AL
SUB AL,30H
MOV BL,0AH
CMP AL,BL ;判断是否小于10
JB MULH
SUB CL,37H;将16进制字符A到F~换成数字
MOV AL,CL
MULH:
MUL X
MOV Y,AL ;将值装入Y
JMP COUT
MUL8 ENDP
NDIV:
CALL DIV8
DIV8 proc
MOV AH,01H
INT 21H
MOV CL,AL
SUB AL,30H
MOV BL,0AH
CMP AL,BL ;判断是否小于10
JB NDIVH
SUB CL,37H;将16进制字符A到F~换成数字
MOV AL,CL
NDIVH: MOV AL,X
DIV CL
MOV Y,AL
JMP COUT
DIV8 ENDP
COUT: ;将结果显示出来
MOV DL,'='
MOV AH,02H
INT 21H
MOV BL,10H ;16用于取模
MOV AH,0
MOV AL,Y
DIV BL
MOV CL,AL
MOV CH,AH
MOV BL,9H
CMP CL,BL ;//判断商是否大于9
JA COUT2
ADD CL,30H
JMP COUT3
COUT2:
ADD CL,37H
COUT3:
MOV DL,CL
MOV AH,02H
INT 21H
MOV BL,9H
CMP CH,BL ;//判断余数是否大于9
JA COUT4
ADD CH,30H
JMP COUT5
COUT4:
ADD CH,37H
COUT5:
MOV DL,CH
MOV AH,02H
INT 21H
MOV DL,'H'
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
JMP START
OPEND2:
MOV AH,4CH
MOV AL,0
INT 21H
CSEG ENDS
END START
4. 操作步骤:(这一步理解为验证程序正确性)。分别对加法减法乘法除法验证其正确性
5.碰到的问题及解决方法:
碰到问题非常 到另一个地方是有限的。
解决方法:
使程序跳转两次,后面补充一条无条件跳转。