实验5 循环程序设计实验Word文件下载.docx
《实验5 循环程序设计实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验5 循环程序设计实验Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
MOVDS,AX
PLEASE:
XORSI,SI
XORAX,AX
LEADX,message;
提示输入字符串
MOVAH,9
INT21H
INPUT:
MOVAH,1
CMPAL,1BH;
按ESC退出程序
JEEXIT
CMPAL,'
0'
;
小于'
为其他字符
JBOTHERS
9'
大于'
小于'
是数字
JBDIGITAL
A'
Z'
是字母
JBLETTER
a'
是其他字符
z'
是字母;
不然为其他字符
OTHERS:
INCnumber+4;
用number数组第3个字存储单元统计其他字符个数
CMPAL,0DH;
按回车就显示统计结果
JES1
JMPINPUT;
继续输入
LETTER:
INCnumber+2;
用number数组第2个字存储单元统计字母个数
DIGITAL:
INCnumber+0;
用number数组第1个字存储单元统计数字个数
继续输入
S1:
LEADX,str1;
用于显示数字的个数
INT21H
MOVAX,number+0
JMPCHANGE;
跳到进制转换部分
S2:
LEADX,str2;
用于显示字母的个数
MOVAX,number+2
S3:
DECnumber+4;
回车不计入其中
LEADX,str3;
用于显示其他字符的个数
MOVAX,number+4
CHANGE:
MOVBX,SP;
备份堆栈指针
CAN1:
这一部分用来实现进制转换
MOVDX,0
MOVCX,10
DIVCX
PUSHDX
CMPAX,0
JACAN1
CAN2:
POPAX
ADDAX,30H
MOVDL,AL
MOVAH,02H
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;
退出程序
CODESENDS
ENDSTART
2.预留字符串口令,输入口令串与预留密码串比较。
若匹配则显示“MATCH!
CONGRATULATION”,否则显示“NOMATCH!
”,并让用户重新输入,程序能对口令进行测试,但测试次数最多3次,若3次输入密码皆错,给出相应的提示信息,程序退出。
PASSWORDDB'
123456'
预留密码设定为123456
str1db0ah,0dh,'
MATCH!
!
CONGRATULATION$'
str2db0ah,0dh,'
NOMATCH!
str3db0AH,0DH,'
PLEASEINPUTYOURPASSWORD(IfnothingandpressENTERkey,itwillquit.):
str4db0ah,0dh,'
YOUHAVEINPUTTHREESTRINGOFWRONGPASSWORDS,NOWITWILLQUIT.$'
MOVBX,00h;
将BX清零
MOVSI,OFFSETPASSWORD;
把预留密码的偏移地址给SI
MOVSI,0
LEADX,str3
MOVAH,09H
MOVCL,0
MOVCH,0;
将CL和CH清零
MOVAH,01H;
输入字符
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;
零输入,并退出程序
CMPCL,7;
包括回车7个字符,不等于则与预留密码不符合
JNENOMATCH
CMPCH,0;
字符不同个数为0,则与预留密码相符合
JNENOMATCH
MATCH:
LEADX,str1;
字符符合语句
JMPSTART
NOMATCH:
LEADX,str2;
字符不符合语句
INCBX;
用BX统计密码输入错误次数
CMPBX,03h
JBSTART
LEADX,str4;
显示错误信息
MOVAH,4CH;
退出语句
3.有一个首地址为A的N字无序数组,编制程序采用选择排序法使该数组中的数按照从大到小的次序排序输出。
ADW8,9,6,1,3,4,5,7,6,0
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
;
下面为显示部分
CAN:
ADDAX,0030H;
转换为十进制显示
MOVDX,AX
MOVAH,2
MOVDL,20H;
每次显示一个数就显示空格
MOVAH,2
ADDBX,2;
显示下一个数
LOOPCAN
MOVAH,4CH
4.编写程序用递归方法计算斐波那契数列的前七个值{1,1,2,3,5,8,13},并以十进制形式显示在屏幕上。
ARRAYDB20DUP(?
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
SHI:
CBW
CMPSI,6
JBESHI
退出
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
CODE,DS:
DATE,ES:
DATE
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
MOVDI,BX
LEASI,KEYWORD
MOVCX,3
REPECMPSB;
串比较
JNZNOMATCH
INCAX;
是,SUN的个数加1
ADDBX,2
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;
INCBX
DECCH
JNZDONE1
DISPLAY:
LEADX,DISP;
显示字符串程序(将DISP和DAT一起显示)
MOVAH,09H
RET
MAINENDP
CODEENDS;
以上定义代码段
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.编辑实验方案,运行程序,并调试程序,报告中写出正确结果以及遇到的问题和解决方法。
七.实验记录及程序清单
见于实验内容
八.思考题
1、习题2中当进行口令检查时,若要求不把用户从键盘上键入的密码串显示在屏幕上
而只挨个显示“*”号,如何修改程序?
答:
把MOVAH,01H;
改为MOVAH,07H;
输入不回显
MOVDL,’*’
即可。
2、如果采用汇编语言实现九九乘法表的输出,讲讲程序设计思路及解决办法。
(不足的是出现多余的式子)
XDB0
YDB0
DATEENDS
CODE,DS:
DATE
MOVAX,DATE
MOVX,31H;
给X,Y赋值1
MOVY,31H;
MOVDL,X;
显示x
MOVDL,'
*'
显示乘号
MOVDL,Y;
显示Y
='
显示等号
下面为处理乘积部分
MOVBL,X
MOVBH,Y
SUBBL,30H;
转换为十六进制
SUBBH,30H
MOVAL,BL
MULBH
这一部分用来实现十六进制转换为十进制
显示部分
MOVDL,20H;
显示一个式子,就显示空格
INCY
CMPY,39H;
乘数大于9,就进入下一行
JBECAN
MOVY,31H
INCX
MOVDL,0DH;
回车换行
MOVDL,0AH
CMPX,39H;
被乘数大于9就退出
CODEENDS
九.实验总结
通过这次实验,我学会了单重循环及多重循环的程序设计方法,初步掌握了循环嵌套及递归的程序设计方法,学会针对不同的问题,选用不同的组织循环的方法,进一步熟悉了利用DEBUG程序、CODEVIEW调试程序的方法。
虽然编程过程中多多少少遇到一些问题,但都尽力改进了,还需努力。