武汉理工大学 汇编课设 15000之间的素数.docx
《武汉理工大学 汇编课设 15000之间的素数.docx》由会员分享,可在线阅读,更多相关《武汉理工大学 汇编课设 15000之间的素数.docx(17页珍藏版)》请在冰豆网上搜索。
武汉理工大学汇编课设15000之间的素数
1.设计题目
求1~5000之间的所有素数
2.问题描述
应用子程序结构设计友好用户界面,以进一步熟悉开发工具MASM并理解和掌握较复杂程序的设计方法,具体的设计任务及要求如下:
(1)熟悉汇编语言循环结构;
(2)打印出1-5000之间的素数;
(3)程序采用子程序结构,结构清晰;
(4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
3.设计
3.1问题总体思路
题目要求输出1~5000之间的素数,解决问题时用一个main程序和两个子程序来完成不同的功能。
在我写的这个程序里,不把数据固定为5000,而是对2到10000中的所有数据都可找出小于该数的所有素数,增加了灵活性。
在这个问题中需要完成的功能为输入一个符合要求的数据,找出小于其是否为素数,若是素数则输出。
因此需要完成的功能是输入数据,判断数据是否符合要求,判断数据是否为素数,输出符合条件的素数以及错误提示等。
在这里用main程序和inputnumber子程序和printf子程序来完成以上功能。
3.2主要算法设计
(1)主程序main的算法设计思路
在界面上显示选单0和1,让用户选择是开始查询素数还是退出程序。
若用户输入1,则调用输入函数(此处还加了一小段代码,为用户输入不是0和1时的交互程序,若输入既不是0,又不是1,则继续选择0或1),若输入数据符合条件,则调用printf函数,找出并显示小于该数的素数。
其自然语言算法如下:
Start:
1显示选单(0,退出程序;1,开始查询)
2If(choice=0)
3Exit
4Elseif(choice!
=1&&choice!
=0)重新选择
5Elseif(choice=1)调用inputnumber函数,输入数据
6If数据不符合题意,exit
7Else调用printf函数
(2)子程序inputnumber的设计思路
该子程序主要功能为数据的输入。
在界面上显示inputanumberbetween1~~10000:
,用户输入数字字符输入数据存入缓存区,(其中需要牢记掌握键盘输入数据到缓存区的时候DS:
DX为缓冲区首地址,(ds:
dx+1)存储的是实际输入的字符数),然后利用缓存区对每位数字加权算出对应数据并存储在bx中,此处的异常处理为当输入不是数据时,将just置0,表示输入异常。
其自然语言算法如下:
事先初始化bx中数据为0,初始quan为1,权的增量quanrise为10
Start:
1显示inputanumberbetween1~~10000:
;
2键盘输入数据到缓冲区;
3si=buf[1];buf[1]存储的是实际输入的字符数
4If输入的不是数字字符
5Just=0;(exit)
6Else
7For(buf[i=5];si>0;i--)
8{
9Quan=quan*quanrise;
10andBuf[i],000fh;
11Ax=Buf[i]*quan;
12Bx=bx+ax;
13}
(3)子程序printf的设计思路
改程序的主要功能为找出所有小于输入数据的素数并输出。
采用的方法为试除法,即从2开始检查,从小到大依次让查找范围内的所有数,然后除以比它小而大于等于2的所有数,如果全部都不能除尽不能除尽的话则是素数,在屏幕上打印。
其自然语言算法如下
1把quan初始化为输入数值的最高位权值
2CX=bx(输入的数值),SI=1
3for(i=2;i<=cx;i++)
4if(cx%i==0)break;
5Else
6if(i>k)该数为素数,对其输出
4程序清单
datasgsegment
bufdb10
db?
db10dup(?
);定义12个数的数组,作为缓冲区存储数据
justdb1
quanrisedw10;权的增量
quandw1
strdb13,10,'inputanumberbetween1~~10000:
',13,10,'$'
;字符串的初始化,13是回车、10是换行
str_selectdb13,10,'select!
0:
exit,1:
start',13,10,'$'
str_errordb13,10,'inputnumbercharaters!
',13,10,'$'
str_inputdb13,10,'$'
str_outputdb13,10,'numbersneededare:
',13,10,'$'
datasgends
codesgsegment
assumecs:
codesg,ds:
datasg
start:
movax,datasg;datasg为段地址
movds,ax
;段地址只能通过ds送到段寄存器,必须通过寄存器来传送
mainprocfar;main函数
p1:
leadx,str_select
;原操作数有效地址送入寄存器,此处作用为选单,是开始解决问题还是结束
movah,09h
int21h;显示str_select存储的内容,即选单
movah,01h
int21h;输入0或1选择开始解决问题
cmpal,'0'
jep3;若输入的数等于0,
cmpal,'1'
jnep1;若若输入的数不等于1,
callinputnumber
cmpjust,0
jep2
callprintf
jmpp1
p2:
leadx,str_error
movah,09h
int21h
jmpp1
p3:
ret
popax
popds
movax,4c00h
int21h
mainendp
inputnumberproc
movbx,0
movquan,1
movquanrise,10;初始化
leadx,str
movah,09h
int21h;显示Pleaseinputanumberbetween1~~10000:
leadx,buf;buf传送地址,DS:
DX为缓冲区首地址
movah,0ah
int21h;键盘输入数据到缓冲区
moval,buf[1];(ds:
dx+1)存储的是实际输入的字符数
cbw
movsi,ax;字符数并传值给si
Sum:
moval,buf[si+1]
cmpal,'0'
jbg1;<0,
cmpal,'9'
jag1;异常处理
andax,000fh;将字符转化为数
mulquan;每位乘以权
addbx,ax;存储在bx中
movax,quan
mulquanrise
movquan,ax;权增加10倍
decsi
jnzSum
movjust,1
jmpg2;循环4位执行
g1:
movjust,0;说明输入的不是数字,重新输入
g2:
ret
inputnumberendp
printfproc
leadx,str_input
movah,09h
int21h;ds:
dx为串地址,显示输入字符串
leadx,str_output
movah,09h
int21h;;ds:
dx为串地址,显示输出字符串
movax,quan
cwd
divquanrise
movquan,ax;输入数的权
movcx,bx;bx为要输出的数据
movsi,1
a:
movax,si
b:
incax
cmpax,cx
jaExit
movbx,2
abc:
cmpbx,ax
jnbcontinue;大于等于
movsi,ax
cwd
divbx
cmpdx,0000H
jea
incbx
movax,si
jmpabc
continue:
movbx,ax
anddx,0
movdi,quan
d:
divdi
addax,30h;转化为对应大小的数字
movsi,dx
movdl,al
movah,2
int21h
movax,di
cwd
divquanrise
movdi,ax
movax,si
cwd
cmpdi,0h
jned
movdl,20h
movah,2h
int21h
movax,bx
cmpax,cx
jbb
Exit:
ret
printfendp
codesgends
endstart
4.运行结果
(1)初始界面
(2)开始执行
(3)输入范围5000
(4)输出结果
(5)输入另一个数2000
(6)输入过大的数
6.心得体会
通过本次课程设计,进一步巩固了我对masm编译环境的认识,而且对之前所学的课本知识有了进一步的了解和认知,本来感觉对课本知识掌握的不错,但这次课程设计让我发现自己并没有对汇编语言设计有一个很好的了解,对子程序还有很多DOS功能调用掌握的并不好,以至于很多东西都要翻书查找相关内容,重新学习,才能做好程序。
在编译过程中,难免会出现了很多意想不到的各种逻辑,语法,运行上的错误从而得不到正确的结果,特别是在跳转发生是寄存器内容的变化方面需要进行细致的处理,稍有不留心就会出现错误,遇到这些错误时,我们一定要耐心调试,才能够发现其中的错误。
在汇编语言程序设计中,因为是基于底层的语言,有各种跳转语句和控制语句,因此进行程序设计时,我们一定要养成规划程序的总体机构的好习惯,画出程序执行流程图,根据每个功能的分布情况,形成了程序的框架设计,
总之通过这次课程设计,我认识到平时应该多练习编写经典程序,只有这样才能熟练掌握汇编语言,因为编写程序时会遇到各种编译,运行错误,这些都是我们在平常的书本学习遇不到的问题,毕竟遇到问题才能解决问题,才能让我们的水平有质的提升。
参考文献:
【1】沈美明,温冬婵,2001,IBM-PC汇编语言程序设计(第二版),清华大学出版社,201
【2】沈美明,温冬婵,2001,IBM-PC汇编语言程序设计实验教程,清华大学出版社,88