ランタイムデバッガーを使用しています。
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:aaaa aac2 EDX:0000 000b
私は完全に混乱していて、この乗算がどのように機能しているかを理解できません。ここで何が起こっているのですか?同様のことに気づきました ここでの質問 そのimul ebx ; result in EDX:EAX
EDX:EAXの表記はわかりませんが:/
imul
の1オペランド形式に32ビット引数が渡されると(EDX
の場合のように)、事実上EAX * EDX
を意味します。ここで、EAX
とEDX
は両方とも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, 1234
はecx = ebx * 1234
を実行します。多くのアセンブラは、imul ecx, 1234
をimul ecx, ecx, 1234
の省略形として受け入れます。
これらの32x32 => 32ビット形式のimul
は、符号付きまたは符号なしで正しく機能します。 1オペランドのmul
とimul
の結果は、下半分のEDX
出力ではなく、上半分(EAX
内)でのみ異なります。
imul
のIntelの取扱説明書エントリ を参照してください。