MyException - 我的异常网
当前位置:我的异常网» 汇编语言 » 求问怎样用汇编编写简易计算器程序,该怎么处理

求问怎样用汇编编写简易计算器程序,该怎么处理

www.MyException.Cn  网友分享于:2013-06-16  浏览:149次
求问怎样用汇编编写简易计算器程序
要求:
输入一个表达式,输出十进制结果,例如:
输入1234+5678-1111*9876/4321
输出13258
注意:表达式中只允许出现+-*/,没有其它运算符,表达式总长度不超过80字符;
运算过程不考虑优先级,一律从左到右;
计算除法时只要商,不要余数;
计算过程中算得的中间值以及最终结果都假定不会超过32位;
程序中可以使用32位寄存器及386指令。

初学汇编,实在是编不粗来,求解答求源码。。。~~~~(>_<)~~~~

------解决方案--------------------
编出来了在masm32下编译通过,测试通过,代码见下
Assembly code

;要求:
;输入一个表达式,输出十进制结果,例如:
;输入1234+5678-1111*9876/4321
;输出13258
;注意:表达式中只允许出现+-*/,没有其它运算符,表达式总长度不超过80字符;
;运算过程不考虑优先级,一律从左到右;
;计算除法时只要商,不要余数;
;计算过程中算得的中间值以及最终结果都假定不会超过32位;
;程序中可以使用32位寄存器及386指令。
 

; 如何编译链接该程序
; 本程序需使用masm32来编译,若你的masm32安装在c盘,请设置如下环境变量
; set include=c:\masm32\include
; set lib=c:\masm32\lib
; set PATH=c:\masm32\bin;%PATH%

; 若本程序名为test.asm,则运行如下命令编译和链接和运行
;ml /c /coff test.asm
; link /subsystem:console test.obj
; test.exe


.386
.model flat,stdcall ; 32 bit memory model
option casemap :none  ; case sensitive

include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

.data
        inBuffer      db    256 dup(?)  ;输入缓冲区
        outBuffer     db    256 dup(?)  ;输出缓冲区
        hOutput       dd    ?
        hInput        dd    ?
        num1          dd    ?            ;被分解的数
        num2          dd    ?            ;被分解的数的平方
        result        dd    ?
        count         dd    ?
        pre_status    dd    ?
        curr_status   dd    ?
        curr_num      dd    ?
        st_comb       dd    ?
        dwLen         dd    ?
        tLen          dd    ?  
        curr_sign     db    ?
        pre_sign      db    ?
        
.const
       szFmtout1        db    '%d',0
       szOutString      db    'Please input a expression',13,10
       
.code

ST_NIL  equ     0  ;初始状态
ST_NUM  equ     1  ;操作数状态
ST_OP   equ     2  ;操作符状态
ST_END  equ     3  ;结束状态


;var_N1: input parameter, the first number
;var_N2: input paramenter, the second number
;var_sign: op sign

calc  proc far C uses ebx ecx, var_N1,var_N2, var_sign
    mov eax,var_N1
    mov edx,var_N2
    mov ecx,var_sign
    
    mov  ebx,edx
check_01:
    cmp  cl, '+'
    jnz  check_02
do_add:
    add  eax,ebx
    jmp  this_exit
check_02:
    cmp cl, '-'
    jnz check_03
do_sub:
    sub eax,ebx
    jmp this_exit
check_03:
    cmp cl, '*'
    jnz check_04
do_mul:
    imul  ebx
    jmp  this_exit
check_04:
    cmp cl, '/'
    jnz err
do_div: 
    xor edx,edx
    idiv ebx
    jmp this_exit
err:
    xor eax,eax 

this_exit:
    ret
calc endp   


;var_string: input parameter,the expression address
;eax: out parameter,  the result
calc_exp  proc far C USES esi edi ebx ecx ,var_string
    mov esi,var_string
    xor eax,eax
    xor ecx,ecx
    mov count,eax
    mov pre_status,ST_NIL
 
 loop_start:
    mov cl,[esi]
    inc esi
cmp_01:
    cmp cl,'0'
    jl  cmp_11
 cmp_02:
    cmp cl,'9'
    jg  cmp_11
case_01: 
    mov curr_status,ST_NUM
    jmp next_02
    
cmp_11:   
    cmp cl,'+'
    jz  case_02
cmp_12:
    cmp cl,'-'
    jz  case_02
cmp_13:  
    cmp cl,'*'
    jz  case_02
cmp_14: 
    cmp cl,'/'
    jz  case_02
    jmp case_03

case_02:
    mov curr_status,ST_OP
    jmp next_02

