-
;
本程序实现加减混合运算输入格式必须为
1+2-3=
;
程序思路:
遇到一个操作符执行前一次运算,等号执行最后一次运算,然后保
存本次操作符
;---------
< br>提示信息
------
DISPL
MACRO DI
MOV
AH,9
MOV
DX,DI
INT 21H
ENDM
;-----------
DISP
MACRO V
AR
MOV
AH,2
MOV
DL,V
AR
INT 21H
ENDM
;--------
输入函数
-------
INPUT MACRO
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
DX
MOV
BX,0
CLC
MOV
DX,0
NEXT0:
MOV
AH,1
INT
21H
CMP
AL,2BH
JE
NEXT2
CMP
AL,2DH
JE
NEXT2
CMP
AL,3DH
JE
NEXT2
SUB
AL,30H
JL
NEXT1
CMP
AL,9
JG
NEXT1
MOV
AH,0
XCHG
AX,BX
MOV
CX,10
MUL
CX
ADD
AX,BX
;BX
存放十进制数
;
判断输入是否为
'+'
;
判断输入是否为
'-'
;
判断
‘=’
;
将输入的数转换成
10
进制数
JC
NEXT1
XCHG
AX,BX
JMP
NEXT0
NEXT1:
MOV
DX,0
MOV
BX,0
MOV
DI,
OFFSET
STR
;
提示出错
DISPL
DI
MOV
DI,
OFFSET
DISPL
DI
JMP
NEXT0
NEXT2:
CMP
DX,0
JNZ
NEXT1
CMP
COUNT,1
JE
L0
MOV
BUF0,BX
JMP
L1
L0:
MOV
BUF1,BX
JMP
NEXT3
L1:
MOV
OPER,AL
MOV
COUNT,1
MOV
BX,0
JMP
NEXT0
NEXT3:
CMP
OPER,
'+'
JE
N0
CMP
OPER,
'-'
JE
N1
N0:
MOV
BX,BUF0
ADD
BX,BUF1
MOV
BUF0,BX
CMP
AL,
'='
JE
NEXT4
JMP
L1
N1:
MOV
DX,BUF0
CMP
FLAG
,1
对值
JNE
N
2
XCHG
DX,BUF1
MOV
FLAG
,0
N2: CLC
STR2
;
第一次
输入存到
buf0
以后输入全部存放到
buf1
;
将操作符保存至
oper
;
判读那是何种操作
;
加法相应操作
;
加法操作
p>
;
如果原来
buf0
里的数是负数用
buf1-buf0
的绝
SBB
DX,BUF1
JNC N3
MOV
FLAG
,1
NEG
DX
;
如果相减为负数则存放绝对值
N3:
MOV
BUF0,DX
CMP
AL,
'='
JE
NEXT4
JMP
L1
NEXT4:
CMP
FLAG
,1
JNE
NEXT5
DISP
'-'
;
若果结果为负数输出负号
NEXT5:
CALL
PRINT
POP
DX
POP
CX
POP
BX
POP
AX
ENDM
DATAS
SEGMENT
STR
DB
0AH,0DH,
'$$'
STR0
DB
'please input
arithmetic
expressions:'
,0AH,0DH,
'$$'
STR2
DB
'the num is unexpected,input
again:'
,0AH,0DH,
'$$'
BUF0
DW
?
BUF1
DW
?
FLAG
DB
0
OPER
DB
?
COUNT
D
B
0
DATAS
ENDS
STACKS
SEGMENT
DW
256
DUP
(
?
)
;
此处输入堆栈段代码
STACKS
ENDS
CODES
SEGMENT
ASSUME
CS:CODES,DS:DATAS,SS:STACKS
START
:
MOV
AX,DATAS
MOV
DS,AX
MOV
DI,
OFFSET
STR0
DISPL DI
INPUT
MOV
AH,4CH
INT
21H
;--
---------
显示函数
--------
PRINT PROC NEAR
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
DX
MOV
CX,0
;
记录有效数字位数
MOV
BX,10
;
除
p>
10
取余
MOV
AX,BUF0
LAST:
MOV
DX,0
DIV
BX
PUSH
DX
INC
CX
CMP
AX,0
JNZ
LAST
AGE:
POP
DX
;
出栈输出
OR
DX,30H
MOV
AH,2
INT
21H
LOOP AGE
POP
DX
POP
CX
POP
BX
POP
AX
RET
PRINT ENDP
CODES
ENDS
END
START
DISP
MACRO V
AR
MOV
AH,2
MOV
DL,V
AR
INT 21H
ENDM
DATAS
SEGMENT
DATA0
DB
'PLEASE INPUT
A NUMBER(0-999):'
,
'$$'
DATA1
DB
'
over flow input
again:'
,
'$$'
DATA2
DB
'PLEASE INPUT
ANOTHER NUMBER(EXP:123)'
,
'$$'
DATA3
DB
'PLEASE INPUT AN
OPREATOR:'
,
'$$'
DATA4
DB
'THE OPERATOR IS WRONG
,INPUT
AGAIN:'
,
'$$'
OPER
DB
?
FLAG
DB
0
FLAG1
DB
0
DATA
DW
3
DUP
(
?
)
DATAS
ENDS
STACKS
SEGMENT
DW
256
DUP
(
?
)
STACKS
ENDS
CODES
SEGMENT
ASSUME
CS:CODES,DS:DATAS,SS:STACKS
START
:
MOV
AX,DATAS
MOV
DS,AX
MOV
DI,
OFFSET
DATA0
;
提示信息
CALL DISPL
MOV
SI,0
;SI
作为数组下标
CALL INPUT
CALL NEWLINE
MOV
DI,
OFFSET
DATA3
;
提示信息
CALL DISPL
AGAIN:
MOV
AH,1
;1
号功能输入四则运算符
INT 21H
CMP
AL,
'+'
p>
;
判断输入的是不是
+
,
-
,
*
,
/
JE
NEXT0
CMP
AL,
'-'
JE
NEXT0
CMP
AL,
'*'
JE
NEXT0
CMP
AL,
'/'
JE
NEXT0
CALL NEWLINE
;
输入的运算符不合法,重新输入
MOV
DI,
OFFSET
DATA4
CALL DISPL
JMP
AGAIN
NEXT0:
MOV
OPER,AL
;
保存运算符
CALL NEWLINE
MOV
DI,
OFFSET
DATA2
;
输入第二个操作数