2013-09-24 35 views
0

我使用emu8086,www.emu8086.com - 并有下面的代码:ASM汇编 - CX回路循环永远

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,总和环shuld停止总和的结果存入w2变量。

由于某些原因,这不是在程序中发生的循环永远。

什么是我的代码?有人能帮帮我吗?

回答

3

8086 LOOP指令递减CX,然后循环如果CX不为零。在你的代码中:

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

你先递减CX,然后执行LOOP,再次递减它。如果你从一个奇数值开始(例如5),当LOOP执行时,CX将为零,这将使其减少到零,循环将继续。

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 
+0

谢谢你们俩!你的贡献同样有价值。不幸的是,我只能接受一个答案...... – geraldCelente