TASM Assembly 8086 DOS中的循环和条件

时间:2013-04-08 07:08:59

标签: loops assembly x86 x86-16 conditional

我希望以这种方式在末尾运行带有条件的循环

mov cx, 10
mov di, 0

loop:

...

inc di
dec cx

cmp di, 5
jne loop

...     

jnz loop

但似乎除非我在

之前减少cx,否则它将无效
jnz loop

这阻止了我每次di != 5递减cx。 我想我误解了正确使用cx

2 个答案:

答案 0 :(得分:2)

如果zero flag清楚,

JNZ会跳转。有许多x86指令会修改除DEC之外的零标志。

听起来你想要这样的东西:

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

答案 1 :(得分: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: