求15000的素数 汇编课程设计.docx
- 文档编号:17631902
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:26
- 大小:645.90KB
求15000的素数 汇编课程设计.docx
《求15000的素数 汇编课程设计.docx》由会员分享,可在线阅读,更多相关《求15000的素数 汇编课程设计.docx(26页珍藏版)》请在冰点文库上搜索。
求15000的素数汇编课程设计
学号:
课程设计
题目
求1-5000之间的素数
学院
计算机科学与技术
专业
计算机科学与技术
班级
姓名
指导教师
2012
年
6
月
29
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
计算机科学与技术学院
题目:
求1-5000之间的素数
初始条件:
理论:
完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:
完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。
具体的设计任务及要求:
1)熟悉汇编语言循环结构;
2)打印出1-5000之间的素数;
3)程序采用子程序结构,结构清晰;
4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》实验2.4
2)《IBM—PC汇编语言程序设计(第2版)》例6.11
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试,和验收。
周5:
撰写课程设计报告。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
1、课程设计问题描述及问题分析
1.1课程设计问题描述
1.2问题分析
2、课程设计要求
3、程序设计
3.1设计思路
3.1.1设计模块
3.1.1.1主模块main
3.1.1.2find模块
3.1.1.3print模块
3.2算法设计
3.2.1主程序main的程序框图
3.2.2子程序find的程序框图
3.2.3子程序print的程序框图
4、程序调试过程
5、运行结果及说明
5.1创建程序主界面
5.2输入查找素数的范围
5.3求1-5000之间的素数(以xxxx的格式:
“0002”)
5.4求1-5000之间的素数(以数字正常格式:
“2”)
6、经验总结
7、参考文献
8、附:
课程设计源程序
8.1以xxxx的格式:
“0002”(全程序)
8.2以xxxx的格式:
“2”(只附print模块)
求1-5000之间的素数
1、课程设计问题描述及问题分析
1.1课程设计问题描述
试用汇编语言写一个程序,求1-5000之间的素数,并打印这个结果。
1.2问题分析
由本次课程设计的课题内容分析可得,解决问题的初始条件:
(1)完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
(2)完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要判断一个数是否是素数,必须看是否存在除1和它本身之外的数能整除它,因而需要使用单独的寄存器分别存储除数和被除数,将被除数扩展为双字后与除数相除,判断余数是否为零。
若余数为零且除数不是1和被除数本身,则将原数自增加,继续判断以后的数;若除数不为零,且除了1和被除数本身之外再无可除尽的除数,则进行输出素数的操作。
当然,要注意程序界面的结构,子程序之间的调用与回复也要结构清晰。
2、课程设计要求
在进行本课程设计时,要注意运用汇编语言程序设计的知识,进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和用户界面的设计。
具体的设计任务及要求:
(1)熟悉汇编语言循环结构,熟悉开发工具MASM
(2)运用自己所学知识进行设计实现并打印出1-5000之间的素数;
(3)程序采用子程序结构,注意结构清晰;
(4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
3、程序设计
本程序设计基本思想是:
判断一个数是否为素数,则需要用从2开始到i-1的数作为除数,看原数作为被除数时是否能将某些除数除尽,若不存在这样的除数,即都不能整除2到i-1的数,则原数为素数;若存在整除的除数,则不为素数,不予输出。
3.1设计思路
本次课程设计题目要求输出1~5000之间的素数,在完成任务要求的前提下,可以增加让用户输入要查找的素数的范围的功能,例如用户可以输入2000,4000等等的数值范围,那么程序可以在屏幕上打印出数值范围内的素数,既完成了题目的要求,也根据自己的知识扩展了程序的功能。
3.1.1设计模块
该课程设计的程序结构主要由三个模块组成,分别是主程序模块main,接受数值并转化运算模块check和查找素数模块,他们的模块框图如下所示:
3.1.1.1主模块main
main模块是总控制模块,负责调用子程序,当从键盘输入一个数字0或1,分别代表退出和进入查找,以此来提示用户选择相应的选项。
如果用户选择1查找,则调用模块find完成接受用户输入的查找范围并完成ASCII码到数字的转换功能,并调用模块print完成查找输入范围内的素数的查找并在屏幕上显示的功能;若用户选择0查找则退出程序。
3.1.1.2find模块
子程序find功能是将用户输入的数值字符串转换为数字,同时检查是否输入了非数字字符。
当用户从键盘输入一个10000以内的数字字符串,程序会将字符串保存在缓冲区buf内。
然后将转换得到的查找范围放在BX内,并置是否含有非数字字符的标志just。
期间,系统依次从buf内取出输入的各个字符,检查它是否为数字字符,如果是的话根据其位置乘以相应的权值,加到BX,继续取下一个;如果为否的话,则置just为0退出模块。
如果输入没有非数字字符的话则置just为1,转化成功,退出模块
3.1.1.3print模块
print模块首先根据从find模块中转换得到的查找范围BX的内容从2开始检查,从小到大依次让查找范围内的所有数除以比它小而大于等于2的所有数,如果不能除尽的话则是素数,在屏幕上打印此查找范围内的所有素数。
若以“xxxx”的格式打印素数,则需要将素数除权值1000、100、10、1后的商依次输出即可,若以“2、3”的格式输出,则需要考虑当前素数除以权值的商是否为零,且是否是输出的第一位,例如“103”的第一位的空格及第三位的0。
3.2算法设计
根据设计总体思路与分析,对程序的全貌有了基本的了解之后,对各模块所对应的程序框图设计如下:
3.2.1主程序main的程序框图
3.2.2子程序find的程序框图
3.2.3子程序print的程序框图如下:
4、程序调试过程
在本课程设计的程序调试过程中,出现错误提示如下:
(1)编辑源程序C:
\DocumentsandSettings\User\桌面\.求1-5000之间的素数.asm
C:
\DocumentsandSettings\User\桌面\.求1-5000之间的素数.asm(12):
errorA2005:
symbolredefinition:
str
C:
\DocumentsandSettings\User\桌面\.求1-5000之间的素数.asm(29):
errorA2006:
undefinedsymbol:
str_select
原因分析:
定义字符串时,没有注意到字符串之间的命名区别,混淆了str与str_select,造成编译错误,无法运行。
解决办法:
修改数据段字符串相同的定义的名称。
一个是str,一个是str_select。
另外,区别其他的定义字符串,如str_wrong、str_in、str_result。
(2)编辑源程序C:
\DocumentsandSettings\User\桌面\.求1-5000之间的素数.asm
C:
\DocumentsandSettings\User\桌面\.求1-5000之间的素数.asm(64):
errorA2044:
invalidcharacterinfile
原因分析:
程序中第64行的注释引号标示错误,由于注释往往是中英文符号状态下切换,因而这种语法错误很容易产生。
解决办法:
将引号修改为英文状态下的符号,修改后可以看到注释的内容变成绿色,即代表已成功注释。
(3)编辑源程序C:
\DocumentsandSettings\User\桌面\.求1-5000之间的素数.asm
C:
\DocumentsandSettings\User\桌面\.求1-5000之间的素数.asm(100):
fatalerrorA1010:
unmatchedblocknesting:
check
原因分析:
第100行处,模块的嵌套不匹配,一般都是由于前后段名不相同、前后子程序名不相同。
需要配对出现的指令不一致等会出现该错误。
修改方法:
将模块的段名命名成一致的,即findproc与findendp。
保证程序能正常运行。
5、运行结果及说明
5.1创建程序主界面
程序运行开始,main模块是总控制模块,负责调用子程序。
此时,屏幕上会显示“Pleaseinputanumberbetween1~~10000:
”,以提示用户选择相应的选项,当从键盘输入一个数字0或1,分别代表退出和进入查找。
如果用户选择1查找,则调用模块find完成接受用户输入的查找范围并完成ASCII码到数字的转换功能,并调用模块print完成查找输入范围内的素数的查找并在屏幕上显示的功能;若用户选择0查找则退出程序。
此时,应选择1,进行素数的查找。
5.2输入查找素数的范围
当用户从键盘输入一个10000以内的数字字符串,程序会将字符串保存在缓冲区buf内。
然后,系统分别调用find模块及print模块,将2开始到i-1的数作为除数,看原数作为被除数时是否能将某些除数除尽,若不存在这样的除数,即都不能整除2到i-1的数,则原数为素数;若存在整除的除数,则不为素数,不予输出。
例如,输入100,结果如下图:
5.3求1-5000之间的素数
(以xxxx的格式:
“0002”)
当输入的数值范围大于10000时,程序会出现以下的错误:
5.4求1-5000之间的素数(以数字的正常格式:
“2”)
结论:
本课程设计要求的任务是求1-5000之间的素数,但可以设计成更难一些的程序,即设计成根据用户输入的数的范围来求素数并打印出来,这也是在程序原有的基础上的一种拓展。
试验中,要判断一个数是否是素数,必须看这个数是否存在除1和它本身之外的整除的数,因而需要首先判断余数是否为零。
当然,要注意程序界面的结构清晰,子程序之间的调用与回复也要注意层次。
6、经验总结
通过本次课程设计,我进一步了解了汇编语言的MASM运行环境,巩固了自己的汇编语言程序设计知识。
在设计求素数的程序时,我大胆的尝试了拓展程序的设计,让程序完成更多的功能。
期间,从问题的分析到程序的初始设计,我都认真地复习了在这一学期所学的汇编语言程序设计的知识,让自己对于汇编语言的编程有个大致的掌握。
在进行程序总体分析与设计遇到问题时,我会询问同学的意见,改怎样更简洁、怎样更清晰。
虽然规划程序的总体机构花费了很多的时间,但这为编辑程序提供了很好的结构。
每个功能的分布情况,每个子程序应完成的任务,都是一目了然的。
分而治之,大概就是这个意思。
最后,在不懈努力下,我成功的完成了程序的框架设计,并成功地运用IBM-PC汇编语言完成了程序的编辑。
调试程序出现了许多小错误,一半是粗心,一半是逻辑的错误。
经过最终的调试和测试后,程序成功的运行了,不仅输出了1~5000之间的所有素数,完成了题目的要求,而且还能根据用户输入的任何数来打印出输入的范围的素数。
在实验中,我也遇到很多困难,但是我并没有气馁,因为失败是成功之母,只有不断的犯错误,我们才能知道自己有哪些不足。
在程序实现过程中,我反复修改代码,不论是语法错误还是逻辑错误,我都认真的找出并修正,务必将实验要求最好的实现。
如果,自己实在找不出错误的所在,那么我会向周围的同学请教。
虽然大家的课题不一样,但所做的程序设计都是出于数据结构知识的应用,因此,我会简单的向他们讲解一下课题要求,指出自己认为有可能不对的地方,然后听取他们的意见。
一人计短,二人计长。
错误正是在实践中改正的。
但是,在整个程序设计的过程中,也存在着许多不容忽视的问题。
例如,在输出素数时,由于没有把相应得数字转换位ASCII码,导致屏幕上输出了乱码,这是因为在程序开始之时把数据段首地址赋予DS段寄存器;至于在进行除法以检测被除数是否为除数整除时,没有将原被除数扩展为双字,致使除法无法正常进行,无法正确输出素数。
这些都是我在编程中发现的自己的不足,而作为一个学习计算机的大学生来说,此等错误是不应该出现的。
总之,通过实验,我学会了独立思考问题,独立写程序,独立修正问题,并且能主动向大家学习。
无论在何地、何时,有朋友帮忙指正所得到工作成就远比一个人独立打拼的成就多得多。
所以,我不仅要提高自身的编程素质,也要在平时的编程训练中培养团队合作精神。
7、参考文献
【1】沈美明,温冬婵,2001,IBM-PC汇编语言程序设计(第二版),清华大学出版社,
【2】沈美明,温冬婵,2001,IBM-PC汇编语言程序设计实验教程,清华大学出版社,
8、附:
课程设计源程序
8.1以xxxx的格式:
“0002”(全程序)
datasegment
;定义缓冲区接收用户输入的查找范围字符串
bufdb10
db?
db10dup(?
)
justdb1;定义输入是否有非数字字符标志
factordw10;用以权值的增加或减少
mulfactordw1;输入数字的每一位的权值
strdb13,10,'Pleaseinputanumberbetween1~~10000:
',13,10,'$'
str_selectdb13,10,'Pleaseselectanitem!
0:
exit,1:
start',13,10,'$'
str_wrongdb13,10,'Pleaseinputnumbercharaters!
',13,10,'$'
str_indb13,10,'$'
str_resultdb13,10,'Alloftheprimenumbersneededare:
',13,10,'$'
dataends
;--------------------------------------------------------
codesegment
assumecs:
code,ds:
data
start:
pushds
pushax
movax,data
movds,ax;把数据段首地址赋予ds
;--------------------主程序main------------------------
mainprocfar
p1:
leadx,str_select;要求用户选择进入查找还是推出
movah,9
int21h
movah,01;接收选项
int21h
cmpal,'0';判断用户是否输入正确的选项
jep3
cmpal,'1'
jnep1
callfind;调用find子程序,将用户输入字符串转化为数字
cmpjust,0;判断用户的输入是否都是数字字符
jep2
callprint;调用print子程序,查找并输出相应的素数列表
jmpp1
p2:
leadx,str_wrong;输出提示输入数字字符
movah,09h;显示dx字符
int21h
jmpp1
p3:
ret
popax
popds
movax,004ch
int21h
mainendp
;-------------------子程序find-----------------
findproc
;初始化
movbx,0
movmulfactor,1
movfactor,0ah
leadx,str;输出提示用户输入要查询素数的范围
movah,09h
int21h
leadx,buf;接收用户的输入,保存于缓冲区
movah,0ah
int21h
;-----------------------------
moval,buf[1];将输入的字符的个数保存于si,用于计数
cbw
movsi,ax
Sum:
moval,buf[si+1];取第si+1个字符,判断它是否为数字字符
cmpal,'0'
jbg1
cmpal,'9'
jag1
andax,000fh
mulmulfactor;将此位数字乘以相应的权值并加到bx
addbx,ax
movax,mulfactor;将权值乘以10
mulfactor
movmulfactor,ax
decsi
jnzSum
movjust,1;置是否包含字符标志位
jmpg2
g1:
movjust,0
g2:
ret
findendp
;------------------子程序print-----------------------
;
printproc
leadx,str_in
movah,09h
int21h
leadx,str_result;输出结果
movah,09h
int21h
movax,mulfactor;把mulfactor初始化为输入数值的最高位权值
cwd
divfactor;因在find程序中,mulfactor多乘了一次10
movmulfactor,ax
movcx,bx;CX←输入的数值
movsi,1h
recoverAx:
movax,si;恢复ax的值
next:
incax;检查下一个数值
cmpax,cx
jaExit
movbx,2h;除数应该从2开始
text:
cmpbx,ax;判断一个数是否能被比它小的数整除
jnbcontinue
movsi,ax
cwd
divbx
cmpdx,0000H
jerecoverAx
incbx
movax,si
jmptext
continue:
;打印当前素数
movbx,ax
anddx,0h
movdi,mulfactor
l1:
divdi
addax,30h
movsi,dx;saveremain
movdl,al
movah,2h
int21h
movax,di
cwd
divfactor
movdi,ax
movax,si
cwd
cmpdi,0h
jnel1
;输出一个空格
movdl,20h
movah,2h
int21h
movax,bx
cmpax,cx
jbnext
Exit:
ret
printendp
;-------------------------------------
codeends
endstart
8.2以xxxx的格式:
“2”(只附print模块)
;------------------子程序print-----------------------
printproc
leadx,str_in;原数行与结果行打印之间的间隔
movah,09h
int21h
leadx,str_result;输出结果字符串
movah,09h
int21h
movax,mulfactor;把mulfactor初始化为输入数值的最高位权值
cwd
divfactor;因在find程序中,mulfactor多乘了一次10
movmulfactor,ax;正确的权值
movcx,bx;CX←输入的数值
movsi,1
recoverAx:
movax,si;恢复ax(被除数)的值1--cx
next:
incax;检查下一个数值
cmpax,cx
jaExit;被除数超过范围
movbx,2h;除数应该从2开始
text:
cmpbx,ax;判断一个数是否能被比它小的数整除
jnbcontinue;>=无小本身的除数
movsi,ax;预存ax
cwd
divbx;除
cmpdx,0000H;尽否?
jerecoverAx;除尽,恢复ax,继续下一个
incbx;除不尽,继续+因子
movax,si;恢复ax的单字--拓展
jmptext
continue:
;打印当前素数
movbx,ax;原数存bx
anddx,0h
movdi,mulfactor;最高位权值
movBP,0
l1:
divdi;dx:
ax除di,2149/1000=2[ax]+149[dx]
cmpax,0h
jnzP
cmpBP,0;ax=0,几个了?
jAP;>0,已有
movdl,20h
movah,2h
int21h
JMPQ
P:
addax,30h;AX商转换为ascii,
movsi,dx;DX余数-si
movdl,al;输出al[商,最高位]
movah,2h
int21h
INCBP
Q:
movax,di;权值[1000]
cwd;双字dx:
ax
divfactor;(10),转换次高位权值100
movdi,ax;新权值--【商】
movax,si;dx余数--ax,【149】继续分出次高位
cwd
cmpdi,0h
jnel1;新权值不为0,继续除di
;输出一个空格
movdl,20h
movah,2h
int21h
movax,bx
cmpax,cx
jbnext;小,ax进行下一个数
Exit:
ret
printendp
;-------------------------------------
本科生课程设计成绩评定表
班级:
姓
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 求15000的素数 汇编课程设计 15000 素数 汇编 课程设计