课程设计素数.docx
- 文档编号:4145399
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:16
- 大小:220.38KB
课程设计素数.docx
《课程设计素数.docx》由会员分享,可在线阅读,更多相关《课程设计素数.docx(16页珍藏版)》请在冰豆网上搜索。
课程设计素数
课程设计素数
《汇编语言程序设计》课程设计
题目:
求1~N之间的所有素数(质数)
专业:
计算机科学与技术
学号:
810070
姓名:
陈高伟
-第二学期
一.设计目的
汇编语言课程设计是对所学课程内容全面、系统的总结、巩固和提高的一项课程实践活动。
根据汇编语言的特点,选择相应的题目,在老师的指导下,由学生独立完成。
课程设计要求同学们熟悉汇编语言的编程,BIOS中断调用、系统功能调用、磁盘数据的查询、存取等相关知识。
经过课程设计,一方面提高运用汇编语言编程解决实际问题的能力,另一方面使同学们更深入的了解计算机系统内部的有关知识,为以后的学习和系统开发奠定良好的基础。
二.设计内容
从键盘输入一个十进制数N(最大为65535),把小于等于该数的所有素数显示在屏幕上。
三.程序设计原理
1、本课程设计总体包含了结构化程序设计方法的三种逻辑结构:
顺序结构、循环结构和选择结构,另外也用到了模块化设计,主程序去调用PRINT显示子程序,进而实现整体素数结果的显示;
2、在程序开始前,先在数据段定义数组bcd,在子程序PRINT中将借助bcd来逐个显示素数;接着定义一个字单元SHU用来存用户输入的数以及定义一些程序运行时必要的提示信息和变量以及定义一些必要的宏;
3、数据段定义完毕后,就进入代码段的书写,先初始化一系列程序运行需要的变量、数组等,接着打印菜单,提示输入选择菜单,这里用到选择结构;
4、提示用户输入数据(2--65535),将用户输入的数据N转化为对应十进制数的二进制存在字单元SHU中,这里就用到了循环结构;
5、用筛选法求《=用户所输入的数N的所有素数,并借组PRINT显示子函数来显示所有素数,这里也用到循环结构;
6、考虑到用户若输入的数N很大,则产生的所有素数超出屏幕一次所能查看的个数,因此用count计数变量来控制每输出8个素数换一行,用count1计数变量经过判断和循环实现分页显示的功能;
7、每做一次素数显示就会自动跳转到菜单让用户重新选择是否要再一次执行程序,若用户选择退出,那么程序结束,若用户选择继续那么跳到第4步继续执行。
四.程序流程图
N
Y
Y
N
Y
N
SHU=BX
BX<2?
Y
N
Y
AX=3
BX=2
PUSHAX
DX清零
AX=(DX:
AX/BX)的商
DX=(DX:
AX/BX)的余数
POPAX
BX=BX+1
DX=0?
BX=AX?
调用显示素数子函数PRINT显示AX里的素数
Count=count+1
Count1=count1+1
N
Y
N
N
Y
Y
N
NY
NY
下面是子程序PRINT的流程图:
N
Y
令SI指向数组BCD第5个位置
将存在AX里的素数输出
POPBX
POPAX
POPDX
RET结束
五.源程序
DATASSEGMENT
SHUDW?
;========用于存用户输入的数
NDW10
BCDDB5DUP('')
menudb'------------------------------------------',13,10
db'*******|1.Lookingforprimenumber.|*******',13,10
db'*******|0.Exit|*******',13,10
db'------------------------------------------',13,10,'$'
inputdb'Pleasechooce:
$'
put_numbdb'Pleaseinputnumber(2~~65535):
$'
finddb'Alltheprimesarefound:
',13,10,'$';
countdb0
count1db0
goondb'Continuetocheck...',13,10,'$'
DATASENDS
putmacrox;=====输出提示信息
leadx,x
movah,9
int21h
endm
huanhangmacro;=====回车换行
cout13
cout10
endm
coutmacrow
pushdx
pushax
movdl,w
movah,2
int21h
popax
popdx
endm
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
go_menu:
movcount,0;=count用于统计输出个数,在这里输出8个换一行
movcount1,0
;========================================================
movbx,0
movcx,5;*******************
re_set:
;*初始化用于显示*
movbcd[bx],20h;*输出素数的数组bcd*
incbx;*******************
loopre_set
;=========================================================
huanhang
putmenu;==============打印菜单。
choice:
huanhang
putinput
MOVAH,1
INT21H
cmpal,'0'
jzfinish
cmpal,'1'
jnzchoice
huanhang
re_put:
putput_numb
;=========================================================
MOVBX,0
NEW_CHAR:
MOVAH,1
INT21H
SUBAL,30H
JLEXIT
PUSHAX;**************************
MOVAX,BX;*用户输入数据(2--65535)*
MULN;**************************
movbx,ax
POPAX
MOVAH,0
ADDBX,AX
JMPNEW_CHAR
EXIT:
MOVSHU,BX
;==========================================================
cmpbx,2
jbre_put;=====若用户输入错误,则自动跳转让用户重新输入
huanhang
putfind;=====提示将要显示结果
;============================================================
MOVAX,2
CALLPRINT
inccount
inccount1
cout20h
cmpbx,2
jzgo_menu
MOVAX,3
L1:
MOVBX,2
L2:
PUSHAX
xordx,dx
DIVBX
POPAX
CMPDX,0;*********************
JZno_prime;*用筛选法求《=用户所*
INCBX;*输入的数的所有素数*
CMPBX,AX;*********************
JNZL2
CALLPRINT
inccount
inccount1
cout20h;===打印一个加一个空格
cmpcount1,120
jzcontinue
cmpcount,8;===打印8个换一行
jzline_feed
jmpno_prime
continue:
huanhang
movcount,0
movcount1,0
pushax
putgoon
movah,1
int21h
popax
no_prime:
INCAX
CMPAX,SHU
JNAL1
;=======================================================
jmpgo_menu
line_feed:
huanhang
movcount,0
jmpno_prime
finish:
MOVAH,4CH
INT21H
;========================================================
PRINTPROC
pushdx
PUSHAX
PUSHBX
LEASI,BCD
MOVBX,10
L3:
XORDX,DX
DIVBX
MOV[SI],DL
INCSI
ORAX,AX
JNZL3;*************************
LEASI,BCD+4;*借助BCD数组将素数输出。
*
MOVCX,5;*************************
L4:
MOVDL,[SI]
CMPDL,''
JZL5
ADDDL,30H
L5:
MOVAH,2
INT21H
DECSI
LOOPL4
POPBX
POPAX
popdx
RET
PRINTENDP
;=========================================================
CODESENDS
ENDSTART
六.调试过程
1、用户菜单选项选择不对则提示用户重新输入,直到用户输入正确(0或1)为止:
2、让用户输入一个2到65535之间的数,并打印小于等于该数的所有素数:
3、当输入的数产生的所有素数个数超出屏幕显示范围时,采用分页显示功能:
七.遇到的问题及解决方法
1、遇到的问题:
在打印显示素数时,显示一个素数后面就跟着打印一个空格,可是由于定义的显示空格的宏被调用后改变了AX和DX的值使得后面显示时出现了严重错误。
解决方法:
在定义显示空格的宏时把AX和DX中的内容压入栈保护起来,显示完后,再将其出栈,这样就解决了上面的问题。
2、遇到的问题:
在做二进制转换成十进制的除十取余运算时,用DIV之前没有把DX清零,导致除法出错,程序无法正常运行。
解决方法:
在用DIV之前把DX清零。
3、遇到的问题:
在用户输入的数很大导致产生的素数个数超过屏幕一次所能显示的范围时,无法查看所有的素数。
解决方法:
在程序数据段中设一个count1变量用来计数,输出一个素数count1就加1,但count1达到120时就停止输出并提示用户按任意键继续查看其它没显示的素数,以此分页显示的功能来解决上述问题。
八.参考文献
1.IBM-PC汇编语言程序设计实验教程沈美明温冬婵张赤红
2.IBMPCDOS3.30用户指南&用户参考手册&用户技术手册 廖萃淇
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 素数
![提示](https://static.bdocx.com/images/bang_tan.gif)