Справочник по языку Ассемблера IBM PC


Умножение чисел без знака


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

mul сомножитель_1

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

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

сомножитель_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 = 0 и of = 0;

  • если же эти флаги ненулевые, то это означает, что результат вышел за пределы младшей части произведения и состоит из двух частей, что и нужно учитывать при дальнейшей работе.

Рассмотрим следующий пример программы.

   Листинг 5. Умножение <1> ;prg_8_5.asm <2> masm <3> model small <4> stack 256 <5> .data ;сегмент данных <6> rez label word <7> rez_l db 45 <8> rez_h db 0 <9> .code ;сегмент кода <10> main: ;точка входа в программу <11> ... <12> xor ax,ax <13> mov al,25 <14> mul rez_l <15> jnc m1 ;если переполнение, то на м1 <16> mov rez_h,ah ;старшую часть результата в rez_h <17> m1: <18> mov rez_l,al <19> exit: <20> mov ax,4c00h ;стандартный выход <21> int 21h <22> end main ;конец программы

<


Начало  Назад  Вперед



Книжный магазин