Существует множество различных вариаций кода imul инструкция.2 бит.
Вариант, на который вы наткнулись, - 16-битное умножение. Он умножает регистр AX на все, что вы передаете в качестве аргумента для imul, и сохраняет результат в DX: AX.
Один 32-битный вариант работает как 16-битное умножение, но записывает регистр в EDX: EAX. Чтобы использовать этот вариант, все, что вам нужно сделать, это использовать 32-битный аргумент.
например:
; a 16 bit multiplication:
mov ax, [factor1]
mov bx, [factor2]
imul bx ; 32-bit result in DX:AX
; or imul word [factor2]
; a 32 bit multiplication:
mov eax, [factor1]
mov ebx, [factor2]
imul ebx ; 64-bit result in EDX:EAX
На 386 или более поздней версии вы также можете написать imul
в форме двух операндов. Это делает его более гибким и простым в работе. В этом варианте вы можете свободно выбирать любые 2 регистра в качестве источника и места назначения, и ЦП не будет тратить время на запись результата с половиной. И не разрушит EDX.
mov ecx, [factor1]
imul ecx, [factor2] ; result in ecx, no other registers affected
imul ecx, ecx ; and square the result
Или для подписанных 16-битных входов, соответствующих вашему imul
. (используйте movzx для входных данных без знака)
movsx ecx, word [factor1]
movsx eax, word [factor2] ; sign-extend inputs to 32-bit
imul eax, ecx ; 32-bit multiply, result in EAX
imul eax, eax ; and square the result
Этот вариант imul был введен с 386 и доступен в 16- и 32-битном размере операнда. (И 64-битный размер операнда в 64-битном режиме).
В 32-битном коде вы всегда можете предположить, что доступно 386 инструкций, таких как imul reg, reg/mem
, но вы можете использовать его в 16-битном коде, если вам не нужны старые процессоры.
286 ввел 3-операндную немедленную форму.
imul cx, bx, 123 ; requires 286
imul ecx, ebx, 123 ; requires 386