2010-07-11 12 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),因为没有符号位要移位。