数学表达式计算(汇编实现)
2012-11-15 18:08
441 查看
;#Mode=Dos ;Title:数学表达式计算 ;Declare:仅支持 整数(0-65535),+,-,*,/,()运算符 ;Date:2012-11-15 ;author:53101512 ZhongQiang data segment expression db 50,?,40 dup(0),'$';表达式数组 message db 50 dup('*'),0dh,0ah,'Please Input Expression:',0dh,0ah,'$';输入提示 message2 db 0dh,0ah,50 dup('*'),0dh,0ah,'The Answer is: ',0dh,0ah,'$';输出提示 top db 50 dup('*'),0dh,0ah, '*',' Integer(0-65535),Support +,-,*,/,() ','*',0dh,0ah, '*',' example input (45+32)/7-10 ','*',0dh,0ah, '*',' Date: 2012-11-15 ','*',0dh,0ah, '*',' Id: 53101512 ','*',0dh,0ah, '*',' Name: ZhongQiang ','*',0dh,0ah, 50 dup('*'),0dh,0ah,'$' token db ? arg db ? result dw ? ;结果 nozero db 0 ;十进制输出辅助 data ends code segment assume cs:code, ds:data start: mov ax,data mov ds,ax ;说明 lea dx,top call printstring ;输入提示信息 lea dx,message call printstring ;输入算数表达式 lea dx,expression mov ah,0ah int 21h ;表达式解析 lea si,expression add si,2 mov al,[si] inc si mov [token],al call exp mov [result],dx ;输出提示及结果输出 lea dx,message2 call printstring mov bx,result call outputdec ;按任意键返回 mov ah,1 int 21h ;返回DOS mov ah, 4ch 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 [arg],cl call match call term add temp,dx jmp while1 sub_: mov cl,'-' mov [arg],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_ jmp end_ mul_: mov cl,'*' mov [arg],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 [arg],cl call match call factor mov cx,ax mov ax,temp div dl 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 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 lef: mov cl,'(' mov [arg],cl call match call exp mov temp,dx mov cl,')' mov [arg],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,arg je true true: mov al,[si] inc si ret match endp ;十进制输出子程序 outputdec proc push cx mov nozero,0 mov cx,10000 call main mov cx,1000 call main mov cx,100 call main mov cx,10 call main mov cx,1 call main cmp nozero,0 jne ll mov dl,30h call printchar ll: pop cx ret main proc mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al cmp dl,0 jne ll1 cmp nozero,0 jne ll1 jmp ll2 ll1: mov nozero,1 add dl,30h call printchar ll2: ret main endp outputdec endp ;字符串输出子程序 printstring proc mov ah,9 int 21h ret printstring endp ;字符输出子程序 printchar proc mov ah,2 int 21h ret printchar endp code ends end start
相关文章推荐
- 通过入栈出栈实现数学表达式的计算
- Qt计算器开发(一):后缀表达式实现完整数学表达式的计算
- java基于mesp计算和实现数学公式、数学表达式
- 调用编译器接口ICodeCompiler实现数学表达式计算
- CodeDom计算器——动态计算数学表达式的实现
- Clojure: 实现简单的数学表达式计算
- CodeDom计算器——动态计算数学表达式的实现
- 【原创】Delphi实现数学表达式的计算(逆波兰式法)-四则运算解析
- Leetcode 150:Evaluate Reverse Polish Notation(计算逆波兰表达式) --java实现
- 算术表达式计算C实现
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- C++实现表达式的计算
- 计算表达式的值c++逆波兰式实现方法
- 逆波兰表达式 转换和计算 C++实现
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- VC++2012编程演练数据结构《5》堆栈实现解析任意计算表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- C#实现的表达式解析与计算类TExprParser介绍
- 【数据结构】用栈实现对后缀表达式的计算
- Java实现-将普通表达式转换成逆波兰表达式并计算