- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •1.1. Додавання двійкових чисел без знака
- •1.2. Додавання двійкових чисел зі знаком
- •1.3. Віднімання двійкових чисел без знака
- •1.4. Віднімання двійкових чисел зі знаком
- •1.5. Віднімання і додавання операндів великої розмірності
- •1.6. Множення чисел без знака
- •1.7. Множення чисел зі знаком
- •1.8. Ділення чисел без знака
- •1.9. Ділення чисел зі знаком
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 ;кінець програми |