2010-07-11 41 views
3

好了,一個簡單的問題在這裏將某些程序集轉換爲VB.NET - SHR運算符的工作方式不同?

我學習了一些組件,以及將一些彙編程序返回到VB.NET

現在,有我有麻煩,組裝特定的代碼行,假設如下:

EBX = F0D04080 

然後下面一行被執行

SHR EBX, 4 

這使我的弗洛翼:現在

EBX = 0F0D0408 

,在VB.NET,我做以下

variable = variable >> 4 

應該給我同樣的...但它的不同,而不是價值0F0D0408我獲得稍許位, FF0D0408

那麼這裏發生了什麼?

回答

4

>> operator的文檔:

在一個算術右移,比特移位超出最右邊的比特位置被丟棄,最左邊的(符號)位傳播到在空出的位的位置剩下。這意味着如果模式具有負值,空出的位置設置爲1;否則它們被設置爲零。

如果您使用的是符號的數據類型,F0B04080有一個負號(位1在開始),它被複制到左側空出的位置。

這不是特定於VB.NET東西,順便:variable >> 4被翻譯成該IL instruction shr,這是一個「算術移位」和保留符號,而相比之下,在x86彙編指令SHR,這是一個無符號轉移。要在x86彙編器中進行算術移位,可以使用SAR

要使用在VB.NET一個無符號移位時,需要使用一個無符號的變量:

Dim variable As UInteger = &HF0D04080UI 

UI type character的在F0D04080結束告訴VB.NET,該文字是無符號整數(否則,它將被解釋爲一個負的有符號整數,並且分配會導致編譯時錯誤)。

+0

現貨 - 我誤讀了這個問題,並試圖轉移0F0D0408 :) – 2010-07-11 22:58:45

+0

好吧,但我如何解決這個問題給我在VB.NET相同的輸出,因爲它在組裝? 謝謝 – zeta 2010-07-11 23:07:59

+0

@zeta:你需要使用一個無符號變量。我已經延長了我的答案。 – Heinzi 2010-07-11 23:16:24

1

VB的>>運算符執行算術移位,它將符號位移位而不是0。

variable = (variable >> shift_amt) And Not (Integer.MinValue >> (shift_amt - 1)) 

應該給你一個等價值,即使它有點長。或者,您可以使用無符號整數(UInteger或UInt32),因爲沒有符號位要移位。