+ -
当前位置:首页 → 问答吧 → 表达式计算器--递归下降

表达式计算器--递归下降

时间:2011-09-01

来源:互联网


以前写的一个计算器,只支持整数

运行截图



Assembly code

;功能:
;    输入一个表达式,计算表达式结果
;    支持 括号、+、-、*、/、%的运算
;    输入为10进制数,单个数值最大为255
;    结果输出为16进制数,最大值为65535
;    如输入 3+6*(8-5)  输出 15h

;作者:
;    bis
;   

data segment
    token db ?
    arg1 db ?
    result dw ?
    res db 10 dup(0)
    expr db 100,?,80 dup(0),'$'
    tip1 db 'Please Input A Expression:',0dh,0ah,'$'
    errord db 'Error!',0dh,0ah,'$'
    crlf db 0dh,0ah
    tip2 db 'Result: $'
   
data ends

code segment
    assume cs:code, ds:data
   
start:
    mov ax,data
    mov ds,ax
   
    mov dx,offset tip1
    mov ah,9
    int 21h
;输入表达式
    mov ah,0ah
    mov dx,offset expr
    int 21h
   
    mov si,offset expr
    add si,2
    mov al,[si]
    inc si
    mov [token],al
    call exp
    mov [result],dx
    mov dx,offset crlf
    mov ah,9
    int 21h
    mov ax,result
    call output
   
    mov ah,1
    int 21h
   
    mov ax, 4c00h
    int 21h
   
exp proc
    local temp:word
    call term
    mov temp,dx
while1:
    cmp al,'+'
    je add_
    cmp al,'-'
    je sub_
   
    jmp end1
add_:
    mov cl,'+'
    mov [arg1],cl
    call match
    call term
    add temp,dx
    jmp while1
sub_:
    mov cl,'-'
    mov [arg1],cl
    call match
    call term
    sub temp,dx
    jmp while1
end1:
    mov dx,temp
    ret
exp endp

term proc
    local temp:word
    call factor
    mov temp,dx
while2:
    cmp al,'*'
    je mul_
    cmp al,'/'
    je div_
    cmp al,'%'
    je mod_
    jmp end_
mul_:
    mov cl,'*'
    mov [arg1],cl
    call match
    call factor
    mov cx,ax
    mov ax,temp
    mul dx
    mov [temp],ax
    mov ax,cx
    jmp while2
   
div_:
    mov cl,'/'
    mov [arg1],cl
    call match
    call factor
    mov cx,ax
    mov ax,temp
    div dl
    xor ah,ah
    mov [temp],ax
    mov ax,cx
    jmp while2
mod_:
    mov cl,'%'
    mov [arg1],cl
    call match
    call factor
    mov cx,ax
    mov ax,temp
    div dl
    mov al,ah
    xor ah,ah
    mov [temp],ax
    mov ax,cx
    jmp while2
end_:
    mov dx,temp
    ret
term endp

factor proc
    local temp:word
    cmp al,'('
    je lef
    cmp al,'0'
    jb err3
    cmp al,'9'
    ja err3
    xor cx,cx
    mov cl,al
    xor ax,ax
while3:
    sub cl,'0'
    mov BL,10
    imul BL
    add ax,cx
    mov cl,[si]
    inc si
    cmp cl,'0'
    jb end3
    cmp cl,'9'
    ja end3
    jmp while3
err3:
    call error
lef:
    mov cl,'('
    mov [arg1],cl
    call match
    call exp
    mov temp,dx
    mov cl,')'
    mov [arg1],cl
    call match
    jmp endx
end3:
    mov dx,ax
    dec si
    mov al,[si]
    inc si
    ret
endx:
    mov dx,temp
    ret
factor endp

match proc
    cmp al,arg1
    je true
    call error
true:
    mov al,[si]
    inc si
    ret
match endp

error proc
    mov dx,offset errord
    mov ah,9
    int 21h
    mov ah,1
    int 21h
    mov ax,4c00h
    int 21h
error endp

output proc
    xor si,si
    mov cl,4
    mov dl,4
getnum:
    cmp dl,0
    je getasc
    mov bl,al
    and bl,0Fh
    mov res[si],bl
    inc si
    shr ax,cl
    dec dl
    jmp getnum
getasc:

    xor si,si
    mov al,res[si]
    mov dl,4
loopasc:
    cmp dl,0
    je outres
    call dig2asc
    mov res[si],al
    inc si
    mov al,res[si]
    dec dl
    jmp loopasc
outres:
    dec si
    mov ah,2
loopout:
    cmp si,0
    je end4_
    mov dl,res[si]
    int 21h
    dec si
    jmp loopout

end4_:
    mov dl,res[si]
    int 21h
    mov dl,'H'
    int 21h
    ret
output endp

dig2asc proc
    cmp al,10
    jae next5
    add al,30h
    jmp end5
next5:
    add al,37h
end5:
    ret
dig2asc endp

code ends
end start



作者: liveeng   发布时间: 2011-09-01

楼主强大,强烈支持!

作者: haojiahuo50401   发布时间: 2011-09-01