Если вы посмотрите на таблицу формата MUL
, вы заметите, что она принимает только один параметр регистра.Однако перейдите к IMUL
, и вы увидите, что существует множество его форм, которые принимают немедленное
6B /r ib <b>IMUL r16, r/m16, imm8</b> word register ← <i>r/m16</i> ∗ sign-extended immediate byte.
6B /r ib <b>IMUL r32, r/m32, imm8</b> doubleword register ← <i>r/m32</i> ∗ sign-extended immediate byte.
REX.W + 6B /r ib <b>IMUL r64, r/m64, imm8</b> Quadword register ← <i>r/m64</i> ∗ sign-extended immediate byte.
69 /r iw <b>IMUL r16, r/m16, imm16</b> word register ← <i>r/m16</i> ∗ immediate word.
69 /r id <b>IMUL r32, r/m32, imm32</b> doubleword register ← <i>r/m32</i> ∗ immediate doubleword.
REX.W + 69 /r id <b>IMUL r64, r/m64, imm32</b> Quadword register ← <i>r/m64</i> ∗ immediate doubleword.
. Таким образом, умножив eax на 9, вы можете сделать вот так
mov eax, 7
imul eax, eax, 9 ; eax = eax*9
Присмотритесь, и вы также увидите, что эти версии не расширяются.Фактически в настоящее время imul
используется исключительно для почти всех умножений, потому что умножение без расширения равно одинаково для знаковых и беззнаковых значений , а умножение в языках высокого уровня не расширяется (т. Е. Тип вывода итипы входных операндов одинаковы), если вы не приведете операнды к более широкому типу.В результате, современные процессоры x86 часто оптимизируются для imul
, а также имеют гораздо больше форм, чем mul