1つのコード実装
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と入力して、2つの配列の最初の要素を追加した結果である最初のループAL = 05が正しいことを確認します。
配列1、2の論理アドレスは0000、追加された配列は0010であり、結果はそれぞれ05、0A、04、01、FC、0D、03、00であると推測できます。ZF = 1の場合、サイクルは終了します。
2. DebugU
コマンド
次のデバッグ操作の各ステートメントのアドレスを確認できます。
gコマンドの最初のサイクルを確認します
.g = 0000 001Cと入力して、2つの配列の最初の要素を追加した結果である最初のサイクル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の場合、サイクルは終了します。結果は現実と同じであり、結果は正しいです。