实验五 循环结构程序设计实验

各题目程序源代码在这里:Leeeeo’s Assembly-Language</strong>

一、实验目的

1.学会单重循环及多重循环程序的基本设计方法;

2.学会循环控制指令的使用方法;

3.学会数据串操作指令的使用方法;

4.学会循环程序的控制方法。

二、实验要求

1.仔细阅读教材中循环程序的组成及控制方法部分;

2.熟练掌握在DEBUG中调试程序的方法;

3.了解DEBUG中T命令与P命令的不同点;

4.掌握循环结构程序的调试方法。

三、实验内容

1.编写程序,完成在屏幕上显示“九九表”的功能。

解题思路:

最外层循环让一个数从1开始增大到9,每一次循环自增1,内层循环让刚刚那个数与1到它之间的数一次相乘相乘,并将结果输出,内层循环结束输出换行。

2.编写程序。已知内存中连续存放着10个带符号字节数据,求出该组数据中的最大值和最小值,结果存放在指定的内存单元中。

解题思路:

设置最大值最小值均为0,依次将10个带符号字节数据与最大值最小值比较,若数据大于最大值则更新最大值,若数据小于最小值则更新最小值,其他情况不变。

3.编写程序。将指定内存中存放的20个带符号的字节数据,分成正数和负数两个数组,分别求这两个数组的数据个数,结果存放在制定的存储单元中。存放格式为:正数个数在前,其后跟正数数组元素,然后是负数个数及负数数组元素。

解题思路:

将这20个带符号的字节数据依次与0作比较,若大于等于0,则计数。比较完之后即可得到正数的个数保存到内存单元,再将这20个带符号数与0作比较,将大于等于0的数保存到内存单元。将20减去正数个数的结果保存到内存单元。最后再将这20个带符号的字节数依次与0作比较,保存小于0的数到内存单元。

4.编写程序。已知在BUFF开始的内存单元中连续存放着30个学生的某科成绩,编制程序,分别统计100分、90~99分、80~89分、70~79分、60~69分及60分以下各分数段的人数,并计算30个学生的平均成绩(取整数),将结果依次存放RESUT开始的内存单元中。

解题思路:

对这30个学生的成绩进行依次的判断,用AL、BH、BL、DH、DL和SI分别记录100分、90~99分、80~89分、70~79分、60~69分及60分以下各分数段的人数,最后将30个成绩累加得到成绩综合,然后再除以30得到平均分,存放在内存单元中。

测试数据:      100,80,99,84,77,63,30,90,81,40,67,89,83,68,77,56,63,91,23,79,81,87,91,100,56,59,77,79,99,82

目标结果如下:

100:2个

90~99:5个

80~89:8个

70~79:5个

60~69:4个

60以下:6个

平均分取整为:75

5.已知在TEXT开始的内存单元中存放着一组英文文本,文本长度存放在CNT单元中。编写程序,用内存单元中由KEY开始的一组密钥字符串对其进行加密处理,密钥长度存放在KCNT单元中。加密处理的方法是用密钥字符串中的每个字符与文本中的字符逐个进行异或,若文本长度大于密钥字符串长度,当密钥字符串中的字符用完后,再从头重复使用,直至处理完文本串的所有字符。

解题思路:

将TEXT开始的单元中存放的英文文本依次与KEY中存放的密钥字符串进行异或操作,每进行一次操作,DI、SI加一,若文本长度大于密钥字符串长度,当SI等于KCNT时,对进行重置操作,使之重新指向KEY开始位置,以实现从头重复使用KEY。

四、实验过程中遇到的问题及解决方法

遇到的问题:

在第四个题中,刚开始想的是从头到尾依次遍历5遍,依次统计出100分、90~99分、80~89分、70~79分、60~69分的人数,最后用总人数减去之前的人数和得出60分以下的人数,因此使用JMP跳转的时候超过了范围,出现了上图的错误。

解决办法:

把跳转的代码部分调整一下,移到JMP附近,使之不超出范围。

但是随之又出现问题:

LOOP之后,CX没有减一,而是直接变成了0。然后发现是逻辑上的问题,不能这样使用循环。

解决办法:

重新想了一种解题方法,既避免了跳转超出范围,又使之正常减一。

 

各题目程序源代码在这里:Leeeeo’s Assembly-Language</strong>