我正在用gcc编译代码并查看程序集,此代码到底在做什么?

shrl $20, %edx
leal (%edx,%eax), %eax
sarl 1, %eax


假设变量X在edx寄存器中,而Y在eax处并且都为(32位int)。这里发生了什么??

我知道'shrl $ 20,%edx'将%eax右移20位,因此与:eax /(2 ^ 20)
然后sarl相同,因此'sarl 1,%eax'= eax /(2 ^ 1)。
是的,如果这样,Leal会做什么?

最佳答案

假设sarl 1, %eax实际上应该是sarl $1, %eax,那么整个过程等同于:

x = ((unsigned int) x) >> 20;
y = (x + y) >> 1


leal指令的意思是:eax = eax + edx。该linkthis one可能对您也很有用。

07-24 09:44
查看更多