简单的计算器模拟程序的设计和实现Word格式文档下载.docx

上传人:b****2 文档编号:1002568 上传时间:2023-04-30 格式:DOCX 页数:26 大小:119.16KB
下载 相关 举报
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第1页
第1页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第2页
第2页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第3页
第3页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第4页
第4页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第5页
第5页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第6页
第6页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第7页
第7页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第8页
第8页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第9页
第9页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第10页
第10页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第11页
第11页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第12页
第12页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第13页
第13页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第14页
第14页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第15页
第15页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第16页
第16页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第17页
第17页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第18页
第18页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第19页
第19页 / 共26页
简单的计算器模拟程序的设计和实现Word格式文档下载.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

简单的计算器模拟程序的设计和实现Word格式文档下载.docx

《简单的计算器模拟程序的设计和实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《简单的计算器模拟程序的设计和实现Word格式文档下载.docx(26页珍藏版)》请在冰点文库上搜索。

简单的计算器模拟程序的设计和实现Word格式文档下载.docx

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码和十进制数之间的转换,寻址方式与寄存器的结合都是重点内容,在编写的过程中得到了深刻理解。

通过这次实验,我明白了要学习的东西很多,并且要在实践中锻炼自己,提高自己的逻辑思考和编程设计能力。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2