4

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

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

假设变量 X 在 edx 寄存器中,Y 在 eax 中,两者都是(32 位整数)。这里发生了什么??

我知道 'shrl $20, %edx' 将 %eax 向右移动 20 位,因此与:eax/(2^20) 相同,然后 sarl 相同,因此 'sarl 1, %eax' = eax/(2^1 )。是这样吗?如果是这样,leal 有什么作用?

4

1 回答 1

10

假设这sarl 1, %eax确实应该是sarl $1, %eax,那么整个事情等同于:

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

leal指令的意思是:eax = eax + edx。这个链接可能对你有用,还有这个

于 2013-03-29T01:30:25.153 回答