Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум КТіООР.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
4.21 Mб
Скачать

Imul – цілочисельне множення

Командою IMUL виконується знакове множення вмісту акумулятора на операнд. Якщо операнд є байтом, то він множиться на вміст регістру AL і результат (16 біт) записується в регістр (AX). Якщо операнд є словом, він множиться на вміст регістра АХ і результат (32 біт) записується в пару регістрів DX,АХ, причому, старші 16 біт записуються в регістр DX. Операнд може бути записаний в регістр загального призначення або в комірку пам'яті і інтерпретується як число із знаком.

Приклад. Нехай регістр AL містить число ЗОН, регістр CL — число 02Н і виконується команда IMUL CL. Результат множення (60Н = 30Н*2Н) записується в регістр АХ. Оскільки вміст регістру АН є розширенням знакового біта регістра AL, i прапор CF і OF будуть мати 0.

Нехай регістр АХ містить число 0240Н, регістр ВХ — число F202H і виконується команда IMUL BX. Результат (FFE08480H=240H*F202H) записується в регістри DX і АХ. Оскільки новий вміст регістра DX (FFE0H) не співпадає з розширенням знакового біта регістра АХ (8480Н), прапори CF і OF будуть встановлені в 1.

Після виконання команди змінюються значення прапорів: OF; SF; ZF; AF; PF, CF.

DIV-ділення

Командою DIV виконується беззнаковий ділення вмісту регістра-акумулятора на заданий операнд. При однобайтовому діленні вміст регістра АХ розглядається як беззнакове 16-розрядне ділиме. При двобайтовому діленні вміст пари регістрів DX.AX розглядається як беззнакове 32-розрядне ділиме, де регістр DX містить старші 16 розрядів. Операнд може бути заданий в регістрі загального призначення або елементі пам'яті, при цьому операнд розглядається як беззнаковий 8- або 16-бітовий дільник відповідно при однобайтовому і двобайтовому поділі.

При однобайтовому діленні частка записується в регістр AL, а залишок — в регістр АН. При двобайтовому діленні регістри АХ і DX використовуються для зберігання 16-розрядних приватного і залишку відповідно, що розглядаються як беззнакові числа. Після виконання командии DIV значення розрядів регістра прапорів процесора не визначені. Якщо значення частки перевищує розрядність акумулятора (десяткове число 255 при однобайтовому діленні і 65535 при двобайтовому), або робиться спроба ділення на нуль, тоді автоматично генерується переривання типу 0. Якщо відбулося переповнювання, то частка і залишок не визначені. В елементах пам'яті з абсолютними адресами 00000Н і 00003Н міститься подвійне слово, що визначає командний сегмент і переміщувану адресу процедури обробки переривання нульового типу.

Приклад. Нехай регістр АХ містить число 0047Н, регістр CL — число 12Н і виконується команда DIV CL. Частка від ділення (03Н = 47Н/12Н) записується в регістр AL, а залишок 11Н — в регістр АН.

Розглянемо випадок, коли регістри DX і АХ містять відповідно коди 0012Н і F043H, представляючі 32-розрядне шіснадцяткове число 0012F043H, регістр ВР містить число 4320Н і виконується команда DIV ВР. Частка від ділення (0048Н = 12F043H/4320H) записується в регістр AL, а залишок (0F43H) —в регістр DX.

Після виконання команди змінюються значення прапорів: OF; SF; ZF; AF; PF,CF.