一 代码实现
DATA SEGMENT
ARRAY1 DB 2,5,0,3,-4,5,0,0AH,0FH
ARRAY2 DB 3,5,4,-2,0,8,3,-0AH,20H
COUNT DB $-ARRAY2
LEN DB ?
SUM DB 20H DUP(0)
DATA ENDS
STACK1 SEGMENT PARA STACK 'STACK'
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA;把数据段传给AX
MOV DS,AX;AX进堆栈
MOV BX,-1;初始化BX为-1,是数组从第一个元素开始处理
MOV CX,0;清零CX
MOV CL,COUNT ;把数组的长度传给CL
NOZERO: INC BX;增量指令,是BX加一处理下一个数组元素
MOV AL,ARRAY1[BX];把数组1的元素传给AL
ADD AL, ARRAY2[BX];令数组2与数组1对于的元素相加
MOV SUM [BX],AL;把相加的结果传给SUN[BX]
LOOPNE NOZERO;循环执行,直到处理完数组的所有元素
JE ENDO;循环结束,调到ENDO语句
INC BL;增量指令
ENDO: MOV LEN,BL;把BL统计的相加后的数组长度传给LEN
MOV AH,4CH;返回DOS
INT 21H;停机
CODE ENDS
END START
验证第一次循环
可以看到001C是下一次循环的开始判断语句
输入g=0000 001C 验证第一次循环,AL=05,为两数组的第一个元素相加的结果,正确。
可以推测出数组1,2逻辑地址为0000,相加后的数组在0010,结果分别是05,0A,04,01,FC,0D,03,00。当ZF=1时,循环结束。
二 调试
U命令
可以看到每一语句对于的地址,用于下面的调试操作
验证第一次循环g命令
输入g=0000 001C 验证第一次循环,AL=05,为两数组的第一个元素相加的结果,正确。
R命令 第一次循环,循环未结束,此时ZF标志位NE,即ZF=0,循环继续进行
当循环结束时,ZF标志为ZR,即ZF=1,满足LOOPNE的特点,正确。
D命令
可以推测出数组1,2逻辑地址为0000,相加后的数组在0010,结果分别是05,0A,04,01,FC,0D,03,00。对应的十进制的书为5,10,4,1,-4,13,3,0。当ZF=1时,循环结束。结果与实际相同,结果是正确的。