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
它应该是具有一个参数的函数体:unsigned x。我知道这是 do-while循环但是如何将其完全转换为C代码?
答案 0 :(得分: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;
}
答案 1 :(得分: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;
// ...
}
答案 2 :(得分:1)
重要的是要记住eax
是x86中的返回寄存器(即使此代码段不包含ret
指令)。
这里,如果eax
的第一位为1,则函数返回true。
此算法xor输入的所有位并返回结果位。
它可以用一个简短的高级句子来概括:如果输入的1位数是奇数,则返回1,如果是偶数,则返回0(你需要考虑一下才能看到它,我可以解释一下)如果您需要更多细节,请更全面。)