2014-03-18 42 views
-1

我將x86彙編到C代碼,想不通爲什麼下面這兩條線等於C代碼。如何通過左右位移位31等於&0x7FFF的

彙編代碼:

sall $31, %eax 
sarl $31, %eax 

等效的C代碼:

int t = t & 0x7FFF; 

其次,將用於C代碼的等效表達式是:

t = t << 31; 
t = t >> 31; 
+0

我敢肯定,他們*不*相當於... –

+0

,如果你在做這取決於指令旋轉設置它可能看起來類似的東西,但有可能需要參與到作出這樣的減少更多的指令。 –

+0

不要依賴的「等效C-表達」,這樣的移位是**未定義的行爲**。 – EOF

回答

0

將Sal I/SARL組合是不等於AND 0x7FFF。由於它是算術移位(與邏輯相反),所以在向右移位時,它將填充符號位的副本。因此,如果eax在最左邊的位爲零,則它變爲零,如果它有一個,則它變爲0xffffffff。

將Sal線移位寄存器幾乎是一路向左。最右邊的(第0)位變成最左邊的(第31位,也就是符號位)。然後右移將最左邊的位移回到最右邊的位置,用其副本填充移入的位。

<</>>右組合當量,只要t被聲明爲有符號的數據類型(int被默認簽名)。移動無符號數據類型不會簽名擴展;在組裝層面,這是SHRL命令。

+2

'sarl'是一個*算術*右移,因此複製了符號位。所以這不等同於'&1'。 –

+0

我的不好。讓我編輯... –

+0

轉移入─進出符號整型的符號位的是C中的未定義行爲「'<<'/'>>'」組合體被** **不等同,它是未定義32位int 。 – EOF