我正在用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
。该link和this one可能对您也很有用。