2013-09-24 50 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