汇编语言课程设计四则运算计算器.docx

上传人:b****8 文档编号:11455525 上传时间:2023-03-01 格式:DOCX 页数:20 大小:30.90KB
下载 相关 举报
汇编语言课程设计四则运算计算器.docx_第1页
第1页 / 共20页
汇编语言课程设计四则运算计算器.docx_第2页
第2页 / 共20页
汇编语言课程设计四则运算计算器.docx_第3页
第3页 / 共20页
汇编语言课程设计四则运算计算器.docx_第4页
第4页 / 共20页
汇编语言课程设计四则运算计算器.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

汇编语言课程设计四则运算计算器.docx

《汇编语言课程设计四则运算计算器.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计四则运算计算器.docx(20页珍藏版)》请在冰豆网上搜索。

汇编语言课程设计四则运算计算器.docx

汇编语言课程设计四则运算计算器

汇编语言课程设计报告

(2012--2013年度第1学期)

实验名称:

实现加减乘除四则运算的计算器

专业生物医学工程

学生姓名周炳威

班级B100904

学号B10090406

指导教师乐洋

实现加减乘除四则运算的计算器

1实验目的

深化学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。

通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用

2实验内容

课题名称:

实现加减乘除四则运算的计算器

主要功能:

实现一个简单的计算器,要求:

编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。

计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。

3实现方法

本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。

由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。

此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。

第一步,用INT21H的1号功能调用来进行输入。

利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。

我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。

在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。

第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+'号、‘-'号、‘*'号、‘/'号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。

第三步,根据计算器程序所要实现的功能完成各个功能模块。

设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。

子模块中包含有:

do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div除法运算模块,input输入模块等。

最后还要对这个简易计算器进行功能完善。

为了使程序符合我们使用者的操作习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是‘='符号键

时,程序依据输入的算式进行计算,并将结果显示在屏幕上。

如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。

在各个

子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算器。

3.2程序流程图及说明

此程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。

程序流程图说明:

通过流程图,可以看出程序开始运行时,首先输出提示语句,当用户输入后,程序根据所输入的内容进行判断,通过判断的结果来决定调用哪个功能模块,首先要判断输入的字符是否为Q或q,若是,则退出程序,不是则继续输入。

还要判断输入的是否为0--9,‘+',‘-‘*‘/'这些字符,若不是会报

错,是则将根据运算符号调用相应的功能模块完成运算。

最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。

源程序清单

B_P

EQUBYTEPTR

W_P

EQUWORDPTR

D_P

EQUDWORDPTR

CODE

SEGMENT

ASSUMECS:

CODE,DS:

CODE

ORG100H

;主程序开始

NEWSTAR:

JMPSTAR

EVEN

NUM1

DW0,0

NUM2

DW0,0

NUM3

DW0,0

JGV4

DW0,0

YSF

LABELWORD

YSF1

DB0

YSF2

DB0

JUV

DB0

UV

DB0

;使DS:

SI指向第一有效字符

OVERSLABELNEAR

CLD

PUSHAX

OVERS1:

LODSB

CMPAL,''

JZOVERS1

CMPAL,9

JZOVERS1

DECSI

CMPAL,13

POPAX

RET

;输出一个制表符

TABLABELNEAR

MOVAL,9

JMPSHORTDISP

;输出一个回车换行符

CRLF

LABELNEAR

MOVAL,13

CALLDISP

MOVAL,10

;显示一个字符

DISP

LABELNEAR

PUSHAX

PUSHDX

MOVAH,2

MOVDL,AL

INT21H

POPDX

POPAX

RET

;检查是否为运算符

ISYSF

LABELNEAR

CLD

LODSB

CALLISJJ

JZISYSF1

CALLISII

JZISYSF1DECSI

ISYSF1:

RET

;检查是否是加减运算

ISJJ

LABELNEAR

CMPAL,'+'

JZISYSF1

CMPAL,'-'

RET

;检查是否为乘除运算

ISII

LABELNEAR

CMPAL,'*'

JZISYSF1

CMPAL,'/'

JZISYSF1

CMPAL,'\'

RET

;数据输出

;CX=10十进制

;CX=16十六进制

DOUT

LABELNEAR

PUSHAX

PUSHBX

PUSHDX

PUSHBP

XORBP,BP

D0UT1:

INCBP

PUSHAX

MOVAX,DXXORDX,DXDIVCX

MOVBX,AX

