DSEG SEGMENT
STR1 DB 0AH,0DH, '********************************************$'
STR2 DB 0AH,0DH, '** **$'
STR3 DB 0AH,0DH, '** welcome you ! **$'
STR4 DB 0AH,0DH, '** **$'
STR5 DB 0AH,0DH, '** this is programme of sizeyunshuan **$'
STR6 db 0AH,0DH, '** **$'
STR7 db 0AH,0DH, '** rang(-32768 to 32767) **$'
STR8 DB 0AH,0DH, '** press p to exit ! **$'
STR9 DB 0AH,0DH, '** maker:fishosoul·yu **$'
STR10 DB 0AH,0DH, '********************************************',0AH,0DH,'$'
SIGN1 DW 0 ;判断数字是否输入完毕
SIGN2 DW 0 ;判断括号是否配对
SIGN3 DW 0 ;
NUMB DW 20H DUP(0) ;保存输入的数值
MARK DB 'A' ;保存输入的运算符
DB 10H DUP(0) ;
ERROR DB 'YOUR INPUT ARE WRONG$'
DSEG ENDS
DISP MACRO M
LEA DX,M
MOV AH,9
INT 21H
ENDM
CHOICE MACRO ASC1,HAO1,HH ;宏定义,给运算符赋权值
CMP AL,ASC1 ;
JNE OTHER&HAO1 ;
MOV CH,HH ;
JMP OTHER7 ;
ENDM
CSEG SEGMENT ;
ASSUME CS:CSEG,DS:DSEG
START: CALL CLEAR
MOV AX,DSEG ;
MOV DS,AX ;
LEA DI,NUMB ;
LEA SI,MARK ;
DISP STR1
DISP STR3
DISP STR4
DISP STR5
DISP STR6
DISP STR7
DISP STR8
DISP STR9
DISP STR10
;CALL CLEAR
CALL CR
;disp error
MOV AX,0
MOV DX,0
MOV BX,0
MOV CX,0
STA1 : CALL CR
INPUT: MOV AH,1 ;
INT 21H ;
CMP AL,'P'
JE J_SHU0
CMP AL,'p'
JE J_SHU0
CMP AL,'=' ;
JE PD ;是等号,进一步判断输入括号是否配对
CMP AL,28H ;
JB INPUT ;
CMP AL,39H ;
JA INPUT ;
CMP AL,2FH ;判断是数字还是符号
JBE JUD ;是符号转入响应操作
INC WORD PTR SIGN1 ;将数字标志位加一
SUB AL,30H ;将asc码转16进制
MOV AH,0 ;
XCHG AX,[DI] ;
MOV BX,10 ;
MUL BX ;
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 FUH1 ;
ADD DI,2 ;
MOV WORD PTR SIGN1,0;
FUH1: CALL ADVANCE ;判定优先级,
CMP CH,5 ;判断输入的是否是左括号
JNE PY ;不是则判断输入的是否是右括号
INC WORD PTR SIGN2 ;是左括号,括号标志位1
MOV WORD PTR SIGN3,1;
PY: CMP CH,1 ;判断输入的是否是右括号
JNE AGAIN ;
DEC WORD PTR SIGN2 ;是右括号,括号标志位减1
AGAIN: CMP BYTE PTR[SI],'A';判断运算符存储区是否为空
JE SAVE ;
CMP CH,[SI] ;
JA SAVE ;
CMP BYTE PTR[SI],'('
JNE YIDO
DEC SI
JMP INPUT
YIDO: DEC SI ;
MOV CL,[SI] ;
CALL MATCH ;判断是什么运算符并进行相应的计算
;DEC SI ;
JMP AGAIN ;
Z_Z: JMP INPUT
J_SHU0: JMP J_SHU ;
SAVE: CMP CH,0 ;
JE OVER1 ;
CMP CH,1 ;
JE Z_Z ;“)”不保存,输入下一个数
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 ;
OVER1: JMP OVER ;
MATCH PROC ;子程序,进行相应的运算
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 ;(
OTHER1: CHOICE 29H,2,1 ;)
OTHER2: CHOICE 2AH,3,4 ;*
OTHER3: CHOICE 2FH,4,4 ;/
OTHER4: CHOICE 2BH,5,3 ;+
OTHER5: CHOICE 2DH,6,3 ;-
OTHER6: CHOICE 3DH,7,0 ;=
OTHER7: RET
ADVANCE ENDP
;***清屏***
clear proc near
push ax
push bx
push cx
push dx
mov ah,06h
mov al,00h
mov ch,0
mov cl,0
mov bh,0fH
mov dh,18H