2017-08-03 13 views
2

mulimulの両方を使用して、符号なし数値に符号なし数値を乗算することができます。例えば符号付きの数値に符号なしの数値を掛けるときに "mul"または "imul"を使用する必要がありますか?

global _start 

section .data 
    byteVariable DB -5 

section .text 
_start: 

mov al, 2 
imul BYTE [byteVariable] 

あなたはmulimulを置き換えることができ、その結果はまだ(-10)と同じになります。

mulされ、imulまったく同じ符号なし数に署名数を掛けるとき、またはそれらの間の違いはありますか?

+0

異なる値で試してみてください。 – JoelFan

+2

いいえ、結果は同じではありません。おそらく、結果の下半分をチェックしただけで、それは同じです。署名されていない 'mul'は' ax'の結果として '502'を生成するはずです。 – Jester

+0

@Jesterあなたが正しいですが、 'ax'は' mul'を使うと '0x01F6'(' 502')、 'imul'を使うときは' 0xFFF6'( '-10')です。 –

答えて

2

コメントの記載通り、上半分が異なります。上半分を気にしない場合は、mulまたはimulのいずれかの形式を使用できます(1つのオペランド形式では上半分が生成されますが、このシナリオでは無視されます)。

mulでもimulも、符号なし*符号なしと符号付き*符号を掛けただけなので、上半分は気にしませんが、かなり簡単に修正できます。

符号付きバイトのビット重みが-128,64,32,16,4,4,2,1であり、符号なしバイトのビット重みが+であるとします。128,64,32,16したがって、符号付きの形式のxの符号なしの値を表すことができます(これは混乱しますが、できる限りです)。x + 256 x_7x_7のビット7はx)です。最も簡単な方法は、それを分割することです:x + 2 * 128 * x_7。ここで起こっていることは-128体重を補うことです。最初にビット7の値を128倍にしてからそれを取り除いてから、もう一度やり直して+128体重まで上げてください。もちろんこれは1ステップで行うことができます。とにかく

、いくつかの署名数yで、それをワークアウトがxyimul256 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ビット乗算(任意、上半分が関連しないので、この方法を使用する符号拡張可能性(試験せず)されています)。

関連する問題