DATAS SEGMENT
STR1 DB 0AH,0DH,'@******************************************@$'
STR2 DB 0AH,0DH,'@* *@$'
STR3 DB 0AH,0DH,'@* Welcome you ! *@$'
STR4 DB 0AH,0DH,'@* This is programe of sizeyunsuan *@$'
STR5 DB 0AH,0DH,'@* Rang(-32768 to 32767) *@$'
STR6 DB 0AH,0DH,'@* JikeB082 Hanyou 200807014225 *@$'
STR7 DB 0AH,0DH,'@* *@$'
STR8 DB 0AH,0DH,'@******************************************@$'
MESG DB 0AH,0DH,'Do you want to continue? (y/n) $'
SIGN1 DW 0 ;判断数字是否输入完毕
SIGN2 DW 0 ;判断括号是否配对
NUMB DW 20 DUP(0) ;保存输入的数值
MARK DB 'M' ;保存输入的运算符
DB 10 DUP(0)
ERROR DB 'YOUR INPUT IS WRONG$'
DATAS ENDS
DISP MACRO STR
LEA DX,STR
MOV AH,9
INT 21H
ENDM
CHOICE MACRO ASC,HAO,H ;宏定义,给运算符赋权值
CMP AL,ASC
JNE OTH&HAO
MOV CH,H
JMP OTH7
ENDM
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
CALL CLEAR
MOV AX,DATAS
MOV DS,AX
LEA DI,NUMB
LEA SI,MARK
DISP STR1
DISP STR2
DISP STR3
DISP STR4
DISP STR5
DISP STR6
DISP STR7
DISP STR8
CALL CR
MOV AX,0
MOV BX,0
MOV CX,0
MOV DX,0
START1:
CALL CR
INPUT:
MOV AH,1
INT 21H
CMP AL,'='
JE PD ;是等号,进一步判断输入括号是否配对
CMP AL,28H
JB INPUT
CMP AL,39H
JA INPUT
CMP AL,2FH ;判断是数字还是符号
JBE JUD ;是符号转入响应操作
INC WORD PTR SIGN1 ;将数字标志位加1
SUB AL,30H ;将ASCII码转16进制
MOV AH,0
XCHG AX,[DI]
MUL BX
MOV BX,10
XCHG AX,[DI]
ADD [DI],AX
JMP INPUT
PD: CMP WORD PTR SIGN2,0 ;判断配对标志位
JE JUD
JMP BC
JUD:CMP WORD PTR SIGN1,0 ;判断数值指针是否已经下移一位
JE FUH
ADD DI,2
MOV WORD PTR SIGN1,0 ;将数字标志位复0
FUH:CALL ADVANCE ;设定优先级
CMP CH,5 ;判断输入的符号是否是左括号
JNE PY ;不是则判断输入的是否是右括号
INC WORD PTR SIGN2 ;是左括号,括号标志位加1
PY:
CMP CH,1 ;判断输入的是否是右括号
JNE AGAIN
DEC WORD PTR SIGN2 ;是右括号,括号标志位减1
AGAIN:
CMP BYTE PTR[SI],'M' ;判断运算符存储区是否为空 如23*56-(8*19)/6+67-8=1322
JE SAVE
CMP CH,[SI] ;[SI]的内容为前一个符号或其权值
JA SAVE
CMP BYTE PTR[SI],'('
JNE YIDO
DEC SI
JMP INPUT
YIDO:
DEC SI
MOV CL,[SI]
CALL MATCH ;判断是什么运算符并进行相应的计算
JMP AGAIN
SAVE:
CMP CH,0 ;判断是否是等号
JE OUTPUT
CMP CH,1
JE INPUT ;“)”不保存,输入下一个数
INC SI
MOV [SI],AL ;保存符号
INC SI
CMP CH,5 ;判断是否是左括号
JNE GO_ON
MOV CH,2 ;改变(的权值
GO_ON:
MOV [SI],CH ;紧跟着保存符号的权值
JMP INPUT
BC: LEA DX,ERROR
MOV AH,9
INT 21H
JMP J_SHU
MATCH PROC NEAR ;子程序,进行相应的运算
PUSH AX
XOR AX,AX
XOR BX,BX
CMP CL,2AH ;乘法运算
JNE NEXT1
SUB DI,2
XCHG BX,[DI]
SUB DI,2
XCHG AX,[DI]
IMUL BX
MOV [DI],AX
ADD DI,2
JMP FINISH
NEXT1:CMP CL,2FH ;除法运算
JNE NEXT2
SUB DI,2
XCHG BX,[DI]
SUB DI,2
XCHG AX,[DI]
CWD
IDIV BX
MOV [DI],AX
ADD DI,2
JMP FINISH
NEXT2:CMP CL,2BH ;加法运算
JNE NEXT3
SUB DI,2
XCHG BX,[DI]
SUB DI,2
ADD [DI],BX
ADD DI,2
JMP FINISH
NEXT3:CMP CL,2DH ;减法运算
JNE FINISH
SUB DI,2
XCHG BX,[DI]
SUB DI,2
SUB [DI],BX
ADD DI,2
FINISH:
POP AX
RET
MATCH ENDP
ADVANCE PROC
CHOICE 28H,1,5 ;(
OTH1:CHOICE 29H,2,1 ;)
OTH2:CHOICE 2AH,3,4 ;*
OTH3:CHOICE 2FH,4,4 ;/
OTH4:CHOICE 2BH,5,3 ;+
OTH5:CHOICE 2DH,6,3 ;-
OTH6:CHOICE 3DH,7,0 ;=
OTH7:RET
ADVANCE ENDP
CLEAR PROC NEAR ;清屏
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,0600H
MOV BH,0FH
MOV CX,0
MOV DX,184FH
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
CLEAR ENDP
CR PROC NEAR ;回车换行
PUSH AX
PUSH DX
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
POP DX
POP AX
RET
CR ENDP
OUTPUT: ;输出运算结果
SUB DI,2
CMP WORD PTR[DI],0
JGE W1
NEG WORD PTR[DI]
MOV DL,'-'
MOV AH,2
INT 21H
W1: MOV BX,10000
MOV CX,5
MOV SI,0
W2: MOV AX,[DI]
CWD
DIV BX
MOV [DI],DX
CMP AL,0
JNE W3
CMP SI,0
JNE W3
CMP CX,1
JE W3
JMP W4
W3: MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
MOV SI,1
W4: MOV AX,BX
MOV DX,0
MOV BX,10
DIV BX
MOV BX,AX
LOOP W2
CALL CR
DISP MESG
MOV AH,1
INT 21H
CMP AL,'n'
JE J_SHU
CMP AL,'N'
JE J_SHU
MOV WORD PTR[DI+2],0
CALL CR
LEA DI,NUMB
LEA SI,MARK
JMP START1
J_SHU:
MOV AH,4CH
INT 21H
CODES ENDS
END START