我正在使用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变量中。
对于某些扼杀的原因,该程序没有发生这种情况永远是循环的。
我的代码是什么问题?有人可以帮帮我吗?
答案 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