-1

x86 アセンブリの while ループと if ステートメントをどのように区別しますか? 私のプログラムがこの x86 アセンブリを取得しているとします。

  jmp    .L2               # jump to test at end
  .L4:
        movl   -4(%ebp), %eax    # eax = A
        cmpl   -12(%ebp), %eax   # compare A to C
        jge    .L3               # skip next statement if A >= C
        addl   $1, -4(%ebp)      # A++
  .L3:
        subl   $1, -8(%ebp)      # B--
  .L2:
        cmpl   $0, -8(%ebp)      # compare B to 0
        jns    .L4               # restart code if B >= 0

  x が -8(%ebp) にあるとします。.L2 の一番下にあるのはなぜこれが while ループなのですか?

      なぜですか: while(x >= 0){jump to .L4}

     そしてそうではありません: if(x >= 0){ jump to .L4}??

4

1 に答える 1

1

それはコードのジャンプバックだからです。つまり、ジャンプ アップ (お気に入りのメンタル モデルを選んでください) です。

つまり、条件が偽になるまで、実行はその条件付きジャンプに何度も到達します。whileそれがループの定義です。現在、アセンブリには組み込みのループの概念が含まれていません (接頭辞を除きますrepが、そこには行きません)。はい、これは条件付きジャンプです。形式的には本文のあるifステートメントgotoです。ただし、ループのフロー制御パターンを実装しています。

if一方、通常のステートメントは通常、条件付きジャンプ フォワード (ダウン) として実装されます。

于 2013-03-29T02:32:20.623 に答える