コメントの記載通り、上半分が異なります。上半分を気にしない場合は、mul
またはimul
のいずれかの形式を使用できます(1つのオペランド形式では上半分が生成されますが、このシナリオでは無視されます)。
mul
でもimul
も、符号なし*符号なしと符号付き*符号を掛けただけなので、上半分は気にしませんが、かなり簡単に修正できます。
符号付きバイトのビット重みが-128,64,32,16,4,4,2,1であり、符号なしバイトのビット重みが+であるとします。128,64,32,16したがって、符号付きの形式のx
の符号なしの値を表すことができます(これは混乱しますが、できる限りです)。x + 256 x_7
(x_7
のビット7はx
)です。最も簡単な方法は、それを分割することです:x + 2 * 128 * x_7
。ここで起こっていることは-128体重を補うことです。最初にビット7の値を128倍にしてからそれを取り除いてから、もう一度やり直して+128体重まで上げてください。もちろんこれは1ステップで行うことができます。とにかく
、いくつかの署名数y
で、それをワークアウトがxy
がimul
と256 x_7 y
の(ダブル幅)結果が「x
の符号が設定されている場合は、上半分にy
を追加する」という意味である256 x_7 y + xy
を与えることを掛けますので、可能な実装は
; al has some unsigned value
mov dl, al
sar dl, 7
and dl, [signedByte]
imul BYTE [signedByte]
add ah, dl
が自然使用すると、1つのオペランド、他をゼロ拡張し、16ビット乗算(任意、上半分が関連しないので、この方法を使用する符号拡張可能性(試験せず)されています)。
異なる値で試してみてください。 – JoelFan
いいえ、結果は同じではありません。おそらく、結果の下半分をチェックしただけで、それは同じです。署名されていない 'mul'は' ax'の結果として '502'を生成するはずです。 – Jester
@Jesterあなたが正しいですが、 'ax'は' mul'を使うと '0x01F6'(' 502')、 'imul'を使うときは' 0xFFF6'( '-10')です。 –