简单的计算器模拟程序的设计和实现Word格式文档下载.docx
《简单的计算器模拟程序的设计和实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《简单的计算器模拟程序的设计和实现Word格式文档下载.docx(26页珍藏版)》请在冰点文库上搜索。
2.2.3.2mult子过程
用于对输入的数字进行乘10累加操作,以便将连续输入的数字字符串转换为相对应的数值。
2.2.3.3trans子过程
将输入的中缀表达式转换为后缀表达式。
2.2.3.4value子过程
将后缀表达式结合堆栈结构进行表达式求值。
2.2.3.5divi子过程
通过除以10以及进一步处理将某数值转换为相应的ASCII字符串。
2.2.3.6print子过程
将表达式求值结果输出到屏幕上。
3.详细的算法描述
3.1.程序运行流程
3.2程序代码
STACKSEGMENTPARASTACK
DW256DUP(0)
STACKENDS
DATASEGMENT
STRIDB50DUP(0)
EXPDB30DUP(0)
TRACKDB30DUP(0)
INSTRDB100DUP(0)
MSG0DB'
pleaseinputtheformular:
0DH,0AH,'
MSG1DB0DH,0AH,'
sorrry,wronginput'
MSG2DB0DH,0AH,'
MSG3DB0DH,0AH,'
divbyzeroerror'
MSG4DB0DH,0AH,'
MSG5DB0DH,0AH,'
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
RET
COMPAREENDP
L2:
MOVAH,8
CALLCOMPARE
CMPAL,3DH;
endwith'
='
JZL2_OVER
MOVAH,39H
CMPAH,AL;
delthewrongdata(>
9)
JNBCONTI
MOVDL,8
CONTI:
CMPAL,28H;
('
JZL2_YES
CMPAL,29H
JZL2_YES;
)'
CMPAL,2AH;
*'
CMPAL,2BH;
'
+'
CMPAL,2DH;
-'
CMPAL,2FH;
/'
backfunction'
<
-'
CMPAL,08H
JNZNO_8
L2_NEXT:
PUSHDX
CMPBX,OFFSETINSTR
DECBX
MOVAL,0
MOV[BX],AL
POPDX
NO_8:
MOVAH,2FH
delthewrongdata(<
0)
JBL2_YES
L2_YES:
MOVDH,DL
CMPDL,20H
JNZL2_NO20
CMPDH,20H
L2_NO20:
INCBX
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
JZL3_29
INCCH
JMPL3_RIGHT
L3_29:
INCCL
MAY_WRONG:
CMPAL,30H
JNBL3_RIGHT
CMPAL,28H
JZL3_RIGHT
CMPAH,29H
cmpah,28h
jzL3_right
CMPAH,30H
MOVDX,OFFSETMSG1
JMPOVER3
L3_RIGHT:
MOVAH,AL
JMPL3
L3_OVER:
CMPCH,CL
JZINPUT_WRIGHT
MOVDX,OFFSETMSG2
chechover
INPUT_WRIGHT:
MOVBX,OFFSETSTRI
read
READ:
movah,1
int21h
MOVAL,[SI];
reservethedatabydecimal{test}
MOVAH,28H;
(
CMPAH,AL
JZIN_STRI
MOVAH,29H;
)
MOVAH,2AH;
*
MOVAH,2BH;
+
MOVAH,2DH;
-
MOVAH,2FH;
/
deletethewronginput
JNBREAD
MOVAH,3DH;
=
MOVAH,39H;
JBREAD
CALLNEARPTRMULT
JMPREAD;
theendofreserve
IN_STRI:
MOVAH,0
CMPAH,[BX]
JZNO_BX;
incbx
NO_BX:
JNZNO_OVER
SUBAL,25;
transplant'
to'
JMPOVER
NO_OVER:
JMPREAD
MULTPROCNEAR;
multdata*10,addup
PUSHCX
PUSHAX
CMP[BX],AH
JZNO_INC_BX
JNBNO_INC_BX
NO_INC_BX:
MOVDX,0
MOVCX,10
MOVAH,[BX]
JBNO_SUB
SUBAH,30H
NO_SUB:
NEXT:
ADDDX,[BX]
LOOPNEXT
SUBAL,30H;
trastodecimal
ADDDL,AL
MOV[BX],DL
ADDAH,30H
POPAX
POPCX
MULTENDP
endofread
OVER:
CALLNEARPTRTRANS;
theoutletoftheprogram
OVER1:
CALLNEARPTRVALUE;
jmpinsteadofretinproceduretrans
OVER2:
CALLNEARPTRPRINT
OVER3:
MOVDX,OFFSETMSG5
CMPAL,1BH
JZOVER4
MOVCX,210
OVER_LOOP:
LOOPOVER_LOOP
MOVDL,0DH
MOVDL,0AH
JMPSTART
OVER4:
MOVAH,4CH
trans
TRANSPROCNEAR;
PUSHBX
PUSHSI
PUSHDI
XORCX,CX
MOVSI,OFFSETEXP
MOVDI,OFFSETTRACK
TRANS_WHILE:
MOVAL,[BX]
MOVAH,24H;
JZTRANS_OVER;
judgeLdigital
JNBNO_DIGITAL
MOV[SI],AL
JMPTRANS_WHILE
NO_DIGITAL:
judgeL'
JNZNO_9
MOV[DI],AL;
pushal
INCDI
NO_9:
JNZNO_0
POP_WHILE:
DECDI
MOVAL,[DI];
popal
MOVAH,28H
JZOVER_POP_WHILE
JMPPOP_WHILE
OVER_POP_WHILE:
moval,dl
NO_0:
MOVAH,2BH
JZOR1_YES
MOVAH,2DH
ifalis'
or'
JNZNO_OR1
OR1_YES:
CMPDI,OFFSETTRACK;
jmpifstackisblank
JZSTACK_BLANK
DECDI;
popal
MOVCL,[DI]
CMPAH,CL
JZOVER_OR1_YES
MOV[SI],CL
JMPOR1_YES
OVER_OR1_YES:
MOV[DI],CL
reservethe'
STACK_BLANK:
NO_OR1:
MOVAH,2AH
JZOR2_YES
JNZNO_OR2;
OR2_YES:
pushdl
JZOR2_YES_OR
JNZOR2_OVER
OR2_YES_OR:
JMPOR2_YES
OR2_OVER:
INCDI;
MOV[DI],AL
NO_OR2:
moval,[bx]
incbx
TRANS_OVER:
CMPDI,OFFSETTRACK
JZPOP_OVER
MOVAL,[DI]
JMPTRANS_OVER
POP_OVER:
MOVAL,24H;
POPDI
POPSI
POPBX
JMPOVER1
TRANSENDP
endoftrans
startvalue
VALUEPROCNEAR;
getthevalue
MOVBX,OFFSETEXP
MOVSI,OFFSETTRACK
VALUE_WHILE:
MOVAH,24H
JZVALUE_OVER
JNBVALUE_NO_DIGITAL
SUBAL,30H
JMPVALUE_WHILE
VALUE_NO_DIGITAL:
JNZNO_ADD
DECSI
MOVDL,[SI]
MOVDH,[SI]
ADDDH,DL
MOV[SI],DH
NO_ADD:
JNZVALUE_NO_SUB
CMPDH,DL
JNBSUB_RIGHT
MOVDX,OFFSETMSG4
SUB_RIGHT:
SUBDH,DL
VALUE_NO_SUB:
JNZNO_MUL
MULDH
NO_MUL:
JNZNO_DIV
XORAH,AH
CMPDH,0
JNZDIV_RIGHT
MOVDX,OFFSETMSG3
DIV_RIGHT:
DIVDH
NO_DIV:
VALUE_OVER:
VALUEENDP
endvalueprocedure
startprint
PRINTPROCNEAR
movdl,al
movah,2
movdl,0dh
movdl,0ah
MOVBX,OFFSETTRACK
CALLNEARPTRDIVI
DECAL
OK:
PRINTENDP;
endofprint
DIVIPROCNEAR;
divdata/10funtion:
printthedata
NEXT1:
MOVBL,0AH
DIVBL
MOVDL,AH
ADDDL,30H
XORDH,DH
INCCX
MOVDH,0H;
judgeLtheend
CMPDH,AL
JNBDIVI_OVER1
JMPNEXT1
DIVI_OVER1:
LOOPDIVI_OVER1
DIVIENDP
endofprint
CODEENDS
ENDSTART
4.测试结果
进行加法运算得到的结果为
进行结果为负数的减法运算
进行除数为0的除法运算
进行加减乘除混合运算
5.使用说明
当进入操作界面后,提示输入正确的表达式,以等号结束,然后程序给出正确结果。
输入的表达式只能含有加减乘除和数字括号,最后以等号结束。
程序计算的结果范围最大为65535,当输入结果超出范围,结果会溢出,给出错误答案。
6.总结
6.1设计过程中的体会
实验中为了模拟简单计算器,需要对输入的ASCII字符串进行处理,首先要将输入的表达式转换为相应的能被识别的正确的表达式,然后,对表达式进行有效处理,将中缀表达式转换为便于计算机计算的后缀表达式。
在进行计算的过程中,利用后缀表达式和堆栈结果是非常容易进行四则混合运算的。
但是,在设计的过程中,如何将中缀表达式转换为后缀表达式,是本实验的一个难点。
在试验的过程中,将中缀式转换成后缀式对我来说相当困难,因此在查阅大量资料和余同学讨论后,才完成相应目的。
因为本实验应用的是汇编语言进行设计,而汇编语言每次只能处理一个有效字符比如运算符,括号等和一个数值比如由ASCII码转换而来的相应的数值。
而且在中缀式向后缀式转换的过程中,也用到了堆栈结构。
6.2设计的优缺点
6.2.1优点
可以进行四则混合运算,并得到结果。
可以提示用户输入错误。
可以正确计算带括号的表达式。
6.2.2缺点
界面没有达到友好,人性化。
支持的数据处理较小。
7.设计体会
这次试验主要是模拟计算器的功能,在试验的过程中,我进一步熟悉了汇编语言的应用,了解到了汇编语言的使用格式和方法。
在程序的编写中,得到了很多同学的帮助,学会了将设计进行分层,简化了设计过程,降低了设计难度。
试验中使用到了算术运算指令,比较运算指令,循环运算指令,跳转指令,使我对这些指令的使用有了自己的体会和理解。
在程序的编写中,将中缀式变成后缀式,键盘输入的ASCII码和十进制数之间的转换,寻址方式与寄存器的结合都是重点内容,在编写的过程中得到了深刻理解。
通过这次实验,我明白了要学习的东西很多,并且要在实践中锻炼自己,提高自己的逻辑思考和编程设计能力。