ランタイムデバッガを使用しています。
EAX: 0000 0023 EDX: 5555 5556
imul edx
EAX: aaaa aac2 EDX: 0000 000b
私は完全に混乱しており、この乗算がどのように機能しているのかわかりません。ここで何が起こっているのですか?ここで の同様の質問でimul ebx ; result in EDX:EAX
、EDX:EAX 表記を理解していないことに気付きました:/
ランタイムデバッガを使用しています。
EAX: 0000 0023 EDX: 5555 5556
imul edx
EAX: aaaa aac2 EDX: 0000 000b
私は完全に混乱しており、この乗算がどのように機能しているのかわかりません。ここで何が起こっているのですか?ここで の同様の質問でimul ebx ; result in EDX:EAX
、EDX:EAX 表記を理解していないことに気付きました:/
の 1 オペランド形式にimul
32 ビット引数が渡される場合、事実上、ソース オペランドとソース オペランドのEAX * src
両方EAX
が 32 ビット レジスタまたはメモリであることを意味します。
2 つの 32 ビット値の積は、必ずしも 32 ビットに収まるとは限りません。完全な乗算結果は、最大 64 ビットになる場合があります。答えの上位 32 ビットがEDX
レジスタに書き込まれ、下位 32 ビットがレジスタに書き込まEAX
れます。これはEDX:EAX
表記で表されます。
の場合imul edx
、 が得られEDX:EAX = EAX * EDX
ます。明示的なソース オペランドが暗黙のオペランドの 1 つであっても問題ありませEAX
んEDX:EAX
。
結果の下位 32 ビットのみが必要な場合は、2 オペランド形式のimul
;を使用します。より高速に実行され、暗黙のオペランドがありません (したがって、最も便利なレジスタを使用できます)。
imul ecx, esi
またはecx *= esi
に触れずに、期待どおりに動作します。結果の幅が入力と同じであるCのようなものです。EAX
EDX
unsigned x=...;
x *= y;
imul
即時形式もあります: imul ecx, ebx, 1234
does ecx = ebx * 1234
. imul ecx, 1234
多くのアセンブラは、 の省略形として受け入れimul ecx, ecx, 1234
ます。
これらの 32x32 => 32 ビット形式はimul
、符号付きまたは符号なしで正しく機能します。1 オペランドの結果とmul
、下位半分の出力ではなく、imul
上位半分 ( ) のみが異なります。EDX
EAX