logo
Pract / Prakt4

Множення

Операція множення для беззнакових даних виконується командою MUL, а для знакових - IMUL (Integer MULtiplication - множення цілих чисел). У єдиному операнді команд MUL і IMUL вказується множник. Відповідальність за контроль над форматом чисел, що обробляються і за вибір відповідної команди множення лежить на самому програмісті. Існують дві основні операції множення:

"Байт на байт".

Множене перебуває в регістрі AL, а множник у байті пам'яті або в однобайтовом регістрі. Після множення добуток перебуває в регістрі AX. Операція ігнорує і витирає будь-які дані, які були в регістрі AH.

AX=AL*регістр8/пам’ять8

"Слово на слово".

Множене перебуває в регістрі AX, а множник - у слові пам'яті або у двобайтному регістрі. Після множення добуток знаходиться в подвійному слові, для якого потрібно два регістри: старша (ліва) частина добутку - в регістрі DX, а молодша (права) частина - в регістрі AX. Операція ігнорує й стирає будь-які дані, які перебували в регістрі DX.

DX:AX=AX* регістр16/пам’ять16

Розглянемо наступну команду:

MUL MULTR

Якщо поле MULTR визначене як байт (DB), то операція припускає множення вмісту AL на значення байта з поля MULTR. Якщо поле MULTR визначене як слово (DW), то операція припускає множення вмісту AX на значення слова з поля MULTR. Якщо множник перебуває в регістрі, то довжина регістра визначає тип операції, як це показано нижче:

MUL CL ; Байт-множник: множене в AL, добуток в AX.

MUL BX ; Слово-множник: множене в AX, добуток DX:AX.

Команда IMUL призначена для множення чисел зі знаком. Формат її використання аналогічний MUL.

Якщо множник і множене мають однаковий знак, то IMUL та MUL генерують однаковий результат, а якщо множники мають різні знаки, то команда MUL виробляє доданій результат, а команда IMUL – від’ємний.

Для підвищення ефективності операції множення, при множенні на степінь числа 2 більш доцільним є зсув вліво на необхідну кількість бітів. Зсув більше ніж на один розряд потребує параметру у регістрі CL. Наприклад:

Множення на 2 SHL al,1

Множення на 8: MOV CL,3

SHL AX,CL

Множення багатобайтних чисел

Наведемо процедуру множення двох подвійних слів.

При цьому слід: 1) забезпечити сусідство слів; 2) виконувати обробку від молодшого до старшого слова; 3) забезпечити достатній розмір для результату, тобто чотири слова.

dosseg

.model small

.stack 100h

.data

X DW 5678h,1234h ;елементи даних

Y DW 0deffh,9abch

Z DW 0,0,0,0

.code

mov ax,@data

mov ds,ax

CALL F10XMUL

mov ah,4Ch

int 21h

F10XMUL PROC

MOV AX,X

MUL Y

MOV Z,AX

MOV Z+2,DX

MOV AX,X+2

MUL Y

ADD Z+2,AX

ADC Z+4,DX

ADC Z+6,00

MOV AX,X

MUL Y+2

ADD Z+2,AX

ADC Z+4,DX

ADC Z+6,0

MOV AX,X+2

MUL Y+2

ADD Z+4,AX

ADC Z+6,DX

RET

F10XMUL ENDP

end