实验5 循环程序设计实验.docx

上传人:b****6 文档编号:8017880 上传时间:2023-01-28 格式:DOCX 页数:17 大小:121.67KB
下载 相关 举报
实验5 循环程序设计实验.docx_第1页
第1页 / 共17页
实验5 循环程序设计实验.docx_第2页
第2页 / 共17页
实验5 循环程序设计实验.docx_第3页
第3页 / 共17页
实验5 循环程序设计实验.docx_第4页
第4页 / 共17页
实验5 循环程序设计实验.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

实验5 循环程序设计实验.docx

《实验5 循环程序设计实验.docx》由会员分享,可在线阅读,更多相关《实验5 循环程序设计实验.docx(17页珍藏版)》请在冰豆网上搜索。

实验5 循环程序设计实验.docx

实验5循环程序设计实验

南昌大学实验报告

学生姓名:

学号:

专业班级:

实验类型:

□验证■综合□设计□创新实验日期:

2010-12-13实验成绩:

实验5循环程序设计实验

一.实验目的

1.掌握单重循环及多重循环的程序设计方法;

2.掌握循环嵌套及递归的程序设计方法;

3.学会针对不同的问题,选用不同的组织循环的方法;

4.进一步熟悉利用DEBUG程序、CODEVIEW调试程序的方法,并检查和验证结果的正确性。

二.实验内容

1.从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最后显示出这三类的计数结果。

源程序如下:

DATASSEGMENT

