Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._9.doc
Скачиваний:
3
Добавлен:
05.05.2019
Размер:
168.96 Кб
Скачать

1.7. Множення чисел зі знаком

Використовується команда imul операнд_1[,операнд_2, операнд_ 3] .

Ця команда виконується так само, як і команда mul. Відмінною особливістю команди imul є лише формування знака.

Якщо результат малий і вміщується в одному регістрі (тобто якщо cf = of = 0), то вміст іншого регістра (старшої частини) є розширенням знака - всі його біти дорівнюють старшому биту (знакового розряду) молодшої частини результату.

В іншому випадку (якщо cf = of = 1) знаком результату є знаковий біт старшої частини результату, а знаковий біт молодшої частини є значущим бітом двійкового коду результату.

Якщо ви подивитеся опис команди imul, то побачите, що вона допускає більш широкі можливості за завданням місця розташування операндів. Це зроблено для зручності використання.

1.8. Ділення чисел без знака

Для ділення чисел без знака призначена команда div дільник.

Дільник може знаходитися в пам'яті або в регістрі і мати розмір 8, 16 або 32 біт. Місцезнаходження діленого фіксоване і так само, як в команді множення, залежить від розміру операндів. Результатом команди ділення є значення частки та залишку.

Варіанти місця розташування та розмірів операндів операції ділення показані в табл. 9.2.

Таблиця 9.2 – Розташування операндів і результату при діленні

Ділене

Дільник

Частка

Залишок

16 біт в регістрі ax

Байт регістр або комірка пам’яті

Байт в регістрі al

Байт в регістрі ah

32 біт dx — старша частина ax — молодша частина

Слово 16 біт регістр або комірка пам’яті

Слово 16 біт в регістрі ax

Слово 16 біт в регістрі dx

64 бит edx — старша частина eax — молодша част.

Подвійне слово 32 біт регістр або комірка пам’яті

Подвійне слово 32 біт в регістрі eax

Подвійне слово 32 біт в регістрі edx

Після виконання команди ділення вміст прапорів не визначено, але можливе виникнення переривання з номером 0, званого "ділення на нуль". Цей вид переривання відноситься до так званих виключень. Цей різновид переривань виникає усередині мікропроцесора через деякі аномалій під час обчислювального процесу. Переривання 0, "ділення на нуль", при виконанні команди div може виникнути по одній з наступних причин:

• дільник дорівнює нулю;

• частка не входить у відведену під нього розрядну сітку, що може трапитися в наступних випадках:

• при діленні діленого величиною в слово на дільник розміром у байт, причому значення діленого перебільшує значення дільника в більш ніж 256 разів;

• при діленні діленого величиною в подвійне слово на дільник величиною в слово, причому значення діленого перебільшує значення дільника в більш ніж 65 536 разів;

• при діленні діленого величиною в учетверене слово на дільник величиною в подвійне слово, причому значення діленого перебільшує значення дільника в більш ніж 4 294 967 296 разів.

Приміром, виконаємо ділення значення в області del на значення в області delt (лістинг 4).

Лістинг 4. Ділення чисел

<1> ;prg_9.4.asm

<2> masm

<3> model small

<4> stack 256

<5> .data

<6> del_b label byte

<7> del dw 29876

<8> delt db 45

<9> .code ;сегмент коду

<10> main: ;точка входу в програму

<11> ...

<12> xor ax,ax

<13> ;наступні дві команди можна замінити одною mov ax,del

<14> mov ah,del_b ;старший байт діленого в ah

<15> mov al,del_b+1 ;молодший байт діленого в al

<16> div delt ;в al — частка, в ah — залишок

<17> ...

<18> end main ;кінець програми

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]