MOV EAX,0xB504F333
MOV ECX,0xB504F333
IMUL ECX
Должно действительно производить 0x15F61998
в EDX
и 0x9EA1DC29
в EAX
.Это потому, что IMUL
обрабатывает свои операнды как подписанные.
Другими словами, поскольку 0xB504F333
представляет отрицательное значение в коде дополнения 2 (поскольку установлен его старший значащий бит), инструкция фактически умножает 0xB504F333-0x100000000=-1257966797
вместо 0xB504F333=3037000499
само по себе.
И поэтому правильный результат будет 0x15F619989EA1DC29=1582480462354439209
вместо 0x7FFFFFFF9EA1DC29=9223372030926249001
.
Поскольку 64-битное знаковое произведение в EDX:EAX
не является знакомрасширенное значение EAX
, означающее, что подписанный продукт не умещается в 32 бита, IMUL
устанавливает флаги переноса и переполнения на 1. Все это объясняется в руководствах по процессорам Intel и AMD.
Если вы используете MUL ECX
вместо IMUL ECX
, вы получите 0x7FFFFFFF9EA1DC29=9223372030926249001
в EDX:EAX
, и флаги переполнения и переноса будут установлены снова, поскольку неподписанный продукт по-прежнему не помещается в 32 бита.