3

好吧,这里有个简单的问题

我正在研究一些汇编,并将一些汇编例程转换回 VB.NET

现在,在汇编中,我遇到了一个特定的代码行,假设如下:

EBX = F0D04080

然后执行以下行

SHR EBX, 4

这给了我以下信息:

EBX = 0F0D0408

现在,在 VB.NET 中,我执行以下操作

variable = variable >> 4

哪个应该给我相同的......但它有一点不同,而不是值 0F0D0408 我得到 FF0D0408

那么这里发生了什么?

4

2 回答 2

4

>> 运算符的文档中:

在算术右移中,移出最右边位位置的位被丢弃,最左边(符号)位被传播到左边空出的位位置。这意味着如果模式具有负值,则空出的位置设置为 1;否则它们被设置为零。

如果您使用带符号的数据类型,F0B04080则有一个负号(1开头的位),它被复制到左侧空出的位置。

顺便说一句,这不是 VB.NET 所特有的:variable >> 4被转换为IL 指令shr,这是一个“算术移位”并保留符号,与 x86 汇编指令相反SHR,它是一个无符号移位。要在 x86 汇编器中进行算术移位,SAR可以使用。

要在 VB.NET 中使用无符号移位,您需要使用无符号变量:

Dim variable As UInteger = &HF0D04080UI

末尾的UI类型字符F0D04080告诉 VB.NET 该文字是一个无符号整数(否则,它将被解释为一个负符号整数并且赋值会导致编译时错误)。

于 2010-07-11T22:56:55.030 回答
1

VB 的>>操作符进行算术移位,它移动符号位而不是 0。

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

应该给你一个等价的值,即使它有点长。或者,您可以使用无符号整数(UInteger 或 UInt32),因为没有要移位的符号位。

于 2010-07-11T23:19:54.230 回答