总汇编语言计算器课程设计.docx
- 文档编号:6174736
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:15
- 大小:150.42KB
总汇编语言计算器课程设计.docx
《总汇编语言计算器课程设计.docx》由会员分享,可在线阅读,更多相关《总汇编语言计算器课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
总汇编语言计算器课程设计
1.设计目标
运用汇编语言,制作一个计算的程序,实现简单计算器的一般功能,能够在DOS界面下进行简单的加、减、乘、除的简单计算。
程序应有操作提示、输入和输出。
自动闪烁光标,并提示输入信息。
输入正确的数值等符号后可以进行正确的运算,程序计算其结果值并输出。
程序无需查错功能,所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为+、-、*、/,最后结果以十进制数表示。
且程序主界面需为一个由‘*’组成边框的矩形窗口。
汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:
能够直接访问与硬件相关的存储器或I/O端口;能够不受编译器的限制,对生成的二进制代码进行完全的控制;能够对关键代码进行更准确的控制;能够根据特定的应用对代码做最佳的优化,提高运行速度;能够最大限度地发挥硬件的功能。
2.软件设计
2.1程序设计的基本思想
主模块:
首先提供一个主界面,提示用户按要求输入具体的数据和所要进行的操作,输入完毕后给出结果。
如果输入过程中发现非法输入,则立即给与提示,程序自动刷新界面,提示继续输入。
计算显示完毕后,按提示选择是否要继续计算,不选择继续则结束。
对屏幕上输入字符串的接受,为INPUT语句段,见源代码,主要是将数字和运算符分开存放。
MATCH子程序,子程序内有三次跳转,将运算符选择正确的语句进行计算。
由于操作符只有+、-、*、/,没有涉及到括号,不用考虑括号的匹配问题。
流程图如下:
图1主模块流程图
子模块:
完成对数据的进一步加工处理,转换格式并得出结果。
首先根据输入调用对应的“+”、“-”、“*”、“/”四个函数模块,这是本程序的核心模块,其他部分的一些小模块都是为这几个模块服务的,大致的流程图如下图2:
图2子模块流程图
2.2代码
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
DATASEGMENT
OPSDB?
OPDDB?
OPERDB?
TITDB'***********************************',0DH,0AH
DB'*MadeBy*',0DH,0AH;0DH代表回车
DB'*TongXinJiSuanQiXiaoZu*',0DH,0AH;0AH代表换行
DB'*ChangqianZuoxinWangxin*',0DH,0AH
DB'*WangdayongTangkuanlong*',0DH,0AH
DB'*+-*/*',0DH,0AH
DB'*Y,y:
continueN,n:
quit*',0DH,0AH
DB'*************Calculate*************$',0DH,0AH
Tip1DB'Inputthefirstoperator(0---9):
$',0DH,0AH
Tip2DB'Pleaseinputtheoper(+,-,*,/):
$',0DH,0AH
ErrorDB'Error!
Pleseinputtheoperagain:
$',0DH,0AH
Tip3DB'Inputthesecondoperator(0---9):
$',0DH,0AH
ResultDB'--------------->theresultis:
$',0DH,0AH
QuitDB'Chooserepeatorquit?
(Y/y/N/n):
$',0DH,0AH
TsaveDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA;初始化DS:
DX
MOVDS,AX
Remain:
MOVBL,0;Oper(恢复)初始状态
MOVOPS,BL
MOVOPER,BL
MOVOPD,BL
LEASI,OPS;OPS的偏移地址送给SI
LEADI,OPD;OPD的偏移地址送给DI
CALLEnter
LEADX,TIT
MOVAH,9
INT21H
CALLInput1;调用输入第一个操作数
CALLOperat;调用输入操作符
CALLInput2;调用输入第二个操作数
CALLCalculate;调用计算方法
CALLStrQuit;调用判断程序再次执行
MOVAH,1
INT21H
CMPAL,'Y'
JERemain
CMPAL,'y';选择Y返回Remain继续执行
JERemain
CMPAL,'N'
JEEXIT
CMPAL,'n'
JEEXIT
EXIT:
MOVAH,4CH;若不是Y则结束
INT21H
;输入操作数子程序---------------------------------------------------------
Input1PROCNEAR
CALLEnter
LEADX,Tip1;输入第一个操作数提示----------
MOVAH,9
INT21H;十进制输入提示
BCDin1:
MOVAH,1
INT21H
CMPAL,0DH
JEEndBCDin1;等于回车则返回继续输入运算符
CMPAL,30H
JBBCDin1;<0时转exitinD退出
CMPAL,39H
JABCDin1;>9时转exitinD退出
ANDAL,0FH;清除高位
MOV[SI],AL
INCSI
LOOPBCDin1
EndBCDin1:
CALLEnter;回车换行
RET
Input1ENDP
Input2PROCNEAR
CALLEnter
LEADX,Tip3;输入第二个操作数提示----------
MOVAH,9
INT21H;十进制输入提示
BCDin2:
MOVAH,1
INT21H
CMPAL,0DH
JEEndBCDin2;等于回车则返回继续输入运算符
CMPAL,30H
JBBCDin1;<0时转exitinD退出
CMPAL,39H
JABCDin1;>9时转exitinD退出
ANDAL,0FH;清除高位
MOV[SI],AL
INCSI
LOOPBCDin2
EndBCDin2:
CALLEnter;回车换行
RET
Input2ENDP
;输入操作符子程序-------------------------------------------------------
OperatPROCNEAR
ReOperat:
CALLEnter
LEADX,Tip2;输入操作符提示
MOVAH,9
INT21H
MOVAH,1
INT21H
CMPAL,'+'
JEOperSave;若为"+",则存在oper
CMPAL,'-'
JEOperSave
CMPAL,'*'
JEOperSave
CMPAL,'/'
JEOperSave
JMPOperError
OperError:
CALLEnter
LEADX,Error;输入操作符的错误提示
MOVAH,9
INT21H
JMPReOperat
OperSave:
MOVOPER,AL
RET
OperatENDP
;计算方法子程序-----------------------------------------------------
CalculatePROCNEAR
CALLEnter;回车换行
MOVBL,OPER
CMPBL,'+'
JZADCProc;若为加法,则转到adcProc
CMPBL,'-'
JZSUBProc
CMPBL,'*'
JZMULProc
CMPBL,'/'
JZDIVProc
ADCProc:
CALLStrResult;加法
MOVAL,OPS
ADCAL,OPD
CALLDispl
JMPendCalculate
SUBProc:
;减法
CALLStrResult
MOVAL,OPS
SUBAL,OPD
CALLDispl
JMPendCalculate
MULProc:
;乘法
CALLStrResult
MOVAL,OPD
MULOPS
CALLDispl
JMPendCalculate
DIVProc:
;除法
CALLStrResult
MOVAH,0
MOVAL,OPS
DIVOPD
CALLDispl
JMPendCalculate
endCalculate:
RET
CalculateENDP
DisplPROCNEAR
MOVTsave,AL
MOVAH,0
MOVAL,Tsave
MOVBL,100
DIVBL;除以100
CALLOutput;显示百位数
MOVAL,AH
MOVAH,0
MOVBL,10
DIVBL;除以10
CALLOutput;显示十位数
MOVAL,AH
CALLOutput;显示个位数
RET
DisplENDP
StrResultPROCNEAR
LEADX,Result
MOVAH,9
INT21H
RET
StrResultENDP
OutputPROCNEAR;十进制输出
PUSHAX
ADDAL,30H;将AL中的十进制数变成ASCII码
MOVDL,AL
MOVAH,2
INT21H
POPAX
RET
OutputENDP
;回车换行子程序--------------------------------------------------
EnterPROCNEAR
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
RET
EnterENDP
;判断程序再次执行子程序-----------------------------------------------
StrQuitPROCNEAR
CALLEnter;回车换行
LEADX,Quit
MOVAH,9
INT21H
RET
StrQuitENDP
CODEENDS
ENDSTART
3.系统调试
3.1测试目标
(1)在屏幕上显示一个由‘*’组成边框的矩形窗口;
(2)自动闪烁光标,并提示输入信息;
(3)能够完成单项表达式的输入、显示和运算;
(4)编制并调试出程序。
3.2测试方法及结果
单击开始,启动运行,输入cmd,启动命令提示符,进入DOS系统。
如下图:
图3启动命令提示符
源程序名存为qian.asm,在dos下进入F盘,再cdmasm进入masm文件夹,再键入masmqian(qian是源程序文件名)提示是否更改文件名(不改直接回车),系统会提示是否生成.lst文件和.crf文件(直接回车跳过),这样就生成了qian.obj键入linkqian(qian是源程序文件名),提示是否更改文件名(不改直接回车)提示是否生成.map和.lib文件(直接回车),这样就生成了qian.exe,再在DOS下键入qian(源程序文件名)就进入程序执行。
如图4:
图4执行方法
在计算器内,输入数字测试本程序的正确与否。
按照提示输入第一个十进制数,如“6”,回车。
下一步,会提示请输入运算符,如加“+”,回车。
最后一步,输入第二个十进制数,如“3”,回车。
则显示出其运算结果。
如下图5所示:
图5实现加法运算
同上,可实现减法、乘法、除法运算,分别如图6,图7,图所示8:
图6实现减法运算
图7实现乘法运算
图8实现除法运算
运算完毕后,会提示是否继续下一个运算,输入“Y”则继续运算,并返回主界面,输入“N”则结束程序。
当运算符输入不合法时,则会提示重新输入运算符,如下图9:
图9错误提示
4.总结
设计的这个程序主要是进行表达式的四则运算,由于操作符只有+、-、*、/,没有涉及到括号,因此设计起来要容易一点,不用考虑括号的匹配问题。
另外,跳转时汇编语言的一大难点,再编程之前最好要画出流程图,这样在写跳转时不容易出错,且不会出现重复操作语句段。
输入部分看似简单,实际要考虑到很多细。
比如一开始没想到存入的数据可能会符号存进内存后的相同;如何判段存数算法应该结束,对应的存入数和符号。
编写的五个子程序经编译、链接后,没有发现错误,可设计出的计算器程序出现一些不足,如本计算器只能进行一位十进制数的计算,也很少在计算的优先级,进制转化之间下功夫,致使计算器运算能力不足。
还有本程序只能判断输入的运算符的合法性,不能判断输入的十进制数的正确与否,即使错误,也显示提示下一步的操作。
参考文献
[1]詹仕华.汇编语言程序设计[M].北京:
中国电力出版社,2008.2:
73-102
[2]宋彩莉,王禾.汇编语言程序设计学习指导[M].西安:
西安交通大学出版社,2008.2:
45-87
[3]李敬兆,陈子旭.汇编语言程序设计[M].合肥:
中国科学技术大学出版社,2008.9:
173-197
[4]钱晓捷,周玲.新汇编语言程序设计[M].北京:
电子工业出版社,2006.3:
101-120
[5]周佩玲,彭虎,傅忠谦.微机原理与借口技术[M].北京:
电子工业出版社,2007.1:
113-141
[6]马春燕.微机原理与接口技术(基于32位机)实验与学习辅导[M].北京:
电子工业出版社,2007.1:
23-70
[7]何小海,严华.微机原理与借口技术[M].北京:
科学出版社,2006.7:
143-180
[8]王爽,胡雄.汇编语言[M].北京:
清华大学出版社,2009.9:
29-70
[9]曹加恒,谢子殿.新一代汇编语言课程设计[M].北京:
高等教育出版社,2006.3:
113-138
[10]杨路明.汇编语言程序设计[M].长沙:
中南大学出版社,2008.5:
173-203
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 计算器 课程设计