2016-12-07 14 views
1

アセンブラで "mul"オペランドを使用するロジックを理解しようとしています(Visual Studio CommunityとMASMを使用しています)。 なぜ、 "mul ebx"の後に結果がedxでもなく、eaxだけでなく変化していますか? "結果(MULの)は、レジスタAX、レジスタ対DX:AX、またはレジスタ対EDX:EAX(オペランドサイズに依存)に格納され、レジスタAH、DX、またはEDX」である。 位置はオペランドのサイズによって異なりますか?その場合は?mulを使ったedx :: eaxとレジスタのメモリ割り当て

.586 
.model flat,c 
.stack 100h 
.data 

.code 

doit proc 

     ;EAX = 0062EEF0 EBX = 7EFDE000 ECX = 0029FD00 EDX = 00000000  
    mov eax,8; 
     ;EAX = 00000008 
    mov ebx,4 
     ;EBX = 00000004 
    mov edx,23498 
     ;EDX = 00005BCA 
    mul ebx 
     ;EAX = 00000020 EDX = 00000000 ???? 4*8 =20(hexa).So, there is no 
             ;overflow;why is edx changing too? 


doit endp 

end 
+0

目的地が異なる理由は、2つの8ビットオペランドが16ビットの結果を必要とし、16ビットのレジスタAXが16ビットであり、16ビット×16ビットが結果として32ビットを必要とするため、DXの32ビット:AX、32ビットx 32ビットは結果のために64ビットを必要とし、EDXの64ビットをergoします:EAX – infixed

+4

['mul r/m8'](http://www.felixcloutier.com/x86/MUL) .html)をAH:ALに出力します。しかし、結果の上位半分を必要としない場合は、[IMUL](http://www.felixcloutier.com/x86/IMUL)の2オペランドまたは3オペランド直接形式を使用することができます。 html)。 –

+1

オーバーフローの概念がないためEDXが変更されました。これらのビットは、0のゼロを行った場合でも結果の一部です。 – infixed

答えて

3

はい、あなたが言ったように、それはオペランドの実際の値ではないオペランドサイズに依存します。あなたは常にダブルサイズの出力を得る、オーバーフローするかどうか。 mul ebxは32ビットなので、edx:eaxには64ビット出力が得られ、edxはゼロかもしれません。

Peter Cordes氏は、「IMULの2オペランドまたは3オペランド直接形式を使用することができますし、使用する必要があります」という結果の上半分は必要ないことがわかっていると指摘しています。符号集合の参照を引用するために、符号付きで騙されないでください。"2項演算子と3項演算子の形式は、被演算子が符号付きであるかどうかにかかわらず、署名されていない。

1

符号なし乗算(MUL命令)であろう常に符号拡張(それは符号なしなのでよく、ゼロ拡張)EDXにそれがr/m32 -sizedオペランドが渡された場合に、かどうかにかかわらずEDXを含むであろうゼロ以外。

これは符号付きバリアントIMULにも適用されますが、その場合はEDXには結果が負の場合はFFバイトだけが含まれることがあります。

+4

用語:EDXへの符号拡張またはゼロ拡張はありません。これは結果の上半分です。結果の大きさに応じて、下半分のゼロ拡張になる場合もあれば、そうでない場合もあります。 –

3

MULおよびIMUL命令は、常に入力の2倍の出力を生成します。そう:

    • 8ビット入力(AL内の1つ)は、
    • 16ビット入力(AX内の1つ)(AX DXに)32ビット出力を与える(AXに)16ビット出力を与えます(EDX:EAXの場合)

    関連する幅は、常に引数の幅(暗黙のAレジスタ)であり、最小幅ではありません。いずれかの値を保持します。 32ビットの0を掛けてEDX:EAXをすべて0に(ゆっくりと)設定します。

  • +0

    16ビット入力(AXに1つ)で、32ビット出力はEAXの代わりにDX:AXになります。 –

    +0

    おっと!もちろん。 16ビットMULはEAXに先立ち、EAXが導入された後、MULを変更するには遅すぎました。ありがとう! –