简单计算器设计.docx
《简单计算器设计.docx》由会员分享,可在线阅读,更多相关《简单计算器设计.docx(24页珍藏版)》请在冰豆网上搜索。
简单计算器设计
中北大学
课程设计任务书
10/11学年第二学期
学院:
信息与通信工程学院
专业:
自动化
学生姓名:
张欣宇
学号:
0805054116
课程设计题目:
简单计算器设计
起迄日期:
2011年6月20日~2011年6月24日
课程设计地点:
中北大学
指导教师:
张艳兵、张秀艳
系主任:
王忠庆
下达任务书日期:
2011年6月19日
课程设计任务书
1.设计目的:
用汇编语言编程设计一个简单的计算器,实现两个运算数的键盘输入和加减乘除运算,并显示运算结果。
通过设计,掌握键盘输入、屏幕显示和算术运算指令的应用,进一步提高综合运用知识的能力。
2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等):
(1)要求键盘输入2位十进制数,进行加减乘除运算,并在屏幕上显示出运算结果。
(2)选择方案,画出流程图。
(3)编写汇编语言源程序,并调试。
(4)写出设计说明书。
3.设计工作任务及工作量的要求
(1)查阅资料,确定设计方案
对任意给定的正确四则运算表达式,能按照括号、加减乘除计算的优先级,正确计算其结果值并输出。
且能计算的正确数据范围为16位无符号数,即结果只能在0~65535之间,否则错误。
程序无需查错功能,所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为+、-、*、/,表达式以字符"="结束。
根据要求,首先需要从DOS界面输入用户的四则混合表达式,其中包括括号(或),数字,运算符+,-,*,/。
因为用户从键盘输入的是ASCII码,因些需要做相应的转换。
例如将字符串123转化为十进制的值123。
其次,需要对(,),+,-,*,/的优先级进行判断。
(2)画出程序流程图
子过程详细说明
1compare子函数用于判断键盘输入的符号是否合法,若合法,则在屏幕上显示,否则报错
2mult子函数用于对输入的数字进行乘10累加操作,以便将连续输入的数字字符串转换为相对应的数值
3trans子函数核心算法,将输入的中缀表达式转换为后缀表达式
4value子函数核心算法,将后缀表达式结合堆栈结构进行表达式求值
5divi子函数辅助子过程,通过除以10以及进一步处理将某数值转换为相应的ASCII字符串按照个十百位
6print子过程配合divi子过程,将表达式求值结果输出到屏幕上
测试程序:
经过编译,调试,连接
(3)编写并调试汇编语言源程序
用到中断向量表如图所示
STACKSEGMENTPARASTACK
DW256DUP(0)
STACKENDS
DATASEGMENT
STRIDB50DUP(0)
EXPDB30DUP(0)
TRACKDB30DUP(0)
INSTRDB100DUP(0)
MSG0DB'input:
',0DH,0AH,'$'
MSG1DB0DH,0AH,'wrong','$'
MSG2DB0DH,0AH,'(and)doesnotmatch','$'
MSG3DB0DH,0AH,'divbyzeroerror','$'
MSG4DB0DH,0AH,'fushu','$'
MSG5DB0DH,0AH,'anykeytocontinue,esctoexit','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK,DS:
DATA
START:
MOVAX,STACK
MOVSS,AX
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMSG0
MOVAH,9
INT21H
XORAX,AX
;READ
MOVBX,OFFSETINSTR
MOVDL,20H
JMPL2
COMPAREPROCNEAR
CMPAL,0DH
JZL2
MOVDL,AL
MOVAH,2
INT21H
RET
COMPAREENDP
L2:
MOVAH,8
INT21H
CALLCOMPARE
CMPAL,3DH;endwith'='
JZL2_OVER
MOVAH,39H
CMPAH,AL;delthewrongdata(>9)
JNBCONTI
MOVAH,2
MOVDL,8
INT21H
MOVDL,20H
INT21H
MOVDL,8
INT21H
JMPL2
CONTI:
CMPAL,28H;'('
JZL2_YES
CMPAL,29H
JZL2_YES;')'
CMPAL,2AH;'*'
JZL2_YES
CMPAL,2BH;'+'
JZL2_YES
CMPAL,2DH;'-'
JZL2_YES
CMPAL,2FH;'/'
JZL2_YES
;backfunction'<-'
CMPAL,08H
JNZNO_8
L2_NEXT:
PUSHDX
MOVDL,20H
MOVAH,2
INT21H
MOVDL,8
MOVAH,2
INT21H
CMPBX,OFFSETINSTR
JZL2
DECBX
MOVAL,0
MOV[BX],AL
POPDX
JMPL2
;
NO_8:
MOVAH,2FH
CMPAH,AL;delthewrongdata(<0)
JBL2_YES
MOVAH,2
MOVDL,8
INT21H
MOVDL,20H
INT21H
MOVDL,8
INT21H
JMPL2
L2_YES:
MOVDH,DL
MOVDL,AL
CMPDL,20H
JNZL2_NO20
CMPDH,20H
JZL2
L2_NO20:
MOV[BX],AL
INCBX
JMPL2
L2_OVER:
MOVAH,3DH
MOV[BX],AH
;checkinput
MOVSI,OFFSETINSTR
MOVAH,30H
MOVCH,0;record()
MOVCL,0
L3:
MOVAL,[SI]
INCSI
CMPAL,3DH
JZL3_OVER
CMPAL,2AH
JNBMAY_WRONG
CMPAL,29H
JZL3_29
INCCH
JMPL3_RIGHT
L3_29:
INCCL
JMPL3_RIGHT
MAY_WRONG:
CMPAL,30H
JNBL3_RIGHT
CMPAL,28H
JZL3_RIGHT
CMPAH,29H
JZL3_RIGHT
;cmpah,28h
;jzL3_right
CMPAH,30H
JNBL3_RIGHT
MOVDX,OFFSETMSG1
MOVAH,9
INT21H
JMPOVER3
L3_RIGHT:
MOVAH,AL
JMPL3
L3_OVER:
CMPCH,CL
JZINPUT_WRIGHT
MOVDX,OFFSETMSG2
MOVAH,9
INT21H
JMPOVER3
;
;chechover
INPUT_WRIGHT:
MOVBX,OFFSETSTRI
MOVSI,OFFSETINSTR
;read
READ:
;movah,1
;int21h
MOVAL,[SI];reservethedatabydecimal{test}
INCSI
MOVAH,28H;(
CMPAH,AL
JZIN_STRI
MOVAH,29H;)
CMPAH,AL
JZIN_STRI
MOVAH,2AH;*
CMPAH,AL
JZIN_STRI
MOVAH,2BH;+
CMPAH,AL
JZIN_STRI
MOVAH,2DH;-
CMPAH,AL
JZIN_STRI
MOVAH,2FH;/
CMPAH,AL
JZIN_STRI
MOVAH,2FH;deletethewronginput
CMPAH,AL
JNBREAD
MOVAH,3DH;=
CMPAH,AL
JZIN_STRI
MOVAH,39H;deletethewronginput
CMPAH,AL
JBREAD
CALLNEARPTRMULT
JMPREAD;theendofreserve
;
IN_STRI:
MOVAH,0
CMPAH,[BX]
JZNO_BX;incbx
INCBX
NO_BX:
MOV[BX],AL
MOVAH,3DH
CMPAH,AL
JNZNO_OVER
SUBAL,25;transplant'='to'$'
MOV[BX],AL
JMPOVER
NO_OVER:
JMPREAD
MULTPROCNEAR;multdata*10,addup
PUSHDX
PUSHCX
PUSHAX
MOVAH,0
CMP[BX],AH
JZNO_INC_BX
MOVAH,30H
CMP[BX],AH
JNBNO_INC_BX
INCBX
NO_INC_BX:
MOVDX,0
MOVCX,10
MOVAH,[BX]
CMPAH,30H
JBNO_SUB
SUBAH,30H
NO_SUB:
MOV[BX],AH
NEXT:
ADDDX,[BX]
LOOPNEXT
SUBAL,30H;trastodecimal
ADDDL,AL
MOV[BX],DL
MOVAH,[BX]
ADDAH,30H
MOV[BX],AH
POPAX
POPCX
POPDX
RET
MULTENDP
;
;endofread
OVER:
CALLNEARPTRTRANS;theoutletoftheprogram
OVER1:
CALLNEARPTRVALUE;jmpinsteadofretinproceduretrans
OVER2:
CALLNEARPTRPRINT
OVER3:
MOVAH,9
MOVDX,OFFSETMSG5
INT21H
MOVAH,8
INT21H
CMPAL,1BH
JZOVER4
MOVCX,210
MOVBX,OFFSETSTRI
MOVAL,0
OVE