16

ランタイムデバッガを使用しています。

EAX: 0000 0023 EDX: 5555 5556

imul edx

EAX: aaaa aac2 EDX: 0000 000b

私は完全に混乱しており、この乗算がどのように機能しているのかわかりません。ここで何が起こっているのですか?ここで の同様の質問でimul ebx ; result in EDX:EAX、EDX:EAX 表記を理解していないことに気付きました:/

4

1 に答える 1

38

の 1 オペランド形式にimul32 ビット引数が渡される場合、事実上、ソース オペランドとソース オペランドのEAX * src両方EAXが 32 ビット レジスタまたはメモリであることを意味します。

2 つの 32 ビット値の積は、必ずしも 32 ビットに収まるとは限りません。完全な乗算結果は、最大 64 ビットになる場合があります。答えの上位 32 ビットがEDXレジスタに書き込まれ、下位 32 ビットがレジスタに書き込まEAXれます。これはEDX:EAX表記で表されます。

の場合imul edx、 が得られEDX:EAX = EAX * EDXます。明示的なソース オペランドが暗黙のオペランドの 1 つであっても問題ありませEAXEDX:EAX


結果の下位 32 ビットのみが必要な場合は、2 オペランド形式のimul;を使用します。より高速に実行され、暗黙のオペランドがありません (したがって、最も便利なレジスタを使用できます)。

imul ecx, esiまたはecx *= esiに触れずに、期待どおりに動作します。結果の幅が入力と同じであるCのようなものです。EAXEDXunsigned x=...; x *= y;

imul即時形式もあります: imul ecx, ebx, 1234does ecx = ebx * 1234. imul ecx, 1234多くのアセンブラは、 の省略形として受け入れimul ecx, ecx, 1234ます。


これらの 32x32 => 32 ビット形式はimul、符号付きまたは符号なしで正しく機能します。1 オペランドの結果とmul、下位半分の出力ではなく、imul上位半分 ( ) のみが異なります。EDXEAX

については、インテルのインストラクション リファレンス マニュアルのエントリを参照してimulください。

于 2010-09-29T04:41:35.790 に答える