2013-03-29 153 views
3

我正在用gcc编译我的代码并查看程序集,这段代码究竟在做什么?shrl vs sarl .. x86汇编gnu

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)。 这是对的,如果是的话,莱亚尔做了什么?

回答

9

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

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

leal指令是指:eax = eax + edx。这link可能对您有用,以及this one