Як можна побачити з наведеного прикладу, посилання на комірку пам’яті позначається в асемблері через квадратні дужки. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Як можна побачити з наведеного прикладу, посилання на комірку пам’яті позначається в асемблері через квадратні дужки.



5. Адресація зі зміщенням. Як і посередня адресація, місить посилання на комірку пам’яті. Зміщення вказується як безпосередній операнд. Ефективно використовується разом з директивою визначення кількох констант. Наприклад:

A DB 1,2,3,4,5; Визначення масиву з кількох констант

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

MOV BX, A+2; Завантажити до регістру BX число 3

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

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

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

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

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

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

 

Число 65    
Інверсія бітів    
Додати 1   Число -65

 

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

 

Число –65    
Інверсія бітів    
Додати 1   Число 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 -для знакових даних.

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

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

1.4. Команди логічних операцій

Як відомо, логічні операції є важливим елементом в проектуванні цифрових електронних схем. Але двійкова логіка має також багато спільного із логікою програмування. Наприклад, всі арифметичні операції здійснюються на апаратному рівні як послідовність великого числа логічних операцій [1,4]. Крім того, команди логічних операцій знаходять широке використання для моделювання логіки роботи цифрових схем, для здійснення арифметичних операцій з кодами ASCII, для накладення масок (виділення окремих біт числа), а також для організування логіки програми. В мові програмування асемблер підтримується шість головних команд для виконання логічних операцій: AND, OR, XOR, NOT та TEST.

Ці команди обробляють один байт або одне слово в регістрі або в комірці пам’яті. Встановлюють прапори: CF (прапор переносу), OF (прапор переповнення), PF (прапор парності), SF (прапор знака), ZF (прапор нуля). Працюють команди логічних операцій наступним чином:

AND - якщо обидва біта, що зрівнюються, дорівнюють 1, то результат дорівнює 1, а в іншому випадку 0 (команду AND називають також логічним множенням).

OR - якщо хоча б один з бітів, що зрівнюється, дорівнює 1, то результат теж дорівнює 1, а в іншому випадку 0 (команду OR називають також логічним діленням).

XOR - якщо біти, що зрівнюються, співпадають, то результат дорівнює 0, а якщо різняться - 1.

NOT - команда має один операнд та здійснює інверсію всіх бітів числа.

TEST - працює як команда AND, але тільки змінює прапори стану, не впливаючи на результат. Може бути використана для перевірки окремих байтів числа на наявність одиниць.

Приклади виконання логічних команд наведені в табл. 13:

Таблиця 13. Приклади виконання логічних команд

Команда AND OR XOR NOT
Перше число        
Друге число       -
Результат        

Формат логічних команд такий же самий, як і арифметичних:

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

Завдання для перевірки №8: Наведіть свої приклади логічних команд. Напишіть на мові асемблера фрагмент програми, який містить логічні команди, та визначте, яким буде результат виконання цього фрагменту програми. Результат роботи покажіть викладачеві.

Команди зсуву бітів числа

В мові асемблер існує чотири команди зсуву бітів - SAR, SAL, SHR та SHL. Зсув може здійснюватись праворуч або ліворуч на 8 позицій для байта або на 16 для слова. Команда містить 2 операнди - регістр або комірку пам’яті, де міститься байт або слово, які треба обробити, та вказівник на кількість позицій зсуву. Зсув на одну позицію може бути вказаний безпосередньо, а для зсуву на дві позиції або більше треба вказати кількість позицій у регістрі CL.

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

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

На відміну від попередніх команд з двома операндами тут перший операнд є водночас і джерелом, і приймачем, тобто число, над яким проводиться зсув, змінюється безпосередньо у тій комірці пам’яті або регістрі, куди воно було завантажене. Зрозуміло, що само число при такий операції втрачається. Другим операндом команди зсуву може бути або безпосередньо число 1, або регістр CL.

Команда SHR визначає логічний зсув праворуч без урахування знака, а команда SAR -арифметичний зсув праворуч з урахуванням знака. Ризниця між цими командами полягає у тому, що для заповнення старшого байта при виконанні команди SHR використовується нуль, а в команді SAR - біт знака.

Приклади використання команд SAR та SHR наведеніу таблиці 14.

Таблиця 14. Приклади використання команд арифметичного та логічного зсуву

Приклад 1 Приклад 2
Асемблерна команда Результат її виконання Асемблерна команда Результат її виконання
MOV CL,3 MOV AX,10110111B SHR AX,1 SHR AX,CL CL=3 AX=10110111B AX=01011011B AX=00001011B MOV CL,3 MOV AX,10110111B SAR AX,1 SAR AX,CL CL=3 AX=10110111B AX=11011011B AX=11111011B

Оскільки при зсуві ліворуч молодші біти числа завжди замінюються нулями, результат виконання команд SAL та SHL завждибуде однаковим.

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

Завдання для перевірки №9: Напишіть фрагмент асемблерної програми з використанням команди SHL та проаналізуйте результат їх виконання таким же чином, як це зроблено у наведеному прикладі для команд SAR та SHR.

Завдання для перевірки №10: Покажіть, що команди зсуву можуть бути використані для множення або ділення числа на два.



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 303; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.74.227 (0.034 с.)