武汉理工大学 汇编课设 15000之间的素数.docx

上传人:b****8 文档编号:10927146 上传时间:2023-02-23 格式:DOCX 页数:17 大小:332.39KB
下载 相关 举报
武汉理工大学 汇编课设 15000之间的素数.docx_第1页
第1页 / 共17页
武汉理工大学 汇编课设 15000之间的素数.docx_第2页
第2页 / 共17页
武汉理工大学 汇编课设 15000之间的素数.docx_第3页
第3页 / 共17页
武汉理工大学 汇编课设 15000之间的素数.docx_第4页
第4页 / 共17页
武汉理工大学 汇编课设 15000之间的素数.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

武汉理工大学 汇编课设 15000之间的素数.docx

《武汉理工大学 汇编课设 15000之间的素数.docx》由会员分享,可在线阅读,更多相关《武汉理工大学 汇编课设 15000之间的素数.docx(17页珍藏版)》请在冰豆网上搜索。

武汉理工大学 汇编课设 15000之间的素数.docx

武汉理工大学汇编课设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

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1