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 递减两次——一次是显式的,一次是在loop指令中。因此,在每次循环迭代中,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 回答