微机课程方案软件范例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
( 2018-- 2018 年度第一学期>
课程:微机原理及应用
题目:冒泡法排序与筛选法求素数院系:自动化系
班级:自动化0904
学号: 3
学生:阎立恒
指导教师:马永光
设计周数:一周
成绩:
日期:2018年 1 月 12 日
《微机原理及应用》课程设计
任务书
一、目的与要求
1.通过对微机系统分析和具体设计,使学生加深对所学课程的理解。
2.掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。
3.培养学生分析问题、解决问题的能力。
4.培养学生对微型计算机应用系统的基本设计能力。
5.提高学生的实践动手能力和创新能力。
二、主要容
1.根据个人情况选择课程设计参考题目,或者依照个人兴趣自拟题目。
2.针对所选择的设计题目进行硬件设计,合理选用所需元器件,绘制系统结构框图、硬件接线图,并在实验系统上完成电路的连接和调试。
3.根据所选题目的要求对微机系统进行程序设计,绘制程序总体流程图并编写源程序上机调试。
4.写出课程设计报告,对整个设计过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识和收获。
三、进度计划
四、设计成果要求
1.系统硬件设计合理,软件编程达到设计要求。
2.系统硬件结构图和软件流程图绘制清楚规。
3.设计报告完整规。
五、考核方式
根据设计任务的完成情况、课程设计报告撰写情况及演示答辩情况采用五级记分制评定成绩。
学生:
指导教师:
一、课程设计目的与要求
1.通过对微机系统分析和具体设计,使学生加深对所学课程的理解。
2.掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。
3.培养学生分析问题、解决问题的能力。
4.培养学生对微型计算机应用系统的基本设计能力。
5.提高学生的实践动手能力和创新能力
二、课程设计正文
1.设计题目
1)排序程序设计。
要求:从键盘输入10位学生的考试成绩,由高到低排序后显示排序结果。
筛选法求素数。
要求:编写程序,求出2~254之间的所有素数,并显示在屏幕上<数与数
之间用逗号分开)。
<提示:从n=2开始,将所有n的倍数做上记号;再对n后面的数进
行同样的操作;重复这个过程直到找出所有的素数。
最后结束时,凡是未标记号的数就是
素数。
)
2.设计思想<总体设计方案、系统的主要功能、作用)
1)成绩排序程序
输入数字:建立存储区域IBF,调用DOS系统功能0AH从键盘输入字符串。
则IBF[1]
里存储的为实际输入的字符数。
如果IBF[1]为3,因为输入的是学生的成
绩,所以默认输入的数为100。
如果IBF[1]为2,则先将IBF[2],IBF[3]的
ASCII码减去30转为数字,再把IBF[2]乘以10加上IBF[3],即可还原成数
字。
如果IBF[1]为1,则直接将IBF[2]减去30即可还原成数字。
冒泡排序:依次比较相邻的两个数,将大数放在前面,小数放在后面。
即在第一趟:首先
比较第1个和第2个数,将大数放前,小数放后。
然后比较第2个数和第3
个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放
前,小数放后。
至此第一趟结束,将最小的数放到了最后。
在第二趟:仍从第
一对数开始比较,将大数放前,小数放后,一直比较到倒数第二个数<倒数第
一的位置上已经是最小的),第二趟结束,在倒数第二的位置上得到第二小的
数。
如此下去,重复以上过程,直至最终完成排序。
输出数字:先判断数字是否为0,若为0则直接输出0,不为零则除以10,将其余数压
入堆栈,将其商代替原被除数,递归调用,直至除以10的余数和商都为零。
递归出口为将堆栈中的数字弹出,转换成ASCII码,调用DOS系统功能
02H输出字符。
即完成一个数字的输出。
之后输出一个空格再进行下一个数
字的输出。
2)筛选法求素数
①建立两个存储区域分别存放除数n和被除数m,围均为0~254。
②取除数n,初始值为2,n的围是2~253。
③取被除数m,初始值为2+1=3,m的围是(n+1>~254。
④计算m/n,若除不尽则不进行操作,若可以除尽则将存放m的存储空间的第一位置
1。
⑤将m增大1重复⑤,直至m为254
⑥将n增大1重复④,直至n为253
此时被除数若为质数则其存储空间首位为0,若为和数则其存储空间首位为1。
据此判断
并输出。
输出原理同冒泡法排序的输出原理
3.系统工作原理介绍
此课程设计不涉及硬件,故无接口设计和系统框图.
4.系统程序设计<程序流程图、源程序及注释)
1)排序程序
DATA SEGMENT
IBF DB 3
DB ?
DB 4 DUP(?>
BUF DW 10 DUP(?>
MSG1 DB 'INPUT 10 NUMBERS',0AH,0DH,'$'
MSG2 DB 'RESULT:',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX 。
定义数据段基址
MOV DX,OFFSET MSG1 。
取MSG1偏移地址
MOV AH,09H
INT 21H 。
输出MSG1
MOV CX,10 。
规定输入次数为10
MOV BX,0
MOV DX,OFFSET IBF 。
取IBF偏移地址存储输入的字符串INPUT: MOV AH,0AH
INT 21H 。
调用键盘输入字符串
PUSH DX
PUSH BX 。
保护DX和BX
CALL CTN 。
调用CTN将字符串变为数字
POP BX 。
弹出BX
MOV BUF[BX],DX 。
将转换完的数字放入BUF中
POP DX 。
弹出DX
ADD BX,2 。
指向下一个存储空间
LOOP INPUT 。
输入10个数
MOV CX,10
DEC CX 。
规定排序次数
LOOP1: MOV DI,CX 。
保护排序次数将CX空出留给圈循环使用
MOV BX,0 。
从第一个数开始比较
LOOP2: MOV AX,BUF[BX]
CMP AX,BUF[BX+2] 。
取两个数比较
JGE NEXT 。
前者大则不交换
XCHG AX,BUF[BX+2]
MOV BUF[BX],AX 。
前者小则两数交换
NEXT: ADD BX,2 。
将比较的位置后移
LOOP LOOP2 。
循环再次比较共循环DI次比较即完成1次排序
MOV CX,DI 。
将外圈循环的次数放回CX
LOOP LOOP1 。
循环再次排序共进行10次排序
MOV DX,OFFSET MSG2 。
取MSG2偏移地址
MOV AH,09H
INT 21H 。
以下为输出程序先输出MSG2
MOV CX,10 。
输出数字10次
MOV BX,0
OUTPUT: PUSH BX 。
输出BUF的容先保护BX
PUSH CX 。
保护CX
MOV AX,BUF[BX] 。
取BX所指的数放入AX
OR AX,AX
JNZ NOTZ 。
判断数字是否为0 为0则直接输出不为0则调用输出程序 MOV DL,30H
MOV AH,02H
INT 21H
JMP OTPSPC
NOTZ: CALL DISPLAY 。
将非0数按十进制输出
OTPSPC: MOV DX,20H
MOV AL,02H
INT 21H 。
输出空格
POP CX 。
弹出CX
POP BX 。
弹出BX
ADD BX,2 。
将BX指向下一个数
LOOP OUTPUT
JMP $
CTN PROC NEAR
MOV AH,0 。
将AH清零
CMP IBF[1],3 。
判断输入的是否为3位数
JZ NXTC 。
若是则跳转到NXTC
CMP IBF[1],2 。
判断输入的是否为2位数
JZ NXCT2 。
若是则跳转到NXCT2
MOV DL,IBF[2] 。
否则为1位数直接存入DL SUB DL,30H 。
变为数字
JMP EXTC
NXTC: MOV DX,100D 。
若为3位数默认为100 JMP EXTC
NXCT2: MOV BX,10D 。
若为2位数
MOV AL,IBF[2] 。
取十位数ASCII码放在AL中 SUB AX,30H 。
变为数字
MUL BX 。
乘以10
MOV DX,AX 。
放入DX
ADD DL,IBF[3] 。
与个位数ASCII码相加
SUB DX,30H 。
-30
JMP EXTC
EXTC: RET
CTN ENDP
DISPLAY PROC NEAR
LOOPD: MOV DX,0 。
DX清零
MOV CL,10
DIV CX 。
将AX除以10
MOV CL,AL 。
取商
OR CX,DX
JZ EXIT 。
若商和余数均为0则结束递归 PUSH DX 。
压入余数
CALL DISPLAY 。
递归调用
POP DX 。
弹出余数
ADD DL,30H 。
变为ASCII码
JMP PRT 。
跳转到输出字符
PRT: MOV AH,02H
INT 21H 。
输出DX中的字符EXIT: RET
DISPLAY ENDP
CODE ENDS
END START
2)筛选法求素数
DIVD DW 255 DUP(?>
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,0
MOV AX,0
MOV CL,255 。
AX,BX清零设置循环次数
LOOPI: MOV DTBS[BX],AX 。
将0-254输入到DTBS和DIVD中
MOV DIVD[BX],AX
ADD BX,2
INC AX
LOOP LOOPI
MOV CL,253 。
设置外圈循环次数为253 即需要对2-254这253个数进行素数判断
MOV BX,4 。
从2开始判断
LOOP1: MOV DI,CX 。
保护CX 将CX空出留给圈循环使用
MOV DX,DIVD[BX] 。
取一个除数
PUSH BX 。
保护BX
ADD BX,2 。
被除数从<除数+1)开始取
LOOP2: MOV AX,DTBS[BX] 。
取被除数
MOV AH,0 。
高位置零
DIV DL 。
将被除数除以除数
OR AH,AH 。
判断余数是否为零
JNZ PN 。
不为零则不操作直接跳转
OR DTBS[BX],1000H 。
为零则将此数存储空间第一位置1 PN: ADD BX,2 。
指针指向一个被除数
LOOP LOOP2 。
再次进行判断
POP BX 。
还原除数的指针
ADD BX,2 。
指针指向下一个除数
MOV CX,DI 。
还原外圈循环控制数
LOOP LOOP1 。
进行下一轮判断
MOV CL,253 。
此下开始为输出程序先设置输出次数为253 MOV BX,4 。
从2开始输出
OUTPUT: PUSH BX 。
输出素数先保护BX
PUSH CX 。
保护CX
MOV AX,DTBS[BX] 。
取BX所指的数放入AX
OR AH,AH
JNZ NOTZ 。
判断是否有标记
MOV AH,0
CALL DISPLAY 。
按十进制输出
MOV DX,2CH
MOV AL,02H
INT 21H 。
输出逗号
NOTZ: POP CX 。
弹出CX
POP BX 。
弹出BX
ADD BX,2 。
将BX指向下一个数
LOOP OUTPUT
JMP $
DISPLAY PROC NEAR
LOOPD: MOV DX,0 。
DX清零
MOV CL,10
DIV CX 。
将AX除以10
MOV CL,AL 。
取商
OR CX,DX
JZ EXIT 。
若商和余数均为0则结束递归
PUSH DX 。
压入余数
CALL DISPLAY 。
递归调用
POP DX 。
弹出余数
ADD DL,30H 。
变为ASCII码
JMP PRT 。
跳转到输出字符
PRT: MOV AH,02H
INT 21H 。
输出DX中的数
EXIT: RET
DISPLAY ENDP
CODE ENDS
END START
5.系统调试结果
1)排序程序
可按照要求对10个由键盘输入的2~100的数进行排序并输出在屏幕上。
2)筛选法求素数
可求出2~254之间所有的素数并输出在屏幕上。
三、课程设计总结
通过本次课程设计过程中对微机系统分析和具体设计,我加深对所学课程的理解,掌握汇编语言程序设计的基本方法,培养了我分析问题、解决问题的能力,培养了我对微型计算机应用系统的基本设计能力,提高了我的实践动手能力和创新能力。
因为我曾在小学的时候学过BASIC语言,初中的时候学过Pascal语言,进入大学之后又学习了C++语言,所以对编写各种软件程序有一定的基础,因此我选择了两道比较具有代表性的题,第一道是冒泡法排序,第二道是筛选法求素数。
做第一道题时,我的思路是很清晰的,整个程序分为3部分:输入、排序、输出。
排序部分由于是考试容所以非常熟悉,不费力气就可以编写出来。
但是输入输出部分的编写调试所费时间精力超出了我的预期。
最开始的时候输入部分和输出部分我都是按照之前所学的高级语言的方式来写,结果大错特错。
输入时一个数字的每位数都占一个存储空间,而且是按照ASCII码来存储,根本不能直接拿来用,还需要先还原成数字存储起来。
输出则是和输入相反的一个过程。
编程中还遇到了一个问题,就是寄存器数量十分有限。
在编写程序的时候要十分小心会不会把还需要用到的一个存放在寄存器里的数据不小心覆盖掉了,因此要时时刻刻注意保护寄存器中的数据,尤其是调用过程的时候。
通过这些曲折,我对汇编语言的特点和其与高级语言的区别有了更加深刻的理解。
有了做第一道题时的经验教训,我在做第二道题时十分顺利。
之前我曾用其他语言写过求素数的程序,虽然不是筛选法。
以上经验使我在做这道题的求素数部分时毫不费力,而输出部分则直接又第一道题里的输出部分稍作修改而来。
两个程序虽然都已经符合了题目要求,但是优化的空间很大,例如:
1、第二道题求素数时,除数只需循环到最大数的一半即可。
2、第二道题程序可扩展成由键盘输入n(n<7FFFH>,求得小于n的全部素数。
3、第一道题输入3位数时默认为100,可优化为输入数大于100时提示输入错误并要求重新
输入。
4、第一道题可扩展为输入任意正数(<FFFFH>进行排序,此时输入部分最好改为递归算法。
5、第一道题可扩展到负数,但这样的话输入输出部分将复杂很多。
四、参考文献
[1] 马平万业王炳谦微机原理及应用中国电力第一版 2003年。