资源描述
课程设计汇报
( -- 年度第 一 学期>
课 程: 微机原理及应用
题 目:冒泡法排序和筛选法求素数
院 系: 自动化系
班 级: 自动化0904
学 号: 0423
学生姓名:阎立恒
指导老师:马永光
设计周数: 一周
成 绩:
日期: 1 月 12 日
《微机原理及应用》课程设计
任 务 书
一、 目标和要求
1. 经过对微机系统分析和具体设计,使学生加深对所学课程了解。
2. 掌握汇编语言程序设计基础方法和经典接口电路基础设计方法。
3. 培养学生分析问题、处理问题能力。
4. 培养学生对微型计算机应用系统基础设计能力。
5. 提升学生实践动手能力和创新能力。
二、 关键内容
1. 依据个人情况选择课程设计参考题目,或依据个人爱好自拟题目。
2. 针对所选择设计题目进行硬件设计,合理选择所需元器件,绘制系统结构框图、硬件接线图,并在试验系统上完成电路连接和调试。
3. 依据所选题目标要求对微机系统进行程序设计,绘制程序总体步骤图并编写源程序上机调试。
4. 写出课程设计汇报,对整个设计过程进行归纳和综合,对设计中所存在问题和不足进行分析和总结,提出处理方法、方法、提议和对这次设计实践认识和收获。
三、 进度计划
序号
设计内容
完成时间
备注
1
选择课程设计题目,查阅相关资料
2
进行软硬件设计
3
上机调试
4
撰写设计汇报
5
演示及答辩
四、 设计结果要求
1. 系统硬件设计合理,软件编程达成设计要求。
2. 系统硬件结构图和软件步骤图绘制清楚规范。
3. 设计汇报完整规范。
五、 考评方法
依据设计任务完成情况、课程设计汇报撰写情况及演示答辩情况采取五级记分制评定成绩。
学生姓名:
指导老师:
一、课程设计目标和要求
1. 经过对微机系统分析和具体设计,使学生加深对所学课程了解。
2. 掌握汇编语言程序设计基础方法和经典接口电路基础设计方法。
3. 培养学生分析问题、处理问题能力。
4. 培养学生对微型计算机应用系统基础设计能力。
5. 提升学生实践动手能力和创新能力
二、课程设计正文
1. 设计题目
1) 排序程序设计。要求:从键盘输入10位学生考试成绩,由高到低排序后显示排序结果。
2) 筛选法求素数。要求:编写程序,求出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) 排序程序
开始
输入10个数字
两数比较
前者大?
Y
后移一位
N
交换
是否最终数?
N
Y
次数足够?
N
Y
输出
结束
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) 筛选法求素数
开始
n=2
m=n+1
m/n
N
整除?
Y
n=n+1
m=m+1
m存放空间首位置1
N
N
N
m=254?
Y
n=253?
Y
存放空间首位是否为1
Y
输出
结束
DATA SEGMENT
DTBS DW 255 DUP(?>
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] 马平 姚万业 王炳谦 微机原理及应用 中国电力出版社 第一版
展开阅读全文