📄 shixi111.asm
字号:
data segment
opnd dw 100 dup(?)
optr dw 100 dup(?)
topopnd dw ?
topoptr dw ?
flag dw 0
mess db 'REZULT:','$'
op dw ?
ordnum db '+','-','*','/','(',')','#'
ordtable dw 0,0,1,1,1,0,0 ;符号的优先次序
dw 0,0,1,1,1,0,0
dw 0,0,0,0,1,0,0
dw 0,0,0,0,1,0,0
dw 1,1,1,1,1,2,4
dw 0,0,0,0,4,0,0
dw 1,1,1,1,1,4,3
branch_table dw routine_1
dw routine_2
dw routine_3
;dw routine_4
branch_table2 dw routine2_1
dw routine2_2
dw routine2_3
dw routine2_4
data ends
code segment
main proc far
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov si,0
mov di,0
mov optr[di],6d
mov topoptr,0d
newchar: ;输入表达式
mov ah,1h
int 21h
cmp al,30h
jl dealop ; 输入的是运算符号
mov flag,0h
sub al,30h ;ASSCII to binary
cbw
xchg ax,bx ;把二进制转换成十进制
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
dealop: ; 处理运算符号
cmp flag,1h
jz next
mov opnd[si],bx ;把操作数存入opnd
mov topopnd,si
add si,2
next:
mov flag,1h
push si
mov si,0
findnum:
cmp al,ordnum[si]
jz next1
inc si
jmp findnum
next1:
mov ax,si
;cmp ax,6d
;jnz next2
;mov flag1,1
;next2:
;mov bx,topoptr
;cmp optr[bx],6d
;jnz next3
;mov flag2,1
;next3:
;push ax
;mov ax,flag1
;mul flag2
;pop ax
;jnz return;not complete........
mov bx,topoptr
mov op,ax
mov ax,2
mul op
mov si,ax
mov ax,14
mul optr[bx]
mov bx,ax
mov ax,ordtable[bx][si]
cmp ax,3;------------ \\\\\\\\\
jz exit1;--------------\\\\\\\\
mov cx,2
mul cx
mov si,ax
jmp branch_table[si]
exit1:
jmp exit
routine_1:
mov di,topoptr ;初始化操作符栈顶指针
mov si,optr[di]
mov ax,si
mov cx,2
mul cx
mov si,ax
mov bx,0;----------------------------------
jmp branch_table2[si]
routine_2: ;操作符栈顶的弹出
add di,2
mov cx,op
mov optr[di],cx
mov topoptr,di
pop si
mov bx,0;----------------------------------
jmp newchar
routine_3: ;操作数的弹出
sub di,2
pop si
mov bx,0;-----------------------------------
jmp newchar
;routine_4: ;显示字符串
; mov ah,09h
; lea dx,mess
;int 21h
;mov dx,0
;mov bx,opnd[0]
;call binidec
;ret
routine2_1: ;做加法处理
;pop si
mov di,topoptr
sub di,2
mov topoptr,di
mov si,topopnd
mov ax,opnd[si]
add opnd[si-2],ax
sub si,2
mov topopnd,si
add si,2
push si
mov ax,2
mul op
mov si,ax
mov ax,14
mul optr[di]
mov bx,ax
mov ax,ordtable[bx][si]
cmp ax,3;------------ \\\\\\\\\
jz exit2;--------------\\\\\\\\
mov cx,2
mul cx
mov si,ax
jmp branch_table[si]
exit2:
jmp exit
routine2_2:;do '-'
;pop si
mov di,topoptr
sub di,2
mov topoptr,di
mov si,topopnd
mov ax,opnd[si]
sub opnd[si-2],ax
sub si,2
mov topopnd,si
add si,2
push si
mov ax,2
mul op
mov si,ax
mov ax,14
mul optr[di]
mov bx,ax
mov ax,ordtable[bx][si]
cmp ax,3;------------ \\\\\\\\\
jz exit3;--------------\\\\\\\\
mov cx,2
mul cx
mov si,ax
jmp branch_table[si]
exit3:
jmp exit
routine2_3:;do '*'
;pop si
mov di,topoptr
sub di,2
mov topoptr,di
mov si,topopnd
mov ax,opnd[si]
mul opnd[si-2]
mov opnd[si-2],ax
sub si,2
mov topopnd,si
add si,2
push si
mov ax,2
mul op
mov si,ax
mov ax,14
mul optr[di]
mov bx,ax
mov ax,ordtable[bx][si]
cmp ax,3;------------ \\\\\\\\\
jz exit;--------------\\\\\\\\
mov cx,2
mul cx
mov si,ax
jmp branch_table[si]
routine2_4:;do '/'
;pop si
mov di,topoptr
sub di,2
mov topoptr,di
mov si,topopnd
mov ax,opnd[si-2]
mov dx,0
div opnd[si]
mov opnd[si-2],ax
sub si,2
mov topopnd,si
add si,2
push si
mov ax,2
mul op
mov si,ax
mov ax,14
mul optr[di]
mov bx,ax
mov ax,ordtable[bx][si]
cmp ax,3;------------ \\\\\\\\\
jz exit;--------------\\\\\\\\
mov cx,2
mul cx
mov si,ax
jmp branch_table[si]
exit:
mov bx,opnd[0]
call binidec
mov ah,4ch
int 21h
main endp
binidec proc near ;输出处理
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
dec_div proc near ;除法操作
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2h
int 21h
ret
dec_div endp
binidec endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -