3

さて、ここで簡単な質問

私はいくつかのアセンブリを研究していて、いくつかのアセンブリルーチンをVB.NETに変換し直しています

さて、私が問題を抱えている特定のコード行があります。アセンブリでは、次のことを想定しています。

EBX = F0D04080

次に、次の行が実行されます

SHR EBX, 4

それは私に次のことを与えます:

EBX = 0F0D0408

さて、VB.NETでは、私は次のことをします

variable = variable >> 4

これは私に同じことを与えるべきです...しかし、それは値0F0D0408の代わりにSLIGHTビットが異なります私はFF0D0408を取得します

では、ここで何が起こっているのでしょうか。

4

2 に答える 2

4

>>演算子のドキュメントから:

算術右シフトでは、右端のビット位置を超えてシフトされたビットは破棄され、左端(符号)ビットは左側の空いているビット位置に伝搬されます。これは、パターンの値が負の場合、空いた位置が1に設定されることを意味します。それ以外の場合は、ゼロに設定されます。

符号付きデータ型を使用している場合F0B04080は、負の符号(1先頭のビット)があり、左側の空いている位置にコピーされます。

ちなみに、これはVB.NETに固有のものではありません。符号なしシフトであるx86アセンブリ命令とは対照的に、「算術シフト」であるIL命令variable >> 4に変換され、符号が保持されます。x86アセンブラで算術シフトを行うには、を使用できます。shrSHRSAR

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 に答える