POPAX

DIVCX

PUSHDX

MOVDX,BXORBX,AXJNZDOUT1

DOUT2:

POPAX

ADDAL,'0'

CMPAL,9

JBEDOUT3

ADDAL,'A'-'9'-1

DOUT3:

CALLDISP

DECBP

JNZDOUT2

POPBP

POPDX

POPBX

POPAX

RET

;输入数据在DX:

A)中返回

;CX=0数据为10进制

;CX#0数据为16进制

DATE

LABELNEAR

PUSHBX

PUSHBP

PUSHDI

XORAX,AX

XORDX,DX

DATE1:

MOVDI,AXLODSB

CMPAL,'0'

JBDATE7

CMPAL,9

JADATE6

DATE2:

ANDAX,0FH

SHLDI,1

RCLDX,1

MOVBX,DI

MOVBP,DX

SHLDI,1

RCLDX,1

SHLDI,1

RCLDX,1

JCXZDATE3

SHLDI,1

RCLDX,1

JmpshortDATE4

DATE3:

ADDDI,BX

ADCDX,BP

DATE4:

ADDAX,DI

ADCDX,0

JMPDATE1

DATE5:

ADDAL,9

JMPDATE2

DATE6:

JCXZDATE7

CMPAL,'A'

JBDATE7

CMPAL,'F'

JBEDATE5

CMPAL,'a'

JBDATE7

CMPAL,'f

JBEDATE5

DATE7:

MOVAX,DI

DECSI

ORDI,DX

POPDI

POPBP

POPBX

RET

;数据1与数据2根据YSF进行加减运算

JSJJ

LABELNEAR

MOVAX,NUM2

MOVDX,NUM2+2

CMPYSF1,'+'

JZJSJJ1

SUBNUM1,AX

SBBNUM1+2,DX

JMPSHORTJSJJ2

JSJJ1:

ADDNUM1,AX

ADCNUM1+2,DX

JSJJ2:

RET

;数据1与数据2根据YSF进行乘除运算

JSII1

LABELNEAR

MOVBX,OFFSETNUM1

JMPSHORTJSII21

;数据2与数据3根据YSF2进行乘除运算

JSII2

LABELNEAR

MOVBX,OFFSETNUM2

JSII2_1:

DB66H

MOVAX,[BX]

DB66H

MOVCX,[BX+4]

CMPYSF2,'*'

JNZJSII2_2

DB66H

IMULCX

JMPSHORTJSII2_3

JSII2_2:

DB66H

CWD

DB66H

IDIVCX

CMPYSF2,'/'

JZJSII2_3

DB66H

XCHGDX,AX

JSII2_3:

DB66H

MOV[BX],AX

RET

;显示结果

XUJG

LABELNEAR

MOVAX,JGV4

MOVDX,JGV4+2

MOVCX,10

CMPUV,10

JZXUJG0

MOVCX,16

XUJGO:

TESTDX,8000H

JZXUJG1

CMPUV,10

JZXUJG2

CALLDOUT

XUJG2:

NOTAX

NOTDX

ADDAX,1

ADCDX,0

PUSHAX

CMPUV,10

JZXUJG3

MOVAL,''

CALLDISP

MOVAL,'('

CALLDISP

XUJG3:

MOVAL,'-'

CALLDISP

POPAX

CMPUV,10

JZXUJG1

CALLDOUT

MOVAL,')'

CALLDISP

RET

XUJG1:

CALLDOUT

RET

;计算结果放入DX:

AX中

JSJGLABELNEAR

CALLJSJJ

MOVAX,NUM1

MOVDX,NUM1+2

RET

;从DS:

SI处取一个数据

LOADATELABELNEAR

LODSB

CMPAL,'('

JZLOADATE1

DECSI

PUSHCX

XORCX,CX

CMPUV,10

JZLOADATE0

INCCX

LOADATE0:

CALLDATE

POPCX

RET

LOADATE1:

PUSHNUM1

PUSHNUM1+2

PUSHNUM2

PUSHNUM2+2

PUSHYSF

INCJUV

MOVJGV4,0

MOVJGV4+2,0

;进行四则运算

SZYSLABELNEAR

CALLISYSF

JZSZYS2

CALLLOADATE

MOVNUM1,AX

MOVNUM1+2QX

SZYS1:

XORAX,AX

MOVNUM2,AX

MOVNUM2+2,AX

CALLISYSF

JZSZYS3

