2013-04-08 33 views
0

我想以這種方式循環和條件在TASM大會8086 DOS

mov cx, 10 
mov di, 0 

loop: 

... 

inc di 
dec cx 

cmp di, 5 
jne loop 

...  

jnz loop 

運行這個循環是有條件的結束,但現在看來似乎是行不通的,除非我

之前立即CX遞減
jnz loop 

這是防止我每次減少cx di != 5。 我想我誤解了cx的正確使用

回答

2

JNZ如果zero flag是明確的跳轉。除了DEC之外,還有許多x86指令會修改零標誌。

這聽起來像你想是這樣的:

cmp di, 5 
je no_dec 
dec cx  ; decrement CX when di != 5 
no_dec: 
... 
jncxz loop ; jump if CX != 0 
      ; if JNCXZ isn't supported on the target CPU you could 
      ; replace it with CMP CX,0/JNZ loop 

順便說一句,LOOP是因爲LOOP的標籤名稱一個糟糕的選擇是在x86的指令。事實上,你可以像這樣替換代碼:

dec cx 
jnz label 

loop label ; decrements CX and jumps if not zero 
+0

如果把十進制CX結尾,然後CX當JNE滿足條件沒有得到減少,這是我的問題 – user2241226 2013-04-08 07:30:30

+0

@ user2241226:查看我的更新回答 – Michael 2013-04-08 08:01:04

+0

'loopnz'指令怎麼樣? – Powerslave 2013-04-13 15:42:20

0
xor di,di 
mov cx,10 
_theLoop: 
    ; ... 
    inc di ; I wonder why are you incrementing DI manually... 
    cmp di,5 
    ja _done 
    loop _theLoop 
_done: