混合算术运算的实现.docx
- 文档编号:11111025
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:27
- 大小:102.90KB
混合算术运算的实现.docx
《混合算术运算的实现.docx》由会员分享,可在线阅读,更多相关《混合算术运算的实现.docx(27页珍藏版)》请在冰点文库上搜索。
混合算术运算的实现
课程设计报告
课程微机原理课程设计
题目混合算术运算的实现
系别物理与电子工程学院
年级08级专业电子科学与技术
班级三学号04061011
学生姓名章维赵峰张浩张崇光
指导教师居伟骏职称讲师
设计时间2011-4-18~2011-4-22
目录
前言2
第一章题目3
1.1题目名称3
1.2题目内容及要求3
第二章分析与设计4
2.1题目要求4
2.2程序功能拓展设想4
2.3方案设计与论证4
2.4程序结构框图等设计5
第三章汇编程序设计7
3.1代码结构分析7
3.2汇编代码设计7
3.2.1程序初始化7
3.2.2键盘输入模块8
3.2.3输入数据判断9
3.2.4算术运算11
3.2.5运算结果输出13
3.3实验结果15
第四章总结与体会16
参考文献17
附录18
前言
电子数字计算机是20世纪最重大的科技成就之一。
自1946年第一台电子计算机问世以来,计算机得到迅速发展,并已广泛应用于工农业生产、科学研究、国防及人们日常生活的各个领域。
伴随人类进入21世纪,以高科技革命为支撑的信息化社会已经到来,以“信息”为主导的新兴产业正在全球经济领域掀起一场空前的革命。
“知识”是这场革命的直接推动力,而计算机及其应用技术则是知识经济的基础,掌握计算机知识和应用能力的多少,已成为衡量现代人文化水平高低的一个重要标志。
随着信息化时代的到来,计算机技术的进一步发展和应用必将对社会发展和人类文明产生更大的促进作用,对社会政治、经济、文化和人类生活的各个方面都将产生巨大而深远的影响。
[1]
“微机计算机原理及应用”是高等学校计算机及相关专业一门非常重要的专业基础课,同时也是一门发展迅速、与实践结合紧密的学科。
基于计算机即微型机的微机原理课程设计是一项具有重要实践意义的课程设计。
首先我们必须了解微机的指令系统。
指令是计算机用以控制各个部件协调动作的指令。
一台计算机所具有的全部指令称为机器的指令系统,它全面描述了微处理器的功能,因此在其他条件相同时,指令系统功能越强,计算机的功能就越强。
而这次课程设计所采用的编程语言则是汇编语言,汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用符号或标号代表地址、常量或标量。
助记符一般都是英文单词的缩写,便于识别和记忆。
使用汇编语言编写的程序称为汇编语言源程序。
汇编语言源程序一般不能由机器直接执行,而必须翻译成由机器代码组成的目标程序,这个翻译过程称为汇编。
把汇编语言源程序翻译成目标程序的软件称为汇编程序。
汇编语言与机器语言密切相关,它们之间有明显的对应关系。
一条汇编语言指令对应一条机器语言代码,所以汇编语言和机器语言一样都是面向机器的语言。
使用汇编语言进行程序设计能充分利用机器的硬件功能和结构特点,从而有效地加快程序的执行速度,减少程序占用的存储空间。
所以汇编语言大量用于编写计算机系统程序、实时通信程序和实时控制程序等。
第一章题目
1.1题目名称
混合算术运算的实现
1.2题目内容及要求
题目内容:
任意输入4个一位无符号十进制数,它们之间用“+”,“-”,“*”号任意连接成为一个简单的算术运算式,要求按照算术运算法则计算得到正确结果。
要求有输入提示信息,并且当输入算式不符合要求时能够输出提示信息,并要求重新输入。
此过程自动重复进行,直到用户键盘输入“$”符号时程序退出。
第二章分析与设计
2.1题目要求
1.判断输入数字及运算符号正误,首字符为数字位,数字与符号间隔输入;如果输入有错误则应有相应错误提示并可重新输入;
2.判断算术运算的优先级,及乘法优先于加和减法,而加法和减法优先级相同;
3.可在屏幕显示正确的运算结果;
4.程序可自动重复运行,直到输入“$”终止;
5.要求程序结构设计合理;
6.汇编语言语法正确,程序语句使用得当;
7.适当追求汇编语言的编程技巧;
8.适当优化程序代码,提高程序运行效率。
2.2程序功能拓展设想
1.增加错误提示功能,如输入运算式超过4位等;
2.正确数据回显功能,即如果用户输入错误则将该次输入运算式前面正确输入部分重新显示,用户只需重新输入前一步输入错误的数据或符号;
3.对程序界面友好及功能完善的其它功能。
2.3方案设计与论证
1.考虑到错误输入情况,如符号与符号不能连在一起,数字不能超过一位,第一位输入的必须为数字等,在错误输入情况下有提示,并能重新输入;
2.在进行多位数字的混合运算时,乘法的优先权大于加法和减法,必须先找出乘号,然后对乘号两边的数进行乘法计算;
3.用“=”判断数字是否输入完毕,定义一个数据存储区存储数据,能从后向前检验“*”。
当没有“*”时,按照“+、-”运算符的左右顺序从左到右进行“+、-”运算,当最后遇到等号“=”时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式;
4.如果用户已经输入4个数字和3个符号,即运算式已经输入完毕,则等待用户输入“=”,输出运算结果;
5.如果用户输入错误,程序应该提示输入错误信息并能将用户之前输入的正确数据,包括数字和符号重新输出到屏幕,直到用户输入正确,而不必因为一次错误输入就得重新输入运算式;
6.程序可以自动重复进行运算,这就要求每次运算后置零数据存储区;
7.由于运算的结果位数不确定,要设计一个能一位位显示结果的输出程序;
8.输出“=”则自动计算运算式并显示运算结果,输入“$”符号则退出程序;
2.4程序结构框图等设计
图1程序流程图
第三章汇编程序设计
3.1代码结构分析
实现该程序功能的汇编代码可总体分为四个部分:
用户键盘输入、数据判断、算术运算、系统屏幕输出计算结果。
用户键盘输入功能实现可采取调用1号系统功能的方法输入单字符,然后根据需要决定是否将键盘输入的ASCII码转换为数字等。
判断输入是否合法,程序设计相应的判断机制,确保识别用户输入的错误数据并能反馈相应出错提示,直到用户输入完正确数据。
算数运算模块则通过程序判断运算优先级,以乘法为最高优先级,加法和减法优先级相同。
运算结果的显示功能我们可以再次调用2号系统功能输出单字符,这里需要注意的是:
如果运算结果是多位数,如何按顺序输出运算结果的每一位数。
3.2汇编代码设计
3.2.1程序初始化
程序初始化的部分主要包括数据段定义,堆栈段定义以及代码段开始部分的相关通用寄存器的初始化等。
代码如下:
START:
MOVAX,DATAS
MOVDS,AX
DISPMESG_W;显示欢迎界面
BEGIN:
LEADI,SHUJU;装入有效地址
INCDI
MOVAX,0;初始化寄存器
MOVBX,0
MOVCX,0
MOVDX,0
DISPMESG_I;显示输入提示
DISPMESG_E
3.2.2键盘输入模块
键盘输入模块主要调用1号系统功能,实现单字符的输入功能。
代码包括两个部分,即数据的输入和符号的输入。
且数字和符号交替输入,即用户第一次输入为数字,第二次输入为符号,第三次输入再次为数字,如此往复输入,直到输入“$”程序终止,或“=”号输出运算结果。
遇到用户已经输入4个数字和3个运算符号的情况则等待直到用户输入“=”,然后输出运算结果。
代码如下:
INPUT_NUMBER:
;数据输入
MOVAH,1;1号系统功能调用
INT21H
CMPAL,'$';用户是否输入$
JEZZ1;等于/结果为0转移
CMPAL,30H;减法比较,和0比较
JBWRONG;低于转移
CMPAL,39H;和9比较
JAWRONG;高于转移
JMPSAVE_N;用户输入合法,保存数据
INPUT_SIGN:
;符号输入
MOVAH,1;1号系统功能调用
INT21H
CMPAL,'$';用户是否输入$
JEZZ1;
CMPAL,3DH;与等于号(=)比较
JEZZ2;输出运算结果
CMPCX,0AH;用户已经输入4个数据和3个符号
JAWRONG;错
CMPAL,2CH;去掉逗号
JEWRONG
CMPAL,2AH;乘
JBWRONG;低于转移(ASCII表中符号所在区域,去掉符号中间的逗号)
CMPAL,2DH;减
JAWRONG;高于转移
JMPSAVE_S;用户输入合法,保存数据
3.2.3输入数据判断
包括错误信息的提示和数据的存储。
待输入数据后判断输入数据是否为“$”,是则退出程序,不是则继续判断是否为“=”,是则转运算程序,并显示运算结果。
如果不是则判断该次输入是否符号要求,即在要求输入数字的时候应该输入数字,在要求输入符号的时候输入运算符号。
用户输入合法则保存数据,并准备下一个数据输出,如果用户输入不合法则有相关错误提示并回显正确输入的数据,让用户继续上一个输入。
代码如下:
SAVE_N:
;保存数字
XORAH,AH;清零AH
MOV[DI],AH
INCDI
SUBAL,30H;减30H,将ASCII码值转为运算数据
MOV[DI],AL;将数据保存
INCDI
ADDCX,2;存储空间+2
JMPINPUT_SIGN;转符号输入
SAVE_S:
;保存符号
MOV[DI],AL;将符号保存
INCDI
INCCX;
JMPINPUT_NUMBER;转数据输入
ZZ1:
JMPJIESHU
ZZ2:
JMPOUTPUT
WRONG:
DISPMESG_R;显示出错信息
DISPMESG_E
PUSHCX
OUT_NUM:
SUBDI,CX
INCDI
MOVDL,[DI]
ADDDL,30H;转成ASCII码显示
MOVAH,2;2号系统功能调用
INT21H
ADDDI,CX
DECDI;DI返回原值
SUBCX,2
CMPCX,0
JEREIN_SIG
SUBDI,CX
MOVDL,[DI]
MOVAH,2;2号系统功能调用,输出单字符
INT21H
ADDDI,CX;DI返回原值
DECCX
CMPCX,0
JEREIN_NUM
JMPOUT_NUM
REIN_NUM:
POPCX
JMPINPUT_NUMBER
REIN_SIG:
POPCX
JMPINPUT_SIGN
DISPMESG_E
JMPBEGIN
3.2.4算术运算
算术运算其中包括乘法优先的判断和加减法的运算。
先找到乘法运算符的位置,将其前后位置的数相乘,并存在前面数的位置上。
待乘法运算完成后,按顺序实行加减法的运算。
将乘法运算完成后的第一个数据放在RESULT变量中,找到运算符的位置,将RESULT变量与运算符后一位的数进行运算。
运算过程代码如下:
YUNSUANPROCNEAR;运算过程YUNSUAN定义
LEASI,SHUJU;装入数据有效地址
INCSI
JUDGE:
SUBDI,3;
MOVCL,[DI]
CMPCL,2AH;和*号比较
JECF;乘法转移
CMPBYTEPTR[DI],'M'
JEP1
JMPJUDGE
CF:
;乘法运算
XORAX,AX
XORBX,BX
INCDI
XCHGBH,[DI];交换指令
XCHGBL,[DI+1]
SUBDI,2
XCHGAL,[DI];被乘数
XCHGAH,[DI-1]
MULBX;乘数和积存放
MOV[DI],AL
MOV[DI-1],AH
INCDI;地址加1
JMPJUDGE;继续判断
P1:
MOVAH,[SI]
MOVAL,[SI+1]
MOVRESULT,AX
P2:
ADDSI,2
MOVCL,[SI]
CMPCL,2BH;加法运算
JEJIA
CMPCL,2DH;减法运算
JEJIAN
INCSI
CMPSI,OFFSETSHUJU+11;等式是否运算完
JBP2
JIA:
;加法
XORAX,AX
XORBX,BX
MOVAX,RESULT
INCSI
XCHGBH,[SI]
XCHGBL,[SI+1]
ADDAX,BX
MOVRESULT,AX
CMPSI,OFFSETSHUJU+11
JBP2
JMPEI
JIAN:
;减法
XORAX,AX
XORBX,BX
MOVAX,RESULT
INCSI
XCHGBH,[SI]
XCHGBL,[SI+1]
SUBAX,BX
MOVRESULT,AX
CMPSI,OFFSETSHUJU+11
JBP2
EI:
RET;过程返回
YUNSUANENDP
3.2.5运算结果输出
其中包括结果正负的判断和结果的输出。
调用YUNSUAN过程,得到RESULT的值。
先将结果的值和0比较,如果小于0则先输出负号。
再将结果除以1000得到的商作为最高位,判断是否为0,是0则不输出。
再将余数除以100,得到次高位,同上输出。
循环到最后位输出完结束。
代码如下:
OUTPUT:
CALLYUNSUAN
CMPRESULT,0;和0比较
JGEW1;大于等于转移至W1
NEGRESULT;求补指令
MOVDL,'-'
MOVAH,2;2号系统功能调用,输出单字符
INT21H
W1:
MOVBX,1000
MOVCX,4
MOVN,0
XORDX,DX
W2:
MOVAX,RESULT
DIVBX;将结果的各位分开
MOVRESULT,DX;将余数给原来的值
CMPAL,0
JNEW3
CMPN,0;判断最高位是否为0,是0不输出
JNEW3
CMPCX,1;判断是否循环完毕
JEW3
JMPW4
W3:
MOVDL,AL
ADDDL,30H;将数字转为ASCII码显示
MOVAH,2;2号系统功能调用,输出单字符
INT21H
MOVN,1
W4:
MOVAX,BX
MOVDX,0
MOVBX,10;用于判断下一位(除10)
DIVBX
MOVBX,AX
LOOPW2;循环W2开始下一位的输出
MOVRESULT,0;清空结果
JMPBEGIN;程序返回
3.3实验结果
通过代码编写调试运行,可以实现这次课程设计题目要求的程序功能,可以实现4个无符号10进制之间用加、减、乘符号任意连接,按照算术运算法则对输入的算式进行算式运算并输出正确结果。
且完成了较好的错误提示及纠正功能,人机交互友好。
程序运行结果如下:
图2实验结果图
第四章总结与体会
针对我们这次的微机原理课程设计,虽然我们组所抽到的题目感觉是那种纯软件编程的,因为没有像其他组一样用到了实验箱,用到了像8253、8259这些芯片。
但是我们组汇编程序编写的难度并不比他们简单,或者可以说更加难一点。
在对四则运算程序的设计上,刚开始不怎么明白题目的意思。
再和老师请教讨论后明确了设计任务,老师也推荐了几种可行的设计方法。
程序设计主要包括键盘数据的输入,按照运算法则进行的运算程序以及运算结果的输出。
编程的主要难点在于运算法则上,即运算符号的优先级判断上,经过和老师的讨论我们选择了查找的方法。
通过对输入的符号保存后再对其判断,如果含有“*”号,则取出其前一位数和后一位数进行乘法运算,重复进行该过程直到没有“*”号。
然后再进行简单的按顺序的加减法运算,并输出正确的运算结果。
当我们完成基本要求的功能后,我们考虑如何更加完善程序,如处理一些常见的错误。
主要添加了输入数据监控,即可以通过监控来实现对用户多次输入合法数据但已明显超出4个1位10进制无符号数的限制。
如果出现这种情况,将等待用户输入“=”来输出运算结果。
我们遇到的一个很明显的问题是当用户输入出错的时候,只能通过重新输入数据的方法来重新输入数据。
所以,在功能完善上我们考虑到了如何通过回显正确的数据来避免用户的多次重复输入数据。
这样用户只需要重新输入刚才输错的数据就可以了,该功能的完善达到了较好的人机友好交互。
在汇编程序设计阶段,我们遇到的一个当时比较费解的问题是总是出现超出范围的错误提示信息,无法完成编译。
于是我们仔细查找错误,却怎么也发现不了错误。
山重水复不知如何是好的时候突然想到了汇编语言中程序跳转指令的跳转范围,困扰着我们的问题找到了,我们程序中使用的跳转指令超出了跳转范围!
于是我们准备优化程序结构,但又遇到另一个严峻的问题,程序结构基本固定,相应程序模块很难移动。
最好我们只能在中间加了JMP跳转指令实现程序跳转的“接力”。
最后,感谢这次课程设计中老师和同学的相关建议!
参考文献
[1]朱金钧.《微型计算机原理及应用技术》[M].机械工业出版社,第2版
[2]张雪兰、谭毓安.《汇编语言程序设计》[M].清华大学出版社
附录
程序代码:
DATASSEGMENT
MESG_WDB0AH,0DH,'Welcome!
$'
MESG_IDB0AH,0DH,'PleaseInput:
$'
MESG_RDB0AH,0DH,'Pleasereinputtherightdata:
$'
MESG_EDB0AH,0DH,'$'
SHUJUDB'M'
DW20DUP(0)
RESULTDW?
NDB?
DATASENDS
;------------------------------------------------------------------
STACKSEGMENT
STTDB10DUP(?
)
STACKENDS
;------------------------------------------------------------------
DISPMACROSTR;宏定义(形参)
LEADX,STR;装入有效地址
MOVAH,9;9号系统功能调用,输出字符串,显示DX寄存器内容
INT21H
ENDM
;-------------------------------------------------------------------
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACK
START:
MOVAX,DATAS
MOVDS,AX
DISPMESG_W;显示欢迎界面
BEGIN:
LEADI,SHUJU;装入有效地址
INCDI;DI加1
MOVAX,0;初始化寄存器
MOVBX,0
MOVCX,0
MOVDX,0
DISPMESG_I;显示输入提示
DISPMESG_E
INPUT_NUMBER:
;数据输入
MOVAH,1;1号系统功能调用,键盘输入单字符
INT21H
CMPAL,'$';用户是否输入$
JEZZ1;等于/结果为0转移
CMPAL,30H;减法比较,和0比较
JBWRONG;低于转移
CMPAL,39H;和9比较
JAWRONG;高于转移
JMPSAVE_N;用户输入合法,保存数据
INPUT_SIGN:
;符号输入
;INCCX;
MOVAH,1;1号系统功能调用,键盘输入单字符INT21H
CMPAL,'$';用户是否输入$
JEZZ1;
CMPAL,3DH;与等于号(=)比较
JEZZ2;输出运算结果
CMPCX,0AH;用户已经输入4个数据和3个符号
JAWRONG;错
CMPAL,2CH;去掉逗号
JEWRONG
CMPAL,2AH;乘
JBWRONG;低于转移(ASCII表中符号所在区域,去掉符号中间的逗号)
CMPAL,2DH;减
JAWRONG;高于转移
JMPSAVE_S;用户输入合法,保存数据
SAVE_N:
;保存数字
XORAH,AH;清零AH
MOV[DI],AH
INCDI
SUBAL,30H;减30H,将ASCII码值转为运算数据
MOV[DI],AL;将数据保存
INCDI
ADDCX,2;存储空间+2
JMPINPUT_SIGN;转符号输入
SAVE_S:
;保存符号
MOV[DI],AL;将符号保存
INCDI
INCCX;
JMPINPUT_NUMBER;转数据输入
ZZ1:
JMPJIESHU
ZZ2:
JMPOUTPUT
WRONG:
DISPMESG_R;显示出错信息
DISPMESG_E
PUSHCX
OUT_NUM:
SUBDI,CX
INCDI
MOVDL,[DI]
ADDDL,30H;转成ASCII码显示
MOVAH,2;2号系统功能调用,输出单字符,入口参数:
DL=要显示字符的ASCII码
INT21H
ADDDI,CX
DECDI;DI返回原值
SUBCX,2
CMPCX,0
JEREIN_SIG
SUBDI,CX
MOVDL,[DI]
MOVAH,2;2号系统功能调用,输出单字符,入口参数:
DL=要显示字符的ASCII码
INT21H
ADDDI,CX;DI返回原值
DECCX
CMPCX,0
JEREIN_NUM
JMPOUT_NUM
REIN_NUM:
POPCX
JMPINPUT_NUMBER
REIN_SIG:
POPCX
JMPINPUT_SIGN
DISPMESG_E
JMPBEGIN
;--------------------------------------------------------------------
YUNSUANPROCNEAR;运算过程YUNSUAN定义
LEASI,SHUJU;装入数据有效地址
INCSI
JUDGE:
SUBDI,3;
M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 混合 算术 运算 实现