2013-04-08 1 views
0

Je veux exécuter cette boucle avec une condition à la fin de cette façonboucles et à l'Assemblée TASM conditionals 8086 DOS

mov cx, 10 
mov di, 0 

loop: 

... 

inc di 
dec cx 

cmp di, 5 
jne loop 

...  

jnz loop 

mais il semble que cela ne fonctionnera pas à moins que je décrémenter cx immédiatement avant

jnz loop 

cela m'empêche de décrémenter cx chaque fois que di != 5. Je pense que je mal compris l'utilisation correcte de cx

Répondre

2

JNZ saute si le zero flag est clair. Il y a beaucoup d'instructions x86 qui vont modifier le drapeau zéro en plus de DEC.

On dirait que vous voulez quelque chose comme ceci:

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 

BTW, LOOP est un mauvais choix pour un nom d'étiquette depuis LOOP est une instruction sur x86. En fait, vous pouvez remplacer le code comme ceci:

dec cx 
jnz label 

avec

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

si elles sont mises décembre cx à la fin, puis cx ne soit pas décrémenté lorsque la condition de jne est remplie, c'est mon problème – user2241226

+0

@ user2241226: Voir ma mise à jour – Michael

+0

Que diriez-vous de l'instruction 'loopnz'? – Powerslave

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: