微机原理课程设计之计算器程序设计报告.docx
- 文档编号:9234134
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:16
- 大小:61.49KB
微机原理课程设计之计算器程序设计报告.docx
《微机原理课程设计之计算器程序设计报告.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计之计算器程序设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
微机原理课程设计之计算器程序设计报告
南京工程学院
课程设计报告书
课程名称微机原理及应用B
院(系、部、中心)自动化学院
专业
班级
姓名
学号
起止日期
指导教师
一、设计题目………………………………………2
二、设计任务(要求)……………………………2
三、总体方案………………………………………2
四、原理框图………………………………………3
五、系统模块详细设计与调试……………………5
六、设计总结………………………………………7
七、参考文献………………………………………8
八、附件材料………………………………………8
一、设计题目
计算器程序设计
二、设计任务(要求)
✧编写一个程序,能从键盘上读入数据,并完成加、减、乘、除的计算。
✧利用BIOS和DOS的中断来设计一个计算器,要求在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。
✧主菜单为:
Pleaseinputanumbertochoosethearithmeticoperation
1—add
2—subtract
3—multiply
4—divide
5—returntoDOS
✧若按其它键则显示提示字符串:
“PleasePressNumber1、2、3、4、5:
”,然后继续显示主菜单。
✧分别按数字键“1”、“2”、“3”,则执行相应子模块1、2、3,进行两个字节与两个字节的加法、减法和乘法运算,并在屏幕上显示运算结果。
✧按数字键“4”,执行子模块4,进行两个字节除一个字节的除法运算,并显示结果。
✧按数字键“5”,执行子模块5,程序退出,返回DOS。
三、总体方案
利用BIOS中断的10号功能调用来设置显示方式。
利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。
设置屏幕显示方式。
MOVAH,00H
MOVAL,NUM(NUM为显示方式属性字)
INT10H
接着从键盘上接受键值,并判别后转到相应的子模块进行运算,并显示结果。
MOVAH,01H
INT21H;AL=键入字符的ASCII码
从键盘上接收一串字符串命令:
MOVAH,0AH
MOVDX,OFFSETBUF;BUF为数据段中定义的数据缓冲区
INT21H
显示单个字符命令:
MOVAH,02H
INT21H
显示一串字符串的命令:
MOVAH,09H
MOVDX,OFFSETBUF;BUF为被显示字符串的首地址
INT21H
十进制数显示过程:
将十进制数送到BX中,BX除以1000,余数送BX中,商在AL中,范围为0~9,显示AL中的内容。
BX除以100,余数送BX中,商在AL中,显示AL中的内容,依次类推,直到分出个位数字。
如最高位为0,则不应显示,而非最高位的0则显示。
可利用设标志位并结合商的方法来决定是否显示0。
四、原理框图
a)主程序b)计算子程序
五、系统模块详细设计与调试
一)系统模块详细设计
1、设置屏幕显示方式:
MOVAH,00H
MOVAL,0
INT10H
通过调用BOIS的OOH号功能来设置屏幕显示方式。
此处AL=0,即设置屏幕显示方式为40*25黑白文本。
2、显示主菜单:
MOVAH,09H
MOVDX,OFFSETTOP
INT21H
先在数据段中定义主菜单中要显示的字符串,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
3、从键盘接收一个数字:
MOVAH,01H
INT21H
通过调用DOS系统的01H号功能——键入字符并回车来实现,其出口参数为键入字符的ASCII码,存在AL中。
4、接收键入用于计算的数:
MOVAH,0AH
MOVDX,OFFSETBUF1
通过调用DOS系统的0AH号功能——键入字符串至内存缓冲区来实现,其入口参数如下:
DS:
DX=存放键入字符串的缓冲区的首地址;(DS:
DX)=用户规定的缓冲区;(DS:
DX+1)=实际键入的字符数;从(DS:
DX+2)开始放键入的字符串。
因此,在下面的程序中运用所键入的数字时要注意字符串的首地址。
5、显示结果:
MOVAH,09H
MOVDX,OFFSETBUF3
INT21H
将结果存入数据段中定义的缓冲区BUF3中,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
6、子程序A2——将数的ASCII码转为二进制数:
A2PROCNEAR
MOVCL,BUF1+1;把BUF1+1中的实际键入的字符数放入CL
MOVCH,0;CH清零
MOVBX,OFFSETBUF1+2;把第一个数字的地址放在BX
PUSHBX;保护BX
PUSHCX;保护CX
L1:
MOVAL,[BX]
ANDAL,0FH;把ASCII码转换为十进制
MOV[BX],AL;存放十进制
INCBX;下一个数字的地址
LOOPL1
POPCX;恢复CX
POPBX;恢复BX
MOVAX,0;将累加和赋零
MOVSI,10
L2:
MULSI
ADDAL,[BX]
ADCAH,0
INCBX
LOOPL2;累加乘10
L3:
RET
A2ENDP
入口:
十进制数的ASCII在BUF1内;出口:
转换后的二进制数在AX内。
算法:
先将其转换为十进制,再用累加和乘10加X的方法变为二进制,如将163转换为二进制数,可先将累加和赋0,再计算(((0*10+1)*10+6)*10+3)结果为二进制数。
7、将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段):
该模块的程序设计详见附件材料——程序清单及说明中A3、BB程序段
入口:
二进制数在AX内;出口:
转换后的ASCII码在BUF内。
算法:
AX内的数范围在+32767到-32768之间,先检查AX符号位,决定输出‘+’还是‘-’,若为负,先求补码得到原码后可与正数统一处理。
方法:
把将被转换的二进制数先除以10000,商为万位数,再将余数除以1000,商为千位数,以此类推,求出百十位数,剩下的为个位数。
最后各个数加上30H,即为对应字符。
二)程序编译、运行与调试
在DOS环境下,键入EDIT。
启动全屏幕编辑软件EDIT,输入源程序。
输入完毕,按alt+F选择SAVE保存程序(规定扩展名为*.ASM),按alt+X退出EDIT状态。
退出EDIT环境后,输入ASM或MASM文件名↙(省略扩展名,系统默认为.ASM),对源程序进行汇编。
源程序经汇编后产生三个输出文件:
第一个是OBJ文件,即二进制目标文件,这是汇编的主要目的;第二个是LST文件,即列表文件;第三个是CRF文件,对于一般的程序可以不建立后两个文件。
汇编时,计算机会询问汇编后生成的OBJ文件名、LST文件名和CRF文件名,问句的右侧是示范回答,如果不想生成LST文件和CRF文件,则按回车键回答。
汇编过程中,如果源程序中有语法错误,则汇编过程结束后,汇编程序会指出源程序中的错误,这时,可以再用编辑程序来修改源程序中的错误,最后,得到没有语法错误的OBJ文件。
汇编程序产生的二进制目标文件不是可执行文件,还必须用连接程序(LINK)把OBJ文件转换成可执行的EXE文件。
LINK程序有两个输入文件OBJ和LIB,两个输出文件EXE和MAP。
连接时,输入LINK文件名↙,对汇编生成的*.OBJ文件进行连接,计算时会询问生成的EXE文件名、MAP文件名以及参与连接的库文件名,如果不想生成MAP文件,没有库文件参与连接,则按回车键作答。
最后,生成相应的*.EXE文件。
从LINK过程的提示信息中,可看到最后给出了一个“无堆栈段”的警告性错误,这并不影响程序的执行。
至此,产生了一个EXE文件,在DOS环境下可以直接运行该文件。
在程序得到正确的结果之前,会产生一些错误,只有经过调试阶段才能纠正程序中的错误,从而的到正确的结果。
在程序编译过程中会提示语法错误,可再用编辑程序来修改源程序中的错误。
当没有语法错误而得不到正确结果时,可用调试程序DEBUG来调试。
它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
六、设计总结
七、参考文献
《微机原理实验与课程设计指导书》,陆红伟编,中国电力出版社,2006年
《8086微型计算机组成、原理及接口》,顾滨,机械工业出版社,2001年
《微型计算机原理及应用》,吕淑萍等,哈尔滨工程大学出版社,2004年
《微型计算机技术及应用》,戴梅萼,清华大学出版社,2005年
《微机原理及应用》,徐晨等编,高等教育出版社,2004年
《微机原理、汇编与接口技术实验教程》,朱定华编,清华大学出版社,2007年
八、附件材料
程序清单及说明:
DATASEGMENT
N=15
TOPDB5DUP(0AH)
DBNDUP(''),'Pleaseinputanumbertochoosethearithmeticoperation',0DH,0AH
DBNDUP(''),'',0DH,0AH
DBNDUP(''),'1—add',0DH,0AH
DBNDUP(''),'2—subtract',0DH,0AH
DBNDUP(''),'3—multiply',0DH,0AH
DBNDUP(''),'4—divide',0DH,0AH
DBNDUP(''),'5—returntoDOS',0DH,0AH
DBNDUP(''),'',0DH,0AH
DBNDUP(''),'CHOICE(1.2.3.4.5):
$'
MESG1DB0DH,0AH,'PLEASEPRESSNUMBER1.2.3.4.5!
$'
MESG2DB0DH,0AH,'PLEASEINPUTTHEFIRSTNUMBER:
$'
MESG3DB0DH,0AH,'PLEASEINPUTTHESECONDNUMBER:
$'
MESG4DB0DH,0AH,'PLAYADD:
$'
MESG5DB0DH,0AH,'PLAYSUBTRACT:
$'
MESG6DB0DH,0AH,'PLAYMULTIPLY:
$'
MESG7DB0DH,0AH,'PLAYDIVIDE:
$'
MESG8DB0DH,0AH,'THERESULT:
$'
MESG9DB0DH,0AH,'PRESSQRETURNDOC,ANYPRESSRETURNSTART!
$'
BUF1DB6;十进制数的缓冲区,可接收6个字符
DB?
;保留,用于10号调用时DOC填入实际输入字符数
DB6DUP(?
);一个符号位,四位数字ASCII码,加上一个回车符
BUF2DW?
;将第一个数转换为二进制后,放于这里
BUF3DB6DUP(?
),'$';将结果转换为ASCII码后,放在这里
DATAENDS
STACKSEGMENTSTACK'STACK'
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,00H;设置屏幕显示方式
MOVAL,0
INT10H
MOVAH,09H;显示菜单
MOVDX,OFFSETTOP
INT21H
AA:
MOVAH,01H;从键盘接收一个数字
INT21H
CMPAL,'1';与1比较
JNENEXT1;不等于1就转到NEXT1
JMPJIA;等于1就转到加法程序
NEXT1:
CMPAL,'2';与2比较
JNENEXT2;不等于2就转到NEXT2
JMPJIAN;等于2就转到减法程序
NEXT2:
CMPAL,'3';与3比较
JNENEXT3;不等于3就转到NEXT3
JMPCHENG;等于3就转到乘法程序
NEXT3:
CMPAL,'4';与4比较
JNENEXT4;不等于4就转到NEXT4
JMPCHU;等于4就转到除法程序
NEXT4:
CMPAL,'5';与5比较
JNENEXT5;不等于5就转到NEXT5
MOVAH,4CH;回DOS
INT21H
NEXT5:
MOVAH,09H;显示MESG1
MOVDX,OFFSETMESG1
INT21H
JMPAA;跳到AA
A1PROCNEAR
MOVAH,09H;提示输入第一个数
MOVDX,OFFSETMESG2
INT21H
MOVAH,0AH;接收第一个数
MOVDX,OFFSETBUF1
INT21H
CALLA2;调用A2进行ASCII-二进制的转换
MOVBUF2,AX;把第一个数转换的二进制放在BUF2
MOVAH,09H;提示输入第二个数
MOVDX,OFFSETMESG3
INT21H
MOVAH,0AH;接收第二个数
MOVDX,OFFSETBUF1
INT21H
CALLA2;调用A2把第二个数进行ASCII-二进制转换
RET
A1ENDP
A2PROCNEAR
MOVCL,BUF1+1;把BUF1+1中的实际键入的字符数放入CL
MOVCH,0;CH清零
MOVBX,OFFSETBUF1+2;把第一个数字的地址放在BX
PUSHBX;保护BX
PUSHCX;保护CX
L1:
MOVAL,[BX]
ANDAL,0FH;把ASCII码转换为十进制
MOV[BX],AL;存放十进制
INCBX;下一个数字的地址
LOOPL1
POPCX;恢复CX
POPBX;恢复BX
MOVAX,0;将累加和赋零
MOVSI,10
L2:
MULSI
ADDAL,[BX]
ADCAH,0
INCBX
LOOPL2;累加乘10
L3:
RET
A2ENDP
JIA:
MOVAH,09H;加法程序
MOVDX,OFFSETMESG4
INT21H
CALLA1;调用A1
ADDAX,BUF2;把转换后的放在BUF2中的第一个数和放在AX
JMPA3的第二个数相加
JIAN:
MOVAH,09H;减法程序
MOVDX,OFFSETMESG5
INT21H
CALLA1
MOVBX,AX;把转换后的放在AX的第二个数放到BX
MOVAX,BUF2;把转换后放在BUF2中的第一个数放到AX
SBBAX,BX;两数相减
JMPA3
CHENG:
MOVAH,09H;乘法程序
MOVDX,OFFSETMESG6
INT21H
CALLA1
MOVBX,AX;把转换后的放在AX的第二个数放到BX
MOVAX,BUF2;把转换后的放在BUF2中第一个数放到AX
MULBX;两数相乘
JMPA3
CHU:
MOVAH,09H;除法程序
MOVDX,OFFSETMESG7
INT21H
CALLA1
MOVDX,AX;把转换后的放在AX的第二个数放到DX
MOVAX,BUF2;把转换后的放在BUF2中第一个数放到AX
DIVDL;两数相除,商在AL里
MOVAH,0H;使AH清零
JMPA3
A3:
MOVBUF3,'+';把BUF3放'+'
CMPAX,0;把结果于0比较
JGEL4;AX>0转到L4
NEGAX;AX<0将AX取反
MOVBUF3,'-';把BUF3放'-'
L4:
CWD
MOVBX,10000
DIVBX;商为第一位数字放在AL,余数放在DX
CALLBB
MOVBUF3+1,AL;把第一个数放在BUF3+1单元中
MOVAX,DX;把放在DX中的余数放到AX
CWD
MOVBX,1000
DIVBX;商为第二位数字放在AL,余数放在DX
CALLBB
MOVBUF3+2,AL;把第二个数放在BUF3+2单元中
MOVAX,DX;把放在DX中的余数放到AX
MOVBL,100
DIVBL;商为第三位数字放在AL,余数放在AH
CALLBB
MOVBUF3+3,AL;把第三个数放在BUF3+3单元中
MOVAL,AH;把放在AH中的余数放到AL
CBW
MOVBL,10
DIVBL;商为第四位数字放在AL,余数放在A
CALLBB
MOVBUF3+4,AL;把第四个数放在BUF3+4单元中
ADDAH,30H;把个位转为ASSCII码
MOVBUF3+5,AH;把第五个数放在BUF3+5单元中
MOVAH,09H;提示结果
MOVDX,OFFSETMESG8
INT21H
MOVAH,09H
MOVDX,OFFSETBUF3;把放在BUF3缓冲区中的结果显示出来
INT21H
MOVAH,09H;提示是返回DOS还是重新计算
MOVDX,OFFSETMESG9
INT21H
MOVAH,01H;接收键盘数字
INT21H
CMPAL,'Q'
JEA4
JMPNEXT5;其他数字重新计算
BBPROCNEAR
CMPAL,0H;与零比较
JEL5
JMPL6
L5:
MOVAL,20H;等于零,赋AL空格
JMPL7
L6:
ADDAL,30H;不等于零,把数转为ASSCII码
L7:
RET
BBENDP
A4:
MOVAH,4CH;AL等于'Q'就返回DOS
INT21H
CODEENDS
ENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程设计 计算器 程序设计 报告