张欣 17号微机原理课程设计.docx
《张欣 17号微机原理课程设计.docx》由会员分享,可在线阅读,更多相关《张欣 17号微机原理课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
![张欣 17号微机原理课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/3/4bcfab4b-ca34-42bb-b0ee-6b6d1883c498/4bcfab4b-ca34-42bb-b0ee-6b6d1883c4981.gif)
张欣17号微机原理课程设计
微机原理课程设计
报
告
书
设计项目:
键盘录入数据的转换与显示程序设计
班级:
10级通信
姓名:
张欣
学号:
20100306117
指导教师:
袁静
目录
一、设计任务-1-
二、设计内容-1-
三、设计原理-2-
四、程序流程图-3-
五、程序代码-5-
六、程序运行结果-8-
七、程序调试中的问题及解决方法-9-
八、心得收获-10-
九、参考书目-10-
一、设计任务
键盘录入数据的转换与显示程序设计。
二、设计内容
1.设计内容
编写一个程序,能从键盘读入两个5位十进制数(1个符号位和4位数值位),并将这两个十进制数分别转换为二进制数,然后求其和,再将和以十进制形式在屏幕上显示。
该程序主要是十进制与二进制数之间的相互转换。
由于用户输入的数一般是十进制表示的,而这些数在计算机内存储、运算时一般都用二进制,这就涉及到了十进制数向二进制数的转换问题;当计算结果需要显示时,又要将二进制数转换为十进制,这又涉及到了二进制数如何转换为十进制数的问题。
由于在计算机内这种转换经常进行,所以二进制数与十进制数之间的转换算法是应掌握的基本算法之一。
从键盘接收的十进制数以ASCII码形式存放在内存单元中,先将其转换为十进制数字,再用累加和乘10加X的方法变成二进制数,如将358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二进制数,再由符号位决定是否需要求补。
在显示结果前,首先要把二进制表示的和转换成十进制数字,转换时,先检查和的符号位,以决定输出“+”还是“-”。
若是负数,应先求补,得到原码后即可与正数作统一处理。
转换方法为将和的二进制数除以10000,商即为万位数,再将余数除以1000,商即为千位数,以此类推,求出百、十位数,剩下的为个位数。
最后,将各个数加上30H,即成为对应字符。
利用DOS中断的21号功能进行字符的接收和显示。
2.设计思路
程序分为主程序和子程序,主程序主要是接收从键盘输入的数、两个数的求和以及和的显示;子程序分别实现将十进制数转换为二进制和将二进制数转换为十进制数。
用户输入的数据限制在4位(不含符号位)以内。
这样,数值在-9999~+9999范围以内,转换为二进制后在16位补码的表示范围内,而其相加后的和也在16位补码的表示范围内,同时,在将二进制数转换为十进制数显示时,也只考虑万位以下数字的转换即可。
三、设计原理
1.程序分为主程序和子程序,主程序主要是接收从键盘输入的数,两个数的求和,以及和的显示;子程序分别实现十进制数转换为二进制和将二进制数转换为十进制数。
2.先输入主程序。
输入两个数时,键盘接收的十进制数以ASCII码形式存放在内存单元中,将其转换为十进制数字。
数值在-9999至+9999范围内。
3.主程序中,两个二进制数数求和,结果也在16位补码的表示范围内。
4.主程序中,和显示前,首先把二进制转换为十进制数,检查和的符号位,若为负数则求补。
5.子程序中,实现十进制数转换为二进制方法是先将累加和赋0,再用累加和乘10加X得出结果。
转换后在16位补码的表示范围内,如果为负数,则需求补。
6.子程序中,实现二进制数转换为十进制前先检查符号位,若为负数则求补,转换方法为将二进制数除以1000,再将余数除以1000,依次类推,求出百,十位数,剩下的为个位数,最后将各个数加上30H,即成为对应字符。
四、程序流程图
主程序流程图
ASC_TO_BIN子程序流程图
BIN_TO_ASCII子程序流程图
INT21H号中断是一个系统中断,中断程序根据中断前写入AH中的值决定中断的功能,中断程序执行的流程图如图
中断程序流程图
五、程序代码
DATASEGMENTCOMMON
INPUT_MESSAGEDB0AH,'PLEASEINPUTANUMBER(LESSTHAN5FIGURES):
$'
QUIT_MESSAGEDB0AH,'ENTERQORqTOQUITANYOTHERTOCONTINUE:
$'
IN_ASC_BUFDB6;十进制数的输入缓冲区,共可接收6个字符
DB?
;保留,用于10号调用时DOS填入实际输入字符个数
DB6DUP(?
);一个符号位,四位数字ASCII码,加上一个回车符,共计6字符
BIN_BUF1DW?
;一个数转换为二进制后,放于此处
OUTPUT_MESSAGEDB0AH,'THESUMIS:
','$'
OUT_ASC_SUMDB6DUP(?
),'$';将二个数的和转换为ASCII码后,放于此处,
;以供9号调用显示
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
slPROCFAR
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETINPUT_MESSAGE
MOVAH,9
INT21H;提示输入一个数
MOVDX,OFFSETIN_ASC_BUF
MOVAH,10
INT21H;读取第一个数
CALLASC_TO_BIN;转换第一个数为二进制
MOVBIN_BUF1,AX;保存第一个数
MOVDX,OFFSETINPUT_MESSAGE
MOVAH,9
INT21H;提示输入一个数
MOVDX,OFFSETIN_ASC_BUF
MOVAH,10
INT21H;读取第二个数
CALLASC_TO_BIN;转换第二个数为二进制
ADDAX,BIN_BUF1;计算这二个数之和
CALLBIN_TO_ASCII;将和转换为ASCII码,以供显示用
MOVDX,OFFSETOUTPUT_MESSAGE
MOVAH,9
INT21H
MOVDX,OFFSETOUT_ASC_SUM
MOVAH,9
INT21H
MOVDX,OFFSETQUIT_MESSAGE
MOVAH,9
INT21H
MOVAH,1
INT21H
CMPAL,'Q'
JZOVER
CMPAL,'q'
JZOVER
JMPSTART
OVER:
MOVAH,4CH
INT21H
slENDP
ASC_TO_BINPROC
;ASCII码转换为二进制数
;入口:
十进制数的ASCII码在IN_ASC_BUF内
;出口:
转换后的二进制数在AX内
;算法:
先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将
;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二
;进制数,再由符号位决定是否需要求补。
MOVCL,IN_ASC_BUF+1;取字符个数
MOVCH,0
DECCL;扣除符号位
MOVBX,OFFSETIN_ASC_BUF+3;调整BX指向十进制数的最高位
PUSHBX
PUSHCX
L1:
MOVAL,[BX]
ANDAL,0FH
MOV[BX],AL
INCBX
LOOPL1;将所有数字字符的高四位清0,使之变为数字值
POPCX
POPBX
MOVAX,0;累加和赋初值
MOVSI,10
L2:
MULSI
ADDAL,[BX]
ADCAH,0
INCBX
LOOPL2;累加乘10
CMPIN_ASC_BUF+2,'+'
JZL3;符号是正号,转移
NEGAX;符号是负号,求补
L3:
RET
ASC_TO_BINENDP
BIN_TO_ASCIIPROC
;将二进制数转换为对应十进制数数字的ASCII码
;入口:
二进制数在AX内
;出口:
转换后的ASCII码在OUT_ASC_SUM变量内
;算法:
AX中的数范围在+32767到-32768之间,先检查AX中的符号位,以决定输出“+”
;还是“-”,若是负数,应先求补,得到原码后即可与正数作统一处理。
转换方法为将被转换的
;二进制数先除以10000,商;即为万位数,再将余数除以1000,商为千位数,以此类推,求出
;百、十位数,剩下的为个位数。
最后,将各个数加上30H,即成为对应字符。
MOVOUT_ASC_SUM,'+'
CMPAX,0
JGEL4;不是负数,转移
NEGAX
MOVOUT_ASC_SUM,'-'
L4:
CWD
MOVBX,10000
DIVBX
ADDAL,30H;将万位转换为数字(商应在AX内,但因为商不大于3,
;所以有效部分在AL内)
MOVOUT_ASC_SUM+1,AL;保存万位数字
MOVAX,DX;将余数置入AX内,以便当作被除数
CWD
MOVBX,1000
DIVBX
ADDAL,30H
MOVOUT_ASC_SUM+2,AL;保存千位数字
MOVAX,DX;将余数置入AX内,以便当作被除数
MOVBL,100
DIVBL
ADDAL,30H
MOVOUT_ASC_SUM+3,AL;保存百位数字
MOVAL,AH
CBW
MOVBL,10
DIVBL
ADDAL,30H
MOVOUT_ASC_SUM+4,AL;保存十位数字
ADDAH,30H
MOVOUT_ASC_SUM+5,AH;保存个位数字
RET
BIN_TO_ASCIIENDP
CODEENDS
ENDSTART
六、程序运行结果
图4运行结果图
七、程序调试中的问题及解决方法
刚写完程序第一次调试时,程序老是出错,错误提示如图所示。
调试出错提示
经过反复认真检查和修改,最后终于找到了程序出错的原因,原来是子程序调用出错了,后面修改了子程序和子程序的调用方式,程序就可以正常运行了。
运行结果如图所示。
八、心得收获
通过微机原理与接口技术的课程设计,使我学以致用,理论联系实际,真正学到了实用的知识。
上微机原理与接口技术的时候,我们学了8086CPU的内部结构、汇编语言、基本输入输出设备、定时器芯片、中断控制、串行并行通信、AD、DA等是一些理论知识,很难、很经典,虽然我们看上去懂了,也会做题了。
通过课程设计时我们才知道,原来我们只是对理论略知一二,要是谈到实际应用我们真是无从下手。
不过,还好我们有课程设计,使我们刚学完理论知识,马上又学以致用,使我们的知识掌握的更加的牢固,同时也激发了我们创新的思想。
通过微机原理与接口技术的课程设计,使我认识到计算机技术广泛应用于现代众多的领域中,起着越来越重要的作用。
随着电子技术和计算机技术的发展和应用,计算机应用越来越广泛,计算机应用分为数值计算和非数值应用两大领域。
非数值应用又包括数据处理、知识处理,例如信息系统、工厂自动化、办公室自动化、家庭自动化、专家系统、模式识别、机器翻译等领域。
我们学习的微机原理与接口技术是现在计算机技术的基础,现在学好微机原理与接口技术,好好的理论联系实际,将来才能为我国的计算机技术发展做出贡献。
九、参考书目
1.《微型计算机原理》张荣祥中国电力出版社
2.《微型计算机技术及应用》(第四版)戴梅萼、史嘉权清华大学出版社
3.《电子技术基础》康华光高等教育出版社
4.《电子系统设计》何小艇浙江大学出版社
5.《微型计算机技术及应用》戴梅萼清华大学出版社