求100以内的素数 微机原理与汇编技术课程设计.docx
《求100以内的素数 微机原理与汇编技术课程设计.docx》由会员分享,可在线阅读,更多相关《求100以内的素数 微机原理与汇编技术课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
求100以内的素数微机原理与汇编技术课程设计
微机原理与汇编技术
课程设计(论文)
求100以内素数
(2)
院(系)名称
专业班级
学号
学生姓名
指导教师
起止时间:
2015.12.21—2015.12.31
课程设计(论文)任务及评语
院(系):
电子与信息工程学院教研室:
计算机科学与技术
学号
学生姓名
专业班级
课程设计(论文)题目
求100以内的素数
(2)
课程设计(论文)任务
设计内容
编制程序,按要求求出100以内的素数和其它结果。
技术要求
1、求出这些素数。
2、在屏幕上显示出求素数的动态过程(在屏幕上先显示出100以内的所有数,再动态地删去不符合要求的数,删除的过程要明显)。
3、计算这些素数的平均值(取整,四舍五入),以十进制形式输出,并让改制以红色显示。
4、数据的输入和结果的输出都要有必要的提示,且提示独占一行。
5、要用到子程序。
指导教师评语及成绩
平时成绩:
答辩成绩:
论文成绩:
总成绩:
指导教师签字:
年月日
注:
平时成绩占20%,答辩成绩占40%,论文成绩占40%。
第1章前言
1.1背景
汇编语言(assemblylanguage)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。
在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。
普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。
有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。
在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。
驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。
汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。
例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的寄存器AX、BX中把数据取出。
这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性。
1.2基本功能要求
由于DOS的9号调用输出的是ASCⅡ码,因此我们在输出到屏幕的时候一定要将其先转换为ASCⅡ码再使用9号调用输出。
考虑到ASCⅡ码转化为数字较为麻烦,因此可以定义两个组数据buf、buf1,其中buf用于存放1~99,buf1用于存放1~99的ASCⅡ码。
这段程序运用的两次loop循环分别实现把0~99送到buf、将0~99的ASCⅡ码送到buf1。
在循环完毕后,采用dos的9号调用将buf1的数据输出到屏幕上,即1~99输出到屏幕上。
完成这段程序后,跳到下一个模块,即删除合数保留素数并显示模块。
然后跳转到下一模块。
求和,最后到求平均数模块。
第2章程序设计
2.1题目的基本内容
设计题目:
求100以内的素数
具体要求:
(1)求出这些素数。
(2)在屏幕上显示出求素数的动态过程(在屏幕上先显示出100以内的所有数,再动态地删去不符合要求的数,删除的过程要明显)。
(3)计算这些素数的平均值(取整,四舍五入),以十进制形式输出,并让改制以红色显示。
(4)数据的输入和结果的输出都要有必要的提示,且提示独占一行。
(5)要使用子程序
2.2程序流程图
图2.1显示素数程序流程图
图2.2删除合数保留素数程序流程图
图2.3求和程序流程图
图2.4求平均数程序流程图
2.3课程设计的具体内容说明
把0~99送到buf、将0~99的ASCⅡ码送到buf1。
在循环完毕后,采用dos的9号调用将buf1的数据输出到屏幕上,即1~99输出到屏幕上。
算法描述:
(1)开始,输出素数。
(2)判断是否q退出,不退出则到(3)。
(3)按任意键继续程序。
(4)输出0-100全部数据。
(5)按任意键,每按一次删除一个非素数。
(6)删除完毕,输出平均数。
(7)结束,退出程序。
2.4课程设计中关键内容的分析设计说明
程序:
datasegment
input1db0ah,0dh,'ifyouwanttoquit,pleasepressQ/q!
'
db0ah,0dh,'ifyouwanttoprint0~99,pleasepressanyotherkey!
',0ah,0dh,'$'
input2db0ah,0dh,'ifyouwanttoquit,pleasepressQ/q!
'
db0ah,0dh,'ifyouwanttofindtheprimenumber,pleasepressanyotherkey!
',0ah,0dh,0ah,0dh,'$'
input3db0ah,0dh,'ifyouwanttoquit,pleasepressQ/q!
'
db0ah,0dh,'ifyouwanttogettheavreageoftheprimenumbers,pleasepressanyotherkey!
',0ah,0dh,0ah,0dh,'$'
input4db0ah,0dh,'theavreageoftheprimenumbersis:
','$'
input5db0ah,0dh,'pressanykeytoquit!
','$'
bufdb99dup(?
),0;用于存0~99
buf1db99dup(?
?
','),0dh,0ah,'pressanykeytocontinue!
',0dh,0ah,'$';用于放1~99的asc码
buf2db?
?
0dh,0ah,'$'
dataends
codesegment
assumeds:
data,cs:
code
start:
movax,data
movds,ax
leadx,input1
movah,9
int21h
movah,08h
int21h
cmpal,'Q'
jEexit
cmpal,'q'
jeexit
leabx,buf
movax,0
moval,1
movcx,99
loop1:
mov[bx],al
incal
incbx
looploop1
movcx,99
leasi,buf1
leabx,buf
loop2:
movax,0
moval,[bx]
movdl,10
divdl
addal,30h;十位asc码
addah,30h;个位asc码
mov[si],al
mov[si+1],ah
addsi,3
addbx,1
looploop2
leadx,buf1
movah,9
int21h
movah,08h
int21h;显示0~100
jmpbb
exit:
movax,4c00h
int21h;退出
bb:
leadx,input2
movah,9
int21h
movah,08h
int21h
cmpal,'Q'
jEexit
cmpal,'q'
jeexit
movcx,0
leabx,buf
leasi,buf1
a1:
movdl,1
a2:
andax,0
moval,[bx+3]
decal
incdl
cmpal,dl
jza3
incal
divdl
cmpah,0
jnza2
mov[si+9],ah
mov[si+10],ah
jmpa4
a3:
inccx
a4:
leadx,buf1
movah,9
int21h
movah,08h
int21h
addsi,3
incbx
movdl,[bx+3]
cmpdl,0;跳出循环
jnza1
leadx,input3
movah,9
int21h
movah,08h
int21h;输入提示
cmpal,'Q'
jEexit
cmpal,'q'
jeexit
movdi,cx
adddi,3;计数送到di
movcx,99
andsi,0
leabx,buf1
loop3:
moval,[bx];十位
andax,00ffh
movdh,[bx+1];个位
cmpal,0
jzc1
subdh,30h
subal,30h
movdl,10
muldl
addal,dh
addsi,ax
c1:
addbx,3
looploop3
leadx,input4
movah,9
int21h
movah,08h
int21h
movax,si;和送到ax
movbx,di;个数送到bx
andbx,00ffh
divbl
incal
andax,00ffh
movbx,10
andbx,00ffh
divbl
addal,30h
addah,30h;将平均值转化为asc码,al为十位,ah为个位
leabx,buf2
mov[bx],al
mov[bx+1],ah
movah,09·
moval,0
movbh,00
movcx,2
movbl,4
int10h
leadx,buf2
movah,9
int21h
movah,08h
int21h
leadx,input5
movah,9
int21h
movah,08h
int21h
exit1:
movax,4c00h
int21h
codeends
endstart
2.5运行结果
图2.5初始界面
图2.6显示1~99
图2.7选择是否继续求素数
图2.8动态删除合数保留素数
图2.9选择是否求平均值
图2.10将素数平均值以红色字输出到屏幕
第3章课程设计总结
这次的微机原理课程设计,求100以内的素数,在数学的学习中,我们会经常接触到素数这个概念。
素数又称质数。
指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数(不包括0)整除的数。
因为合数是由若干个质数相乘而得来的,所以,没有质数就没有合数,由此可见素数在数论中有着很重要的地位。
比1大但不是素数的数称为合数。
1和0既非素数也非合数。
这个学期我们刚好学了《微机原理与接口技术》这门课,并且初步的了解了汇编语言知识,并且可以编写简单的代码。
因此,我们可以运用汇编语言来编写程序,求取100以内的素数,动态的删除合数,并且以红色的字输出素数的平均值。
起初以为这个课题比较简单,通过查书和资料可以很快做出来,结果开始做却发现不是那么回事,发现了很多的问题。
首先,课本上的知识还远远不够,需要我借鉴别人的程序来提升自己对汇编语言的认识以及了解,并且很多复杂难懂的程序还无法读懂。
其次,在编写的过程中,总会有各种各样的问题出现,即使一个小小的标点符号错误也无法将程序运行出来,这就需要我们的耐心仔细去慢慢的调试并且发现错误在哪里。
第三,我们对于汇编语言的认识还远远不够,一学期的简单学习,应用于编程还很吃力,dos调用、bios调用我们接触的非常非常少。
总之,费了九牛二虎之力,总算是解决这次的课程设计。
这次课程设计给我带来的收获很多。
第一,它让我更进一步的了解了汇编语言,并用其来做一些实践性的东西。
第二,我在编写和调试程序的时候,也锻炼了我的耐心和细心。
第三,这次课程设计也锻炼了我查阅资料的能力。
参考文献
[1]彭虎,周佩玲,傅忠谦.《微机原理与接口技术(第2版)》.北京:
电子工业出版社,2010年
[2]李敬兆.《8086/8088和arm核汇编语言程序设计》.合肥:
中国科技大学出版社.2000年
[3]沈美明,温冬婵.《IBM—PC汇编语言程序设计(第二版)》.北京:
清华大学出版社出版.2003年
[4]沈美明,温冬婵,张赤红.《IBM—PC汇编语言程序设计实验教程》.北京:
清华大学出版社出版.2003年
[5]杨立.《微机原理与接口技术》.天津:
天津大学出版社,2010年