汇编语言课程设计四则运算计算器.docx
- 文档编号:11455525
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:20
- 大小:30.90KB
汇编语言课程设计四则运算计算器.docx
《汇编语言课程设计四则运算计算器.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计四则运算计算器.docx(20页珍藏版)》请在冰豆网上搜索。
汇编语言课程设计四则运算计算器
汇编语言课程设计报告
(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,'$'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 课程设计 四则运算 计算器