JNZSZYS6

SZYS2:

PUSHAX

;取16进制数

;取数据放入DX:

AX中

;保存数据1数据2及运算符

;结果值清零

;首字符是运算符?

;不是,取数并保存

;数据2清零

;下个是运算符?

;将结果作为数据1

MOVAX,JGV4

MOVNUM1,AX

SZYS3:

MOVAXJGV4+2

MOVNUM1+2,AX

POPAX

MOVYSF1,AL

MOVYSF2,AL

CALLISJJ

JZSZYS4

;是加减运算转

CALLLOADATE

MOVNUM2,AX

MOVNUM2+2QX

;取数据2

算算

CALLJSII1

;数据1与数据2根据YSF进行乘除运

SZYS4:

JMPSZYS1

;结果保存在数据1中

SZYS4_1:

CALLLOADATE

MOVNUM2,AX

MOVNUM2+2QX

CALLISYSF

JNZSZYS6

;取数据2并保存

CALLISJJ

;运算符2是加减运算?

JNZSZYS5

PUSHAX

;不是转

算算

CALLJSJJ

;数据1与数据2根据YSF14行加减运

POPAX

;结果保存在数据1中

SZYS5:

MOVYSF1,AL

JMPSZYS4

;保存新的运算符

MOVYSF2,AL

;保存运算符2

CALLLOADATE

MOVNUM3,AX

MOVNUM3+2QX

;取数据3

CALLJSII2

;数据2与数据3根据YSF2t行乘除运

JMPSZYS41

结果保存在数据2中

SZYS6:

MOVCL,AL

CMPAL,13

JNZSZYS9

SZYS7:

CALLJSJG

CMPJUV,0

JZSZYS8

DECJUV

POPYSF

POPNUM2+2

POPNUM2

POPNUM1+2

POPNUM1

RET

SZYS8:

CMPCL,')'

JZSZYS10

MOVJGV4,AX

MOVJGV4+2QX

JNZSZYS12

SZYS9:

CMPAL,')'

JNZSZYS11

INCSI

JMPSZYS7

SZYS10:

MOVNUM1,AX

MOVNUM1+2QX

JMPSZYS1

SZYS11:

STC

RET

SZYS12:

CLC

RET

;数制处理

UVIL

LABELNEAR

PUSHSI

UVIL1:

LODSB

CMPAL,''

JZUVIL2

CMPAL,9

JZUVIL2

CMPAL,13

JZUVIL4

JNZUVIL1

UVIL2:

MOVBX,SICALLOVERSJZUVIL3

LODSW

CALLOVERS

POPSI

JNZSZYS11

CMPAX,'O1'

JNZSZYS11

PUSHSI

MOVUV,10

UVIL3:

MOVAL,13

MOV[BX-1],AL

UVIL4:

POPSI

CLC

RET

;预置结果

YVJG

LABELNEAR

MOVAH,52H

INT21H

MOVAX,ES:

[BX-2]

MOVDS,AX

MOVAX,DS:

[0CH]

MOVCS:

JGV4,AX

MOVAX,DS:

[0EH]

MOVCS:

JGV4+2,AX

PUSHCS

POPDS

PUSHCS

POPES

RET

;保存结果

BCJG

LABELNEAR

MOVAH,52H

INT21H

MOVAX,ES:

[BX-2]

MOVDS,AX

MOVAX,CS:

JGV4

MOVDS:

[0CH],AX

MOVAX,CS:

JGV4+2

MOVDS:

[0EH],AX

PUSHCS

POPDS

PUSHCS

POPES

RET

STAR:

MOVSI,81H

CLD

CALLOVERS

JNZSTAR1

STARO:

MOVDX,OFFSETMESS1

JMPSTAR4

STAR1:

CALLYVJG

CALLUVIL

JBSTAR0

MOVSAVESP,SP

CALLSZYS

MOVSP,SAVESP

MOVDX,OFFSETMESS2

JBSTAR4

CALLCRLF

CALLXUJG

CALLBCJG

MOVDX,OFFSETMESS3

STAR4:

MOVAH,9

INT21H

INT20H

SAVESP

DW0

MESS1

DB

13,10,'

Syntax:

',13,10

DB'

JSvExpression>

MESS2

DB

'Errorin

expression!

$'

MESS3

DB

13,10,'$'

CODE

ENDS

ENDNEWSTAR

[10]',13,10,'$'

 

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1