表达式计算器--递归下降
时间: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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28