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 代码?
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 代码?
unsigned int function(unsigned int x)
{
unsigned int a = 0;
while (x != 0)
{
a = a ^ x;
x = x >> 1;
}
a = a & 1;
return a;
}
简单的:
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;
// ...
}
重要的是要记住它eax
是 x86 中的返回寄存器(即使此代码段不包含ret
指令)。此处,如果 的第一位eax
为 1,则该函数返回 true。
该算法对输入的所有位进行异或运算并返回结果位。
可以用一个简短的高级句子来概括:如果输入的 1 位的个数是奇数,则返回 1,如果是偶数,则返回 0(您需要考虑一下才能看到它,如果您需要更多详细信息)。