循环程序设计是编程中不可或缺的一部分,它允许程序重复执行一段代码,直到满足特定条件为止。在实验二中,我们有两个具体任务,它们都是基于循环结构的。
我们需要编写一个程序来计算序列 S=1+2*3+3*4+4*5+……+N*(N+1),直到 N*(N+1)项大于 200 为止。程序的流程如下:
1. 初始化计数器 DX 为 1(DX = 0001H),乘数 BL 为 2(BL = 02H)。
2. 进入循环 A1:
a. 将 BL 值加载到 AL 寄存器(AL = BL)。
b. 增加 BL 的值(BL++)。
c. 乘以 AL 和 BL,结果存储在 AX 寄存器(AX = AL * BL)。
d. 将 AX 加到 DX(DX = DX + AX)。
e. 检查 AX 是否小于或等于 200(CMP AX, 00C8H,00C8H 是 200 的十六进制表示)。
f. 如果 AX 小于 200,跳转回 A1 继续循环;否则退出循环。
3. 结束程序,调用退出函数 INT 21H。
在 Debug 软件中跟踪这个程序,当执行到第二次循环结束时,相关寄存器内容可能如下:
- DX: 第一次循环结束后,DX = 1 + 2*3 = 7。
- AX: 第二次循环结束,AX = 3*4 = 12。
- BL: 此时 BL = 3。
- BH: 由于只使用了低八位,BH 保持不变,为 0。
接下来,第二个任务是统计数据区中负数的个数。数据区的起始地址为 3000H,第一个字节存储总数,第二个字节开始存储数据,最后一个字节存储结果。程序流程如下:
1. 将数据段地址加载到 DS(DS = DATAMOV AX, DATAMOV DS, AX)。
2. 初始化计数器 CL 为总数,CH 为 0,DI 为数据区起始地址 + 1。
3. 进入循环 A1:
a. 从 DI 地址读取数据到 AL。
b. 使用 TEST 指令检查 AL 的符号位(80H),如果为 1,则表示负数(JE A2 表示跳过增加计数器)。
c. 如果是负数,增加计数器 BL。
d. 无论是否是负数,都递增 DI。
e. 当 CL 为 0 时跳出循环(LOOP A1)。
4. 将计数器 BL 写回到数据区最后一个字节。
5. 结束程序,调用退出函数 INT 21H。
在 Debug 中跟踪此程序,每一步执行后相关寄存器内容可能会变化如下:
- AX: 存放数据段地址。
- DS: 数据段地址。
- DI: 在每次循环后递增,指向当前处理的数据。
- CL: 计数器,每次循环减1,直到为0跳出循环。
- CH: 保持为0,用于配合CL进行计数。
- BL: 存储负数的个数,每次遇到负数就加1。
- AL: 读取的数据,用于测试符号位。
通过这两个实验,我们可以深入理解循环结构,包括如何设置循环条件,如何在循环中进行计算和判断,以及如何使用 Debug 工具进行程序调试。这些技能对于任何程序员来说都是非常基础且重要的。
评论0
最新资源