Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсова робота 11 варіант.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
852.4 Кб
Скачать

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 виконує наступні дії:

  1. з вмісту молодшої тетради регістру al (зауважте - не з вмісту всього регістра) віднімає 6;

  2. обнуляє старшу тетраду регістра al;

  3. встановлює прапор 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-цифру, що знаходиться в байтовому регістрі або байтовой комірці пам'яті.