Множення
Операція множення для беззнакових даних виконується командою 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