2013-03-29 229 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