numberDW20dup(?

TABLEDWS1;创建一个地址表

DWS2

DWS3

messageDB0DH,0AH,'PLEASEINPUTYOURCHARACTERS(press"ESC"toendup):

$'

str1DB0DH,0AH,'THENUMBEROFDIGITALSIS:

$'

str2DB0DH,0AH,'THENUMBEROFLETTERSIS:

$'

str3DB0DH,0AH,'THENUMBEROFTHEOTHERSIS:

$'

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

PLEASE:

XORSI,SI

XORAX,AX

LEADX,message;提示输入字符串

MOVAH,9

INT21H

INPUT:

MOVAH,1

INT21H

CMPAL,1BH;按ESC退出程序

JEEXIT

CMPAL,'0';小于'0',为其他字符

JBOTHERS

CMPAL,'9';大于'0',小于'9',是数字

JBDIGITAL

CMPAL,'A';大于'9',小于'A',为其他字符

JBOTHERS

CMPAL,'Z';大于'A',小于'Z',是字母

JBLETTER

CMPAL,'a';大于'Z',小于'a',是其他字符

JBOTHERS

CMPAL,'z';大于'a',小于'z',是字母;不然为其他字符

JBLETTER

OTHERS:

INCnumber+4;用number数组第3个字存储单元统计其他字符个数

CMPAL,0DH;按回车就显示统计结果

JES1

JMPINPUT;继续输入

LETTER:

INCnumber+2;用number数组第2个字存储单元统计字母个数

JMPINPUT;继续输入

DIGITAL:

INCnumber+0;用number数组第1个字存储单元统计数字个数

JMPINPUT;继续输入

S1:

LEADX,str1;用于显示数字的个数

MOVAH,9

INT21H

MOVAX,number+0

JMPCHANGE;跳到进制转换部分

S2:

LEADX,str2;用于显示字母的个数

MOVAH,9

INT21H

MOVAX,number+2

JMPCHANGE;跳到进制转换部分

S3:

DECnumber+4;回车不计入其中

LEADX,str3;用于显示其他字符的个数

MOVAH,9

INT21H

MOVAX,number+4

JMPCHANGE;跳到进制转换部分

CHANGE:

MOVBX,SP;备份堆栈指针

CAN1:

;这一部分用来实现进制转换

MOVDX,0

MOVCX,10

DIVCX

PUSHDX

CMPAX,0

JACAN1

CAN2:

POPAX

ADDAX,30H

MOVDL,AL

MOVAH,02H

INT21H

CMPSP,BX

JACAN2

ADDSI,2

CMPSI,4;SI若大于4,就跳到清零语句;否则跳到下一条显示结果

JAZERO

JMPTABLE[SI]

ZERO:

;给number数组清零,以供下次统计使用

MOVnumber+0,0

MOVnumber+2,0

MOVnumber+4,0

JMPPLEASE;完成一次统计,进入下一次统计

EXIT:

MOVAH,4CH;退出程序

INT21H

CODESENDS

ENDSTART

2.预留字符串口令,输入口令串与预留密码串比较。

若匹配则显示“MATCH!

CONGRATULATION”,否则显示“NOMATCH!

”,并让用户重新输入,程序能对口令进行测试,但测试次数最多3次,若3次输入密码皆错,给出相应的提示信息,程序退出。

源程序如下:

DATASSEGMENT

PASSWORDDB'123456';预留密码设定为123456

str1db0ah,0dh,'MATCH!

!

CONGRATULATION$'

str2db0ah,0dh,'NOMATCH!

$'

str3db0AH,0DH,'PLEASEINPUTYOURPASSWORD(IfnothingandpressENTERkey,itwillquit.):

$'

str4db0ah,0dh,'YOUHAVEINPUTTHREESTRINGOFWRONGPASSWORDS,NOWITWILLQUIT.$'

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

MOVBX,00h;将BX清零

START:

MOVAX,DATAS

MOVDS,AX

MOVSI,OFFSETPASSWORD;把预留密码的偏移地址给SI

MOVSI,0

LEADX,str3

MOVAH,09H

INT21H

MOVCL,0

MOVCH,0;将CL和CH清零

INPUT:

MOVAH,01H;输入字符

INT21H

INCCL;用CL存放输入字符个数

CMPAL,0DH;输入回车跳到判断语句

JEJUDGE

CMPCL,1;CL为1时,SI为0;如果CL不为1,则SI加1

JECOMPARE

INCSI

COMPARE:

CMPAL,PASSWORD[SI]

JEINPUT;字符相同,继续比较

INCCH;用CH存放字符不同个数

JMPINPUT

JUDGE:

CMPCL,01H;零输入,并退出程序

JEEXIT

CMPCL,7;包括回车7个字符,不等于则与预留密码不符合

JNENOMATCH

CMPCH,0;字符不同个数为0,则与预留密码相符合

JNENOMATCH

MATCH:

LEADX,str1;字符符合语句

MOVAH,09H

INT21H

JMPSTART

NOMATCH:

LEADX,str2;字符不符合语句

MOVAH,09H

INT21H

INCBX;用BX统计密码输入错误次数

CMPBX,03h

JBSTART

LEADX,str4;显示错误信息

MOVAH,09H

INT21H

EXIT:

MOVAH,4CH;退出语句

INT21H

CODESENDS

ENDSTART

3.有一个首地址为A的N字无序数组,编制程序采用选择排序法使该数组中的数按照从大到小的次序排序输出。

源程序如下:

DATASSEGMENT

ADW8,9,6,1,3,4,5,7,6,0

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

XORBX,BX

LEABX,A

MOVCX,10;CX为循环计数器

DECCX

LOOP1:

MOVDI,CX

MOVBX,0

LOOP2:

MOVAX,A[BX]

CMPAX,A[BX+2];比较前后两个数

JGECONTINUE

XCHGAX,A[BX+2];前后两数交换位置

MOVA[BX],AX

CONTINUE:

ADDBX,2

LOOPLOOP2

MOVCX,DI

LOOPLOOP1

;下面为显示部分

MOVCX,10

MOVBX,0

CAN:

MOVAX,A[BX]

ADDAX,0030H;转换为十进制显示

MOVDX,AX

MOVAH,2

INT21H

MOVDL,20H;每次显示一个数就显示空格

MOVAH,2

INT21H

ADDBX,2;显示下一个数

LOOPCAN

EXIT:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

4.编写程序用递归方法计算斐波那契数列的前七个值{1,1,2,3,5,8,13},并以十进制形式显示在屏幕上。

源程序如下:

DATASSEGMENT

ARRAYDB20DUP(?

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

XORSI,SI

XORDI,DI

MOVARRAY[SI],01H

MOVARRAY[SI+1],01H

MOVCX,6

RETURN:

MOVAL,ARRAY[SI]

MOVAH,ARRAY[SI+1]

ADDAL,AH

MOVARRAY[SI+2],AL

INCSI

LOOPRETURN

MOVSI,0

SHI:

MOVAL,ARRAY[SI]

CBW

MOVBX,SP;备份堆栈指针

CAN1:

;这一部分用来实现进制转换

MOVDX,0

MOVCX,10

DIVCX

PUSHDX

CMPAX,0

JACAN1

CAN2:

POPAX

ADDAX,30H

MOVDL,AL

MOVAH,02H

INT21H

CMPSP,BX

JACAN2

INCSI

CMPSI,6

JBESHI

EXIT:

MOVAH,4CH;退出

INT21H

CODESENDS

ENDSTART

5设有一段英文,其字符变量名为ENG,并以$字符结束。

试编写一程序,统计其中单词的个数,并查出单词SUN在该文中的出现次数,并以格式“SUN:

××××”显示出次数。

(选做)

源程序如下:

DATESEGMENT

ENGLISHDB'Hereissun,sun,sun,wall,sun,sun,wall,sun,sun,sun.$'

DISPDB'SUN:

'

DATDB'0000',0DH,0AH,'$'

KEYWORDDB'sun'

DATEENDS

CODESEGMENT

MAINPROCFAR

ASSUMECS:

CODE,DS:

DATE,ES:

DATE

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DATE

MOVDS,AX;给DS赋值

MOVES,AX;给ES赋值

BEGIN:

MOVAX,0

MOVDX,DISP-ENGLISH-2;计算ENGLISH的长度(每次比较sun,因此比较次数-2)

LEABX,ENGLISH

COMPARE:

MOVDI,BX

LEASI,KEYWORD

MOVCX,3

REPECMPSB;串比较

JNZNOMATCH

INCAX;是,SUN的个数加1

ADDBX,2

NOMATCH:

INCBX;指向ENGLISH的下一个字母

DECDX

JNZCOMPARE

DONE:

MOVCH,4;将次数转换为16进制数的ASCII码

MOVCL,4

LEABX,DAT;转换结果存入DAT单元中

DONE1:

ROLAX,CL

MOVDX,AX

ANDDL,0FH;取一位16进制数

ADDDL,30H

CMPDL,39H

JLESTORE

ADDDL,07H;是“A~F”所以要加7

STORE:

MOV[BX],DL;转换结果存入DAT单元中

INCBX

DECCH

JNZDONE1

DISPLAY:

LEADX,DISP;显示字符串程序(将DISP和DAT一起显示)

MOVAH,09H

INT21H

RET

MAINENDP

CODEENDS;以上定义代码段

ENDSTART

6.现有一个班级,总共3个学生,4门课成绩。

请编写一程序,输入学生成绩后,求出每个学生课程成绩的最高分、平均分,每门课程的最高分、平均分及该班所有课程成绩的总平均分。

(选做)

三.实验要求

1.编写实验内容要求的四个程序,注意习题2可以基于分支程序实验的习题3进行完善,习题3数组元素排序最后输出需要考虑进制转换问题。

习题5、6任选一。

2.熟悉源程序汇编、连接命令的使用方法。

3.认真完成上述习题,采用DEBUG或CODEVIEW进行调试,编辑实验方案,运行程序,并调试程序,写出正确结果以及遇到的问题和解决方法。

4.实验过程请认真记录,并对结果进行分析写出实验体会或意见。

四.实验环境

PC微机

DOS操作系统或Windows操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五.实验步骤

1.用EDIT或其它编辑软件,编写.ASM源程序,

2.对其进行汇编及连接,产生.EXE文件。

3.在MS-DOS下运行这两个.EXE文件。

4.对.EXE文件进行调试运行。

(1)用DEBUG调试运行,学会通过命令R、U、D等命令观察数据变化,学会T、G命令来实现程序的单步或断点调试调试。

(2)用CODEVIEW调试运行,学会使用该集成环境中的各个窗口综合观察寄存器、内存单元等变化,学会使用功能键进行单步或断点调试。

六.实验报告要求

1.请将各题中所列截图作详细的文字说明,若要独立编写程序,应指出程序的设计思路、重要数据说明,解决办法及不足,列出相应的程序清单,程序中应有相应的注释信息。

2.在报告中说明本实验是如何利用DEBUG或CODEVIEW进行调试的。

3.编辑实验方案,运行程序,并调试程序,报告中写出正确结果以及遇到的问题和解决方法。

4.实验过程请认真记录,并对结果进行分析写出实验体会或意见。

七.实验记录及程序清单

见于实验内容

八.思考题

1、习题2中当进行口令检查时,若要求不把用户从键盘上键入的密码串显示在屏幕上

而只挨个显示“*”号,如何修改程序?

答:

把MOVAH,01H;输入字符

INT21H

改为MOVAH,07H;输入不回显

INT21H

MOVDL,’*’

MOVAH,02H

INT21H

即可。

2、如果采用汇编语言实现九九乘法表的输出,讲讲程序设计思路及解决办法。

源程序如下:

(不足的是出现多余的式子)

DATESEGMENT

XDB0

YDB0

DATEENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATE

START:

MOVAX,DATE

MOVDS,AX

MOVX,31H;给X,Y赋值1

MOVY,31H;

CAN:

MOVDL,X;显示x

MOVAH,02H

INT21H

MOVDL,'*';显示乘号

MOVAH,02H

INT21H

MOVDL,Y;显示Y

MOVAH,02H

INT21H

MOVDL,'=';显示等号

MOVAH,02H

INT21H

;下面为处理乘积部分

MOVBL,X

MOVBH,Y

SUBBL,30H;转换为十六进制

SUBBH,30H

MOVAL,BL

MULBH

CAN1:

;这一部分用来实现十六进制转换为十进制

MOVDX,0

MOVCX,10

DIVCX

PUSHDX

CMPAX,0

JACAN1

CAN2:

POPAX

ADDAX,30H

MOVDL,AL

MOVAH,02H

INT21H

CMPSP,BX

JACAN2

;显示部分

MOVDL,20H;显示一个式子,就显示空格

MOVAH,2

INT21H

INCY

CMPY,39H;乘数大于9,就进入下一行

JBECAN

MOVY,31H

INCX

MOVDL,0DH;回车换行

MOVAH,2

INT21H

MOVDL,0AH

MOVAH,2

INT21H

CMPX,39H;被乘数大于9就退出

JBECAN

EXIT:

;退出

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

九.实验总结

通过这次实验,我学会了单重循环及多重循环的程序设计方法,初步掌握了循环嵌套及递归的程序设计方法,学会针对不同的问题,选用不同的组织循环的方法,进一步熟悉了利用DEBUG程序、CODEVIEW调试程序的方法。

虽然编程过程中多多少少遇到一些问题,但都尽力改进了,还需努力。

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

当前位置:首页 > 解决方案 > 学习计划

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

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