苏烟蓝色妖姬哪里有卖:汇编编程,编写一个表达式,然后求其值!!

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 16:15:34
要求:编写一个表达式,可以实现“+”,“-”,“*”,“/”,“(”,“)”混合运算(可以使用数据结构栈的思想)。

望各高手不吝赐教,感激至死。。
汇编高手来帮帮我啊,这个问题当真很难?

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
mov dl,4FH
int 10h
mov bh,0
mov dx,0
MOV AH,02H
; MOV DL,0
INT 10H

pop dx
pop cx
pop bx
pop ax
ret
clear endp

;****回车换行****

CR PROC
PUSH AX
PUSH DX
MOV ah,2
MOV dl,13
INT 21H
mov ah,2
MOV dl,10
INT 21H
POP DX
POP AX
RET
CR ENDP

OVER:
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]
MOV DX,0
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

J_SHU1: MOV WORD PTR[DI+2],0
CALL CR
LEA DI,NUMB ;
LEA SI,MARK
JMP STA1
J_SHU: MOV AH,4CH
INT 21H
CSEG ENDS
END START