0

この方法で最後に条件付きでこのループを実行したい

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 の正しい使い方を誤解していると思います

4

2 に答える 2

2

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

ところで、x86 の命令であるLOOPため、ラベル名の選択としては適切ではありません。LOOP実際、次のようにコードを置き換えることができます。

dec cx
jnz label

loop label  ; decrements CX and jumps if not zero
于 2013-04-08T07:15:46.407 に答える
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:
于 2013-04-13T15:46:45.047 に答える