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

它应该是带有一个参数的函数体:无符号 x。我知道这是一个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

重要的是要记住它eax是 x86 中的返回寄存器(即使此代码段不包含ret指令)。此处,如果 的第一位eax为 1,则该函数返回 true。

该算法对输入的所有位进行异或运算并返回结果位。

可以用一个简短的高级句子来概括:如果输入的 1 位的个数是奇数,则返回 1,如果是偶数,则返回 0(您需要考虑一下才能看到它,如果您需要更多详细信息)。

于 2013-01-30T04:23:34.387 回答