Assembly 无法将第k位切换为1

Assembly 无法将第k位切换为1,assembly,x86-64,att,Assembly,X86 64,Att,//main.c #包括 无符号整数sqrt2(无符号整数); 空干管(){ 无符号整数i; 对于(i=0;i

//main.c
#包括
无符号整数sqrt2(无符号整数);
空干管(){
无符号整数i;
对于(i=0;i<30;i++){
printf(“%u的整数平方根是%u.\n”,i,sqrt2(i));
}
返回;
}
结果:

The integer square root of 4 is 0.
The integer square root of 5 is 0.
The integer square root of 6 is 0.
The integer square root of 7 is 0.
The integer square root of 8 is 0.
The integer square root of 9 is 0.

我试图将此算法转换为汇编,但我认为位切换部分不起作用
xorl%eax,%edx应该将第k位设置为1,但它不起作用。

您没有将第k位设置为1,而是将第k+1位设置为1。将
movq$0x10000,%rdx
更改为
movq$0x8000,%rdx

如果我正确读取OP的代码,EAX始终保持为零,在归零后从未用作目标。我认为他们把AT&T
op src、dst
与英特尔的语法混为一谈,只针对一些指令,而不是所有指令。顺便说一句,
btc%reg,%reg
翻转位
k
,因此您可以使用计数器而不是移位。但是shift和xor可能更快。我写了整个汇编代码。只给出伪代码。只是代码没有运行。在更改为movq$0x8000,%rdx之后,我得到了4的整数平方根是49152。对于everything@PeterCordes谢谢,原来“xor%eax,%edx”不正确,应该是“xor%edx,%eax”。现在是working@JoshuaLeung:如果使用调试器单步执行代码,当EDX为非零时,看到EAX没有改变,这应该是操作数向后移动的一个重要线索。
The integer square root of 4 is 0.
The integer square root of 5 is 0.
The integer square root of 6 is 0.
The integer square root of 7 is 0.
The integer square root of 8 is 0.
The integer square root of 9 is 0.