2

コードが永久にインクリメントするように数値をインクリメントする必要がありますが、ゼロのままです。

これが私のコードです:

section .data
FORMAT: db '%c', 0
FORMATDBG: db '%d', 10, 0
EQUAL: db "is equal", 10, 0
repeat:
    push  ecx  ; just to print
    push  FORMATDBG ; just to print
    call  printf ; just to print
    add esp, 8 ; add the spaces
    inc ecx ; increment ecx
    cmp ecx, 0 ; compare ecx to zero
    ja repeat ; if not equal to zero loop again
4

1 に答える 1

6
repeat:
    xor ecx, ecx
    push  ecx  ; just to print
    push  FORMATDBG ; just to print
    call  printf ; just to print
    add esp, 8 ; add the spaces
    inc ecx ; increment ecx
    cmp ecx, 0 ; compare ecx to zero
    ja repeat ; if not equal to zero loop again

xor ecx, ecxゼロに設定ecxします。あなたがこれを知っているかどうかはわかりません。おそらく、各反復でそれが発生することを望まないでしょう。さらに、ループ条件は現在、おそらくあなたが望んでいたものではja repeatない場合にのみループを引き起こします(またはそれですか?)。ecx > 0

最後にもう1つ、printfおそらくゴミ箱ですecx(私はcdeclまたはを想定していますstdcall)。呼び出し規約(使用しているコンパイラ/ OSがわからない)を読み、関数呼び出しで保持されることが保証されているレジスタを確認します。

コードに関しては、おそらくこれに近いものが必要でした。

    xor ebx, ebx

repeat:
    push  ebx  ; just to print
    push  FORMATDBG ; just to print
    call  printf ; just to print
    add esp, 8 ; add the spaces
    inc ebx ; increment ecx
    cmp ebx, 0 ; compare ecx to zero
    ja repeat ; if not equal to zero loop again

ただし、これによって無限ループが発生することはありません。最大値にebx達すると、その値は0に折り返され、ループ条件(ebx>0)がfalseと評価され、ループが終了します。

于 2012-05-03T00:28:41.290 に答える