Asm Assembler - CX循环永远循环

时间:2013-09-24 09:42:40

标签: loops assembly infinite-loop

我正在使用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变量中。

对于某些扼杀的原因,该程序没有发生这种情况永远是循环的。

我的代码是什么问题?有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:3)

8086 LOOP指令递减CX,然后在CX非零时循环。在你的代码中:

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

首先递减CX,然后执行LOOP,再次递减。如果以奇数值(例如5)开始,当LOOP执行时,CX将为零,这将使其减小到零,并且循环将继续。

答案 1 :(得分: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