
- •Курсова робота з дисципліни: «Системне програмування» на тему: «Модель арифметико-логічного пристрою»
- •Завдання
- •1 Формати числових даних
- •2 Виконання арифметичних операцій
- •2.1 Арифметичні операції над двійковими числами
- •Imul операнд_1 [, операнд_2, операнд_3]
- •Idiv дільник
- •2.2 Арифметичні операції над двійково-десятковими неупакованими числами
- •2.3 Арифметичні операції над двійково-десятковими упакованими числами
- •3 Опис роботи програми
- •6 Результати роботи програми
- •Висновки
- •Список використаної літератури
Imul операнд_1 [, операнд_2, операнд_3]
Ця команда виконується так само, як і команда mul. Відмінною особливістю команди imul є тільки формування знака.
Якщо результат малий і уміщається в одному регістрі (тобто якщо cf = of = 0), то вміст іншого регістра (старшої частини) є розширенням знаку - всі його біти дорівнюють старшому биту (знакової розряду) молодшої частини результату.
В іншому випадку (якщо cf = of = 1) знаком результату є знаковий біт старшої частини результату, а знаковий біт молодшої частини є значущим бітом двійкового коду результату.
Ділення чисел без знаку
Для ділення чисел без знака призначена команда
div дільник
Дільник може знаходитися в пам'яті або в регістрі і мати розмір 8, 16 або 32 біт. Місцезнаходження діленого фіксоване і так само, як в команді множення, залежить від розміру операндів. Результатом команди ділення є значення частки та залишку.
Після виконання команди ділення вміст прапорів невизначено, але можливе виникнення переривання з номером 0, званого "ділення на нуль".
Ділення чисел зі знаком
Для ділення чисел зі знаком призначена команда
Idiv дільник
2.2 Арифметичні операції над двійково-десятковими неупакованими числами
Додавання неупакованих BCD-чисел
Розглянемо два випадки складання.
Приклад 2.2.1.
Результат додавання не більше 9
6 = 0000 0110
+
3 = 0000 0011
=
9 = 0000 1001
Перенесення з молодшої тетради в старшу немає. Результат правильний.
Приклад 2.2.2.
Результат додавання більше 9
06 = 0000 0110
+
07 = 0000 0111
=
13 = 0000 1101
Тобто ми отримали вже не BCD-число. Результат неправильний. Правильний результат в неупакованому BCD-форматі повинен бути таким: 0000 0001 0000 0011 в двійковому представленні (або 13 в десятковому).
Для корекції операції додавання двох однозначних неупакованих BCD-чисел в системі команд мікропроцесора існує спеціальна команда
aaa (ASCII Adjust for Addition) - корекція результату складання для представлення в символьному вигляді.
Ця команда не має операндів. Вона працює неявно тільки з регістром al і аналізує значення його молодшої тетради:
якщо це значення менше 9, то прапор cf скидається в 0 і здійснюється перехід до наступної команди;
якщо це значення більше 9, то виконуються наступні дії:
до вмісту молодшої тетради al (але не до вмісту всього регістра!) додається 6, тим самим значення десяткового результату коректується в правильну сторону;
прапор cf встановлюється в 1, тим самим фіксується перенесення в старший розряд, для того щоб його можна було врахувати в наступних діях.
Віднімання неупакованих BCD-чисел
Ситуація тут цілком аналогічна складанню. Розглянемо ті ж випадки.
Приклад 2.2.3.
Результат віднімання не більше 9
6 = 0000 0110
-
3 = 0000 0011
=
3 = 0000 0011
Як бачимо, позички зі старшої тетради немає. Результат вірний і коригування не вимагає.
Приклад 2.2.4.
Результат віднімання більше 9
6 = 0000 0110
-
7 = 0000 0111
=
-1 = 1111 1111
Віднімання проводиться за правилами двійкової арифметики. Тому результат не є BCD-числом. Правильний результат в неупакованому BCD-форматі повинен бути 9 (0000 1001 в двійковій системі числення). При цьому передбачається позику із старшого розряду, як при звичайній команді віднімання, тобто у випадку з BCD числами фактично повинно бути виконано віднімання 16 - 7. Результат віднімання потрібно коректувати. Для цього існує спеціальна команда:
aas (ASCII Adjust for Substraction) - корекція результату віднімання для представлення в символьному вигляді.
Команда aas не має операндів і працює з регістром al, аналізуючи його молодшу тетраду наступним чином:
якщо її значення менше 9, то прапор cf скидається в 0 і керування передається наступній команді;
якщо значення тетради в al більше 9, то команда aas виконує наступні дії:
з вмісту молодшої тетради регістру al (зауважте - не з вмісту всього регістра) віднімає 6;
обнуляє старшу тетраду регістра al;
встановлює прапор cf в 1, тим самим фіксуючи уявну позику із старшого розряду.
Множення неупакованих BCD-чисел
Для того щоб перемножити два однорозрядних BCD-числа, необхідно:
помістити один із співмножників в регістр al (як того вимагає команда mul);
помістити другий операнд в регістр або пам'ять, відвівши байт;
перемножити співмножники командою mul (результат, як і належить, буде в ax);
результат, звичайно, вийде в двійковому коді, тому його потрібно скорегувати.
Для корекції результату після множення застосовується спеціальна команда
aam (ASCII Adjust for Multiplication) - корекція результату множення для представлення в символьному вигляді.
Вона не має операндів і працює з регістром ax наступним чином:
ділить al на 10;
результат ділення записується так: частку в al, залишок в ah.
Ділення неупакованих BCD-чисел
Корекція результату повинна виконуватися до основної операції, що виконує безпосередньо поділ одного BCD-числа на інше BCD-число. Попередньо в регістрі ax потрібно отримати дві неупаковані BCD-цифри діленого. Це робить програміст зручним для нього способом. Далі потрібно видати команду aad:
aad (ASCII Adjust for Division) - корекція ділення для представлення в символьному вигляді.
Команда не має операндів і перетворює двозначне неупаковане BCD-число в регістрі ax в двійкове число. Це двійкове число згодом буде грати роль діленого в операції ділення. Крім перетворення, команда aad поміщає отримане двійкове число в регістр al. Ділене буде двійковим числом з діапазону 0 ... 99. Алгоритм, за яким команда aad здійснює це перетворення, полягає в наступному:
помножити старшу цифру вихідного BCD-числа в ax (вміст ah) на 10;
виконати додавання ah + al, результат якого (двійкове число) занести в al;
обнулити вміст ah.
Далі програмісту потрібно видати звичайну команду ділення div для виконання ділення вмісту ax на одну BCD-цифру, що знаходиться в байтовому регістрі або байтовой комірці пам'яті.