0

私はemu8086、www.emu8086.comを使用しています-次のコードがあります:

data segment

five equ 5
VET db 5 dup (1,2,3,4,5)
w2 db 0

ends

stack segment
dw   128  dup(0)
ends

code segment
start:

mov ax,data
mov ds, ax
mov es,ax



;sum
xor AX,AX
xor BX,BX
xor CX, CX


mov cl,five
mov si,0

sum:
add al,vet[si]
inc SI
dec cx
loop sum

mov w2,al
;end sum



ends

end start

問題は、CX が 0 に達すると、合計ループが停止し、合計の結果が w2 変数に保存されることです。

奇妙な理由で、これはプログラムで発生せず、永遠にループしています。

私のコードの問題は何ですか?誰かが私を助けてくれますか?

4

2 に答える 2

3

8086 LOOP 命令は CX をデクリメントし、CX がゼロでない場合はループします。ここにあなたのコードで:

sum:
add al,vet[si]
inc SI
dec cx
loop sum

最初に CX をデクリメントしてから、再度デクリメントする LOOP を実行します。奇数の値 (たとえば 5) で開始すると、LOOP の実行時に CX がゼロになり、ゼロを超えて減少し、ループが続行されます。

于 2013-09-24T09:50:20.443 に答える
1

問題は、CX を 2 回 (明示的に 1 回とloop命令で 1 回) デクリメントしていることです。したがって、各ループ反復で CX の値が開始され5 -> 3 -> 1 -> -1 -> ...、無限ループが発生します。

変化する:

sum:
    add al,vet[si]
    inc SI
    dec cx           ; decrement CX
    loop sum         ; decrement CX and branch if not zero

に:

sum:
    add al,vet[si]
    inc SI
    loop sum         ; decrement CX and branch if not zero
于 2013-09-24T09:49:15.743 に答える