2013-02-16 131 views
1
// Code I'll be working with 
int shift_left2_rightn(int x, int n) 
{ 
    x <<= 2; 
    x >>= n; 
    return x; 
} 

問題1.左移= SALSHL。我的書說他們有同樣的效果。那麼爲什麼有兩次輪班?ATT裝配(算術和邏輯運算)

例如:

movl 8(%ebp), %eax //Get x 
_______     //x <<= 2 

我的書中給出的

sall $2, %eax 

shll $2, %eax 

的回答也得到了正確的答案?

問題2:

通俗地說就是SHRSAR之間的區別?我的書說一個是邏輯轉換(用零填充),另一個是算術轉換(填充符號位的副本)。

用0 /符號位填充什麼?

例如:

我怎麼知道哪一個用於下面的彙編指令?

movl 12(%ebp), %ecx //Get n 
______     //x >>=n 

回到本書有答案

sarl %cl, %eax 

我請解釋一下,如果我們使用shrl會發生什麼。

感謝您的理解幫助!

回答

4

salshl是同義詞,它們具有相同的操作碼。

由於sar並通過2個舍入向負無窮大(-Inf)數字簽名的分工,shr也由2個無符號劃分,可能是在英特爾的工程師們決定也都salshl即使他們是同義的結合。

下面是一個例子什麼shrsar做:

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement) 

shr al,1   ; 0b01000100 = 68d = 68d (2's complement) 

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement) 

sar al,1   ; 0b11000100 = 196d = -60d (2's complement) 

所以shr用零填充和sar符號位填充。

shr是用於未簽名的部門或位移一般,和sar簽署的部門。

+0

非常感謝的實例和解釋 – juice 2013-02-16 22:06:55

+2

實際上有'sal'和'shl'兩種不同的操作碼,但到目前爲止他們的行爲一直是相同的,雖然它看起來像英特爾希望棄用兩個中的一個,如果你通過自己的判斷文檔。 – 2013-02-16 23:27:35

+0

@AlexeyFrunze哪一個?在[64和IA-32架構 軟件開發人員手冊](http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-開發人員手動325462.html),我只能找到相同的編碼兩個'sal'和'shl':(有/無'REX')'DO/4','D2/4','C0/4 ib','D1/4','D3/4','C1/4 ib'。另外,如果我組裝如。 'SAL人,1'與NASM,導致'D0 E0',ndisasm拆開它作爲'SHL人,1'。 – nrz 2013-02-16 23:37:56

0

真的沒有兩個不同的操作,只有兩個名稱爲同一條指令。

如果右移,簽名(SAR)和無符號值(SHR)之間有差異,所以一個操作符號延伸,另一個不延伸。

左移時沒有區別,但它仍然有兩個名稱(SAL和SHL),僅用於右對稱的對稱。它們都映射到相同的機器碼。

+1

實際上有'sal'和'shl'兩種不同的操作碼,但到目前爲止他們的行爲一直是相同的,雖然它看起來像英特爾希望棄用兩個中的一個,如果你被他們的文檔判斷。 – 2013-02-16 23:28:27