简单的计算器
一、 题目
编写一个有符号多位十进制数的四则运算计算器程序
二、 目的和要求
编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:
-278+32=
-132――12=
11*-32=
-1234/-18=
要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形
式显示结果,然后允许用户继续键入算式。如果键入算式后再键入‘.’,则显示结
果并结束整个程序。(‘/’为整除)
三、 设计思想
1,定义A,B作为存入两个操作数,H,L存入高位和低位,COUNTA,COUNTB 位
暂存器,存 A,B 的字节数。S 用来存放运算符+|-|*|/,AB 的偏移地址放入[SI],
[SI]的内容即为输入的两个操作数 A,B
2,在 STR1 的提示下,输入一个字符,若为 Q/q 则结束,若为数字 0-9 则放入[SI]
中,程序读出两个操作数 A,B 并将其转换成二进制数进行四则运算。
3,对于减法运算,若被减数比减数小,则交换两操作数进行运算,结果显示为负。
对于除法运算,显示商和余数。
4,最后结果转换成十进制输出
四、 程序流程图
开始
输入一个字符
Q/q
0-9,Q/q?
都不是
判断出错
0-9
再输入一个字符
Q/q
0-9,+|-|*|/
0-9,=,Q/q,+|-|*|/?
都不是
结束
=
输出结果
五、 源程序
STACK SEGMENT STACK 'STACK'
DW 64 DUP(?)
STACK ENDS
DATA SEGMENT
STR1
DB
'JiSuan
A
+
-
*
/
B
',0DH,0AH,'Input
Q
Quit',0dh,0ah,'Please
Input :',0DH,0AH,'$'
STR2 DB 0DH,0AH,'Input error,please input again or quit:',0DH,0AH,'$'
STR3 DB '........$'
AB DB 12 DUP(?)
A DW 0
B DW 0
C DB 15 DUP(?)
C0 DB 14 DUP(?)
C1 DW 0
D DB ?
S DB 0
COUNTA DW ?
COUNTB DW ?
H DW 0
L DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
SL:
MOV AX,DATA
MOV DS,AX
LEA DX,STR1
MOV AH,9
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV S,0
;输出字符串 STR1
;回车换行
;输入一个字符
;为‘Q’或‘q’则终止
;判断数字不在 0 - 9 则出错
;BX 清零
MOV C1,0
LEA SI,AB
MOV AH,1
INT 21H
MOV [SI],AL
MOV D,AL
CMP D,'Q'
JZ Q
CMP D,'q'
JZ Q
CMP AL,30H
JB WR
CMP D,39H
JA WR
MOV BX,0
LOOP1:
INC BX
MOV AH,1
INT 21H
MOV [SI+BX],AL
MOV D,AL
CMP D,'Q'
JZ Q
CMP D,'q'
JZ Q
CMP D,'+'
JZ A1
CMP D,'-'
JZ A1
CMP D,'*'
JZ A1
CMP D,'/'
JZ A1
CMP D,'='
JZ A2
CMP D,' '
JZ A3
CMP D,30H
JB WR
CMP D,39H
JA WR
JMP LOOP1
Q:
JMP QUIT
WR:
LEA DX,STR2
MOV AH,9
INT 21H
JMP SL
A1:
CMP S,0
JNZ WR
DEC BX
;出错则返回重新输入运算式
MOV COUNTA,BX
;取第一个输入的数 A
;将运算符+|-|*|/放入 S
;取第二个输入的数 B
;将 A,B 转换成二进制后进行四则运算
MOV AL,D
MOV S,AL
JMP LOOP1
A2:
CMP S,0
JZ XS0
DEC BX
MOV COUNTB,BX
CALL ASC_BIN
CMP S,'+'
JZ P1
CMP S,'-'
JZ P2
CMP S,'*'
JZ P3
CMP S,'/'
JZ P4
A3:
MOV DL,'='
MOV AH,2
INT 21H
JMP A2
P1:
CALL P01
JMP SL
P2:
CALL P02
JMP SL
P3:
CALL P03
JMP SL
P4:
CALL P04
JMP SL
XS0: LEA SI,AB
ADD SI,BX
MOV AL,'$'
MOV [SI],AL
LEA SI,AB
mov dx,si
MOV AH,9
INT 21H
JMP SL
P01 PROC
;加法,A+B 高位存入 H,低位存入 L
;用来将二进制转换成十进制输出,并返回重新输入运算式
;减法,若 A
MOV L,AX
MOV H,0
CALL XS
RET
P02 ENDP
P03 PROC
MOV DX,0
MOV AX,A
MUL B
MOV L,AX
MOV H,DX
CALL XS
RET
P03 ENDP
P04 PROC
MOV DX,0
MOV AX,A
DIV B
PUSH DX
MOV H,0
MOV L,AX
CALL XS
LEA DX,STR3
MOV AH,9
INT 21H
mov c1,0
POP DX
MOV H,0
MOV L,DX
CALL XS
RET
;乘法,A*B,结果高位存入 H,低位存入 L
;除法,A/B,并显示余数,高位 0 存入 H,低位存入 L
;显示商
;显示余数
P04 ENDP
ASC_BIN PROC
;将十进制转换成二进制
INC COUNTA
MOV CX,COUNTA
MOV AX,0
MOV BX,10
LEA SI,AB
LOOP01: MOV DL,[SI]
AND DL,0FH
MOV [SI],DL
MUL BX
MOV DL,[SI]
MOV DH,0
ADD AX,DX
INC SI
LOOP LOOP01
MOV DX,SI
LEA SI,AB
SUB DX,SI
MOV SI,DX
CMP SI,COUNTA
JNZ LOOP02
MOV A,AX
MOV AX,COUNTB
DEC COUNTA
SUB AX,COUNTA
MOV CX,AX
LEA SI,AB
INC COUNTA
ADD SI,COUNTA
MOV AX,0
JMP LOOP01
LOOP02: MOV B,AX
RET
ASC_BIN ENDP
BIN_ASC PROC
MOV BX,10
LEA DI,C0
LP1:
MOV DX,0
MOV AX,H
CMP AX,0
JZ LP2
DIV BX
MOV H,AX
MOV AX,L
LP2:
LP3:
DIV BX
MOV L,AX
OR DL,30H
MOV [DI],DL
INC DI
INC C1
JMP LP1
MOV AX,L
CMP AX,0
JZ LP4
MOV DX,0
DIV BX
OR DL,30H
MOV [DI],DL
INC DI
INC C1
JMP LP3
LP4:
CMP C1,0
JNZ LP5
MOV AL,30H
MOV [DI],AL
INC C1
LP5:
RET
BIN_ASC ENDP
XS PROC
CALL BIN_ASC
CALL SC
RET
XS ENDP
SC PROC
MOV CX,C1
DEC C1
LEA SI,C0
ADD SI,C1
LEA DI,C
LP:MOV AL,[SI]
MOV [DI],AL
DEC SI
;结果输出