Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_1-3.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
998 Кб
Скачать
☆

1.3. Арифметичні операції над двійковими числами

Додавання та віднімання байт або слів, що містять двійкові дані, здійснюється за допомогою команд ADD та SUB відповідно [1,4,7-9].

Формат команд додавання та віднімання у мові програмування асемблер цілком співпадає з форматом команди MOV:

{позначка} [код команди] [операнд-приймач], [операнд-джерело]

Зрозуміло, що результат операції буде завантажений до операнда-приймача. Таким чином, наприклад, при складанні двох чисел (виконанні команди ADD), перше з чисел, які складаються, буде втрачене, а замість нього у відповідний регістр або комірку пам’яті завантажується отриманий результат.

Віднімання у двійковій арифметиці реалізується через додавання від’ємних чисел. Від’ємне число містить одиничний біт у старшому розряді та формуються за допомогою двійкового доповнення. Таким чином, для представлення від’ємного числа необхідно інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Наприклад:

Число 65

01000001

Інверсія бітів

10111110

Додати 1

10111111

Число -65

Зміна знака від’ємного числа проводиться таким самим чином: треба інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Для нашого приклада:

Число –65

10111111

Інверсія бітів

01000000

Додати 1

01000001

Число 65

Сума двох рівних за модулем, але різних за знаком чисел, при такому формуванні кодів від’ємних чисел завжди буде дорівнювати 0 (перевірте це для чисел 65 та -65 та спробуйте математично довести цю тотожність).

Таким чином, процесор записує від’ємні числа як великі додатні, і правила мови асемблера не дають можливостей їх відрізнити. Програміст повинен сам чітко слідкувати за зміною чисел у регістрах і фіксувати їх знак, якщо у цьому є необхідність.

Існують п’ять можливих ситуацій використання команд ADD та SUB, що пов’язані з представленням та розташуванням даних, які представлені у таблиці 12.

Таблиця 12. Команди додавання та віднімання мови АСЕМБЛЕР

Операція

Приклади

Додавання/віднімання регістр-регістр.

ADD AX,BX

SUB CL,DL

Додавання/віднімання регістр-пам’ять.

A1 DW 50H

A2 DB 10H

……………..........................

ADD AX,A1

SUB CL,A2

Додавання/віднімання пам’ять-регістр.

A1 DW 50H

A2 DB 10H

……………..........................

ADD A1,AX

SUB A2,CL

Додавання/віднімання регістр-безпосереднє значення.

ADD A1,10H

SUB A2,8

Додавання/віднімання пам’ять-безпосереднє значення.

A1 DW 50H

A2 DB 10H

……………..........................

ADD A1,5

SUB A2,12H

Додавання/віднімання регістр-безпосереднє значення.

ADD A1,10H

SUB A2,8

Додавання/віднімання пам’ять-безпосереднє значення.

A1 DW 50H

A2 DB 10H

……………….......................

ADD A1,5

SUB A2,12H

Прямої операції «Пам’ять-Пам’ять» мікропроцесори типу Intel 80x86 не підтримують. Тому такі дії потрібно здійснювати через три елементарних операції процесора:

1. Занесення даних з комірки пам’яті №1 до регістру.

2. Виконання операції додавання або віднімання між регістром та коміркою пам’яті №2.

3. Занесення даних з регістру до комірки пам’яті №2.

Наприклад:

A1 DW 50H

A2 DW 10H

................................................

MOV AX,A1

ADD AX,A2

MOV A2,AX

Множення та ділення чисельних даних в мові асемблер здійснюється за допомогою команд MUL та DIV для беззнакових чисел та за допомогою команд IMUL та IDIV для знакових чисел. Контроль над форматом чисел, що обробляються, не може здійснюватись процесором автоматично, тому вибирати для використання ту чи іншу команду повинен сам програміст.

В асемблері мікропроцесора Intel 8086 існують два формати команди множення - множення байта на байт та множення слова на слово. При множенні байта на байт один з множників знаходиться у регістрі AL, а другий - в байті пам’яті або в однобайтовому регістрі. Результат виконання операції множення буде розміщений в регістрі AX.

Наприклад, фрагмент програми, що знаходить куб числа 5, можна записати таким чином:

A1 DB 5H

.........................

MOV AL,A1

MUL A1

MUL A1

При множенні слова на слово один з множників знаходиться у регістрі AX, а другий - в двох байтах пам’яті або в одному з регістрів процесора. Результатом множення в цьому випадку буде подвійне слово. Його молодші розряди будуть розташовані в регістрі AX, а старші - в регістрі DX. Треба мати на увазі, що ця команда ігнорує (затирає) будь-які дані, що містяться в регістрі DX. Наприклад, фрагмент програми, яка підносить число 100H до кубу можна записати так:

A1 DW 100H

......................

MOV AX,A1

MUL A1

MUL A1

Таким чином, формат команд множення у мові програмування асемблер такий:

{позначка} [код команди] [операнд]

Операнд команди множення визначає розташування першого множника та його формат (байт або слово). Другий множник, відповідно до логіки роботи команди, мусить бути розташований в акумуляторі.

Завдання для перевірки №6: За якими ознаками процесор визначає, що в першому випадку треба множити байти, а в другому - слова?

Команда множення IMUL працює цілком аналогічним чином, з урахуванням знаку числа. Наприклад:

A1 DB 10110111B

...........................................................

MOV AL,5

MUL A1

...........................................................

MOV AL,5

IMUL A1

Оскільки останній біт числа A1 дорівнює одиниці, то в першому випадку воно буде розглядатися як велике додатне, а в другому - як від’ємне число.

Завдання для перевірки №7: Підрахуйте без використання калькулятору, який результат буде отриманий в першому та другому випадках.

Команда ділення в асеблері також має два формати: ділення слова на байт та ділення подвійного слова на слово. При діленні слова на байт ділене міститься в регістрі AX, а дільник - у байті пам’яті або в однобайтовому регістрі. При діленні слова на байт результат ділення буде розміщений таким чином: частка - у регістрі AH, а остача - у регістрі AL. При діленні подвійного слова на слово ділене знаходиться в у парі регістрів DX:AX, а дільник - а дільник - в регістрі або в слові пам’яті. Після операції ділення остача завантажується в регістр DX, а частка в регістр AX. Команда DIV використовується для беззнакових, а IDIV - для знакових даних.

Таким чином, формат команд множення мові програмування асемблер повністю відповідає формату команди множення:

{позначка} [код команди] [операнд]

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