0

ATT構文。

次のアセンブリコードが何をするのかを理解しようとしています。

movl  8(%ebp), %edx
movl  $0, %eax
testl %edx, %edx
je    .L7
.L10:
xorl  %edx, %eax
shrl  %edx
jne   .L10
.L7:
andl  $1, %eax

これは、unsignedxという1つのパラメーターを持つ関数の本体であると想定されています。これがdo-whileループであることは知っていますが、どうすれば完全にCコードに変換できますか?

4

3 に答える 3

4
unsigned int function(unsigned int x)
{
  unsigned int a = 0;

  while (x != 0)
  {
    a = a ^ x;
    x = x >> 1;
  }

  a = a & 1;

  return a;
}
于 2013-01-30T04:07:44.533 に答える
1

簡単:

void or unsigned some_function(unsigned x)
{
  unsigned edx = x;
  unsigned eax = 0;
  if (edx == 0)
    goto L7;
L10:
  eax ^= edx;
  if ((edx >>= 1) != 0)
    goto L10;
L7:
  eax &= 1;
  // ...
}
于 2013-01-30T03:48:13.000 に答える
1

これがx86のリターンレジスタであることを覚えておくことが重要です(このスニペットには命令eaxが含まれていませんが)。retここで、の最初のビットが1の場合、関数はtrueを返しますeax

このアルゴリズムは、入力のすべてのビットを排他的論理和し、結果のビットを返します。

短い高レベルの文に要約できます。入力の1ビットの数が奇数の場合は1を返し、偶数の場合は0を返します(それを確認するには少し考える必要があります。詳細が必要です)。

于 2013-01-30T04:23:34.387 に答える