实验5 循环程序设计实验.docx
《实验5 循环程序设计实验.docx》由会员分享,可在线阅读,更多相关《实验5 循环程序设计实验.docx(17页珍藏版)》请在冰豆网上搜索。
实验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调试程序的方法。
虽然编程过程中多多少少遇到一些问题,但都尽力改进了,还需努力。