Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Команда MUL может быть записана в трех различных форматах — в зависимости от операнда:
MUL r/m8 MUL r/ml6 MUL r/m32
В 8-разрядной форме операнд может быть любым 8-битным регистром или адресом памяти. Второй операнд всегда хранится в AL. Результат (произведение) будет записан в регистр АХ.
(r/m8)*AL -> АХ
В 16-разрядной форме операнд может быть любым 16-битным регистром или адресом памяти. Второй операнд всегда хранится в АХ. Результат сохраняется в паре DX:AX.
(r/ml6)*АХ -> DX:AX
В 32-разрядной форме второй операнд находится в регистре ЕАХ, а результат записывается в пару EDX.EAX.
(r/m32)*ЕАХ -> EDX:ЕАХ
Пример 1: умножить значения, сохраненные в регистрах ВН и CL, результат сохранить в регистр АХ:
mov al,bh; AL = ВН — сначала заносим в AL второй операнд
mul cl; АХ = AL*CL — умножаем его на CL
Результат будет сохранен в регистре АХ.
Пример: вычислить 4862, результат сохранить в DX:AX:
mov ax,486; АХ = 486
mul ах; АХ*АХ —> DX:AX
Пример 2: вычислить диаметр по радиусу, сохраненному в 8-битной переменной radius l, результат записать в 16-битную переменную diameterl:
mov al,2; AL = 2
mul byte [radiusl]; AX = radius * 2
mov [diameterl],ax; diameter <— AX
Почему результат 16-разрядного умножения сохранен в паре DX:AX, а не в каком-то 32-разрядном регистре? Причина — совместимость с предыдущими 16-разрядными процессорами, у которых не было 32-разрядных регистров.
Команда IMUL умножает целые числа со знаком и может использовать один, два или три операнда. Когда указан один операнд, то поведение IMUL будет таким же, как и команды MUL, просто она будет работать с числами со знаком.
Если указано два операнда, то инструкция IMUL умножит первый операнд на второй и сохранит результат в первом операнде, поэтому первый операнд всегда должен быть регистром. Второй операнд может быть регистром, непосредственным значением или адресом памяти.
imul edx,ecx; EDX = EDX*ECX
imul ebx,[sthing]; умножает 32-разрядную
; переменную "sthing" на ЕВХ,
; результат будет сохранен в ЕВХ
imul есх,6; ЕСХ = ЕСХ*6
Если указано три операнда, то команда IMUL перемножит второй и третий операнды, а результат сохранит в первый операнд. Первый операнд — только регистр, второй может быть любого типа, а третий должен быть только непосредственным значением:
imul edx,ecx,7; EDX = ECX*7
imul ebx,[sthing],9; умножаем переменную "sthing" на 9,
; результат будет сохранен EBX
imul ecx,edx,ll; ЕСХ = EDX*11
Дата публикования: 2014-11-28; Прочитано: 1276 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!