web-dev-qa-db-ja.com

imulアセンブリ命令-1つのオペランド?

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

EAX:0000 0023 EDX:5555 5556

imul edx

EAX:aaaa aac2 EDX:0000 000b

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

13
Joshua Enfield

imulの1オペランド形式に32ビット引数が渡されると(EDXの場合のように)、事実上EAX * EDXを意味します。ここで、EAXEDXは両方とも32ビットレジスタです。

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


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

imul ecx, esiは、EAXまたはEDXに触れることなく、期待どおりにecx *= esiを実行します。これはCのようなもので、unsigned x=...;x *= y;の結果の幅は入力と同じです。

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


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

imulのIntelの取扱説明書エントリ を参照してください。

27
Chris Taylor