case_03:
    mov  curr_status,ST_END
    jmp  next_02   
 
next_02:
    mov eax,pre_status
    shl eax,2
    add eax,curr_status
    mov st_comb,eax

check_01:   
    cmp st_comb,ST_NIL*4+ST_NUM     ;  上次状态是ST_NIL,当前状态是ST_NUM
    jnz check_02

case1_01:
    sub  cl,'0'
    mov  curr_num, ecx
    jmp  next_loop

check_02:
    cmp st_comb,ST_OP*4+ST_NUM      ;  上次状态是ST_OP,当前状态是ST_NUM
    jnz check_03
case1_02:
    sub  cl,'0'
    mov  curr_num, ecx
    jmp  next_loop

check_03:
    cmp st_comb,ST_NUM*4+ST_OP     ;  上次状态是ST_NUM,当前状态是ST_OP
    jnz check_04
case1_03:
    mov curr_sign,cl
    cmp count,0
    jnz case1_03_02

case1_03_01:
    mov eax,curr_num
    mov num1,eax
    jmp case1_03_next

case1_03_02:        
    mov edx,curr_num
    mov num2,edx
    mov eax,num1
    mov cl,pre_sign
    invoke calc,eax,edx,ecx
    mov num1,eax

case1_03_next:
    inc count
    mov cl,curr_sign
    mov pre_sign,cl
    jmp next_loop
    
check_04:
    cmp st_comb,ST_NUM*4+ST_END     ;  上次状态是ST_NUM,当前状态是ST_END 
    jnz check_05
    
    cmp count,0
    jnz case1_04_02

case1_04_01:
    mov eax,curr_num
    mov num1,eax
    jmp case1_04_next

case1_04_02:        
    mov edx,curr_num
    mov num2,edx
    mov eax,num1
    mov cl,pre_sign
    invoke calc,eax,edx,ecx
    mov num1,eax

case1_04_next:
    inc count
    jmp this_exit

check_05:
    cmp st_comb,ST_NUM*4+ST_NUM     ;  上次状态是ST_NUM,当前状态是ST_NUM
    jnz check_06

case1_05:
    mov edx,curr_num
    shl edx,1
    lea eax,[edx+edx*4] 
    sub cl,'0'
    movzx edx,cl
    add eax,edx
    mov curr_num,eax
    jmp next_loop

check_06:                       ;  无效的状态,直接退出
    jmp  this_exit              

next_loop:
    mov edx,curr_status
    mov pre_status,edx
    jmp loop_start

this_exit:
    mov eax,num1
    ret
calc_exp endp   

main proc far
start:
    invoke GetStdHandle,STD_OUTPUT_HANDLE   ; 获取控制台输出设备的句柄
    mov    hOutput,eax
    invoke WriteConsole,hOutput,addr szOutString,sizeof szOutString,addr tLen,0
    
    invoke GetStdHandle,STD_INPUT_HANDLE      ; 获取控制台输入设备的句柄
    mov hInput, eax
    invoke ReadFile,hInput,addr inBuffer,sizeof inBuffer,ADDR tLen,NULL

    lea    esi, inBuffer        
    invoke calc_exp,esi      ;转化字符串为一个数
    mov    result, eax      ;将这个数存入number
    
    invoke wsprintf, addr outBuffer , addr szFmtout1,result
    mov    dwLen, eax
    invoke WriteConsole,hOutput,addr outBuffer,dwLen,addr tLen,0
    
    xor eax, eax
    invoke ExitProcess,eax  ;退出进程
    ret 
main endp

end main

文章评论

程序员必看的十大电影
程序员必看的十大电影
编程语言是女人
编程语言是女人
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
我的丈夫是个程序员
我的丈夫是个程序员
程序员应该关注的一些事儿
程序员应该关注的一些事儿
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
每天工作4小时的程序员
每天工作4小时的程序员
Java程序员必看电影
Java程序员必看电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
总结2014中国互联网十大段子
总结2014中国互联网十大段子
 程序员的样子
程序员的样子
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
老程序员的下场
老程序员的下场
程序员的鄙视链
程序员的鄙视链
10个调试和排错的小建议
10个调试和排错的小建议
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
一个程序员的时间管理
一个程序员的时间管理
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
漫画:程序员的工作
漫画:程序员的工作
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
代码女神横空出世
代码女神横空出世
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员都该阅读的书
程序员都该阅读的书
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员和编码员之间的区别
程序员和编码员之间的区别
那些争议最大的编程观点
那些争议最大的编程观点
鲜为人知的编程真相
鲜为人知的编程真相
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
如何成为一名黑客
如何成为一名黑客
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有