8086汇编语言实现不扩展字节的四则运算

本文介绍了一个十六进制四则运算器的设计思路,该运算器通过键盘输入十六进制表达式,在屏幕上显示结果,支持连续运算直至按下ESC键。文章详细解释了加法的实现过程,包括输入检测、运算执行和结果显示,其他运算类似。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计一个四则运算器,从键盘输入十六进制表达式,在屏幕上显示结果,可以一直运算,直到按下ESC键。(如果是除法则舍去余数,显示整数值,类似C语言整数的除法,采用原码运算的方法,故不支持负数运算)

 

  1. 解题思路:

这里只举例加法的设计思路,另外三则运算类似,先比较输入是否为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。对应为,就不详细解读了

  1. 流程图

  1. 程序

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.碰到的问题及解决方法:

碰到问题非常  到另一个地方是有限的

解决方法:

使程序跳转两次,后面补充一条无条件跳转。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值