Умножение двоичных чисел без знака

Для умножения двоичных чисел без знака предназначена команда

MULсомножитель1

Второй операндсомножитель2 задан неявно. Его местоположение фиксировано и зависит от размера сомножителей. Так как в общем случае результат умножения больше, чем любой из сомножителей, то его размер и местоположение должны быть определены тоже однозначно. Варианты размеров сомножителей и размещения второго операнда и результата приведены в таблице.

 

Таблица 8. – Расположение операндов и результата при умножении

 

Сомножитель1 Сомножитель2 Результат
Байт al 16 бит в ax: al-младшая часть результата; ah-старшая часть результата
Слово ax 32 бит в паре dx:ax: ax-младшая часть, dx-старшая часть
Двойное слово eax 64 бит в паре edx:eax: eax-младшая часть, edx-старшая часть

 

Из таблицы видно, что произведение состоит из двух частей и в зависимости от размера операндов размещается в двух местах: на месте сомножитель2 (младшая часть) и в дополнительных регистрах ah, dx, edx(старшая часть). Для того, чтобы определить, что результат достаточно мал и уместился в одном регистре, или что он превысил размерность регистра, и старшая часть результата оказалась в другом регистре, используются флаги переноса cf и переполнения of.

Если старшая часть результата нулевая, то после операции умножения флаги cf и of равны 0. Если же эти флаги ненулевые, то это означает, что результат состоит из двух частей, и это обстоятельство следует учитывать при дальнейшей работе. Например умножение чисел 25 и 45:

.data

rez_l db 45

rez_h db 0

.code

xor ax, ax

mov al, 25 ;в al один из сомножителей

mul res_1 ;результат в al (младшая часть) и в ah (старшая часть)

jnc m1 ;если нет переполнения, то на m1

mov rez_h,ah ;старшая часть результата в rez_h

m1:

mov rez_1,al

Для определения размера результата командой условного переходаjncанализируется состояние флага cf, и если оно не равно 1, то результат остается в рамках регистра al.Если же cf=1, то выполняется команда в строке 16, которая формирует в поле rez_h старшее слово результата.