8

したがって、Cに変換する必要のある次のアセンブリ言語コードがあります。コードの数行で混乱しています。

forこれはループだと理解しています。各行にコメントを追加しました。

forループはこんな感じだと思います

for (int i = 1; i > 0; i << what?) {
    //Calculate result
}

テスト条件は何ですか?そして、どうすれば変更できますか?

アセンブリコードを見ると、変数'n'は何をしますか?

これはIntelx86であるため、形式はmovl = source、destです。

  movl 8(%ebp), %esi     //Get x
  movl 12(%ebp), %ebx    //Get n
  movl $-1, %edi         //This should be result
  movl $1, %edx          //The i of the loop
.L2:
  movl %edx, %eax
  andl %esi, %eax
  xorl %eax, %edi        //result = result ^ (i & x)
  movl %ebx, %ecx        //Why do we do this? As we never use $%ebx or %ecx again
  sall %cl, %edx         //Where did %cl come from?
  testl %edx, %edx       //Tests if i != what? - condition of the for loop
  jne .L2                //Loop again
  movl %edi, %eax        //Otherwise return result.
4

1 に答える 1

15

sall %cl, %edx%edxを%clビット単位で左にシフトします。(%cl参考までに、はの下位バイトです%ecx。)後続のtestlテストでは、そのシフトが%edxをゼロにしたかどうかをテストします。

これjneは、ASMでは単なる減算であることが多い比較のコンテキストでよく使用されるため、このように呼ばれます。フラグは違いに基づいて設定されます。項目が等しい場合(x --x == 0であるため)、ZFが設定されます。jnzIntel構文でも呼ばれます。GNUがそれを許可するかどうかはわかりません。

まとめると、3つの命令はに変換されi <<= n; if (i != 0) goto L2;ます。これに加えて、ラベルはforループを作成しているようです。

for (i = 1; i != 0; i <<= n) { result ^= i & x; }

または、より正確には(ただし、同じ目標を達成するために)、do...whileループを実行します。

i = 1;
do { result ^= i & x; i <<= n; } while (i != 0);
于 2010-10-24T12:37:10.567 に答える