Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Збільшення та зменшення





Іноді у програмі на Асемблері буває потрібно виконати складання, яке складається просто у додатку до операнду значення 1. Така операція зветься збільшенням (інкрементацією). Аналогічно, зі змісту регістрів та змінних у пам’яті іноді потрібно відняти значення 1. Така операція зветься зменшенням (декрементацією). Для таких операцій, як зміна змісту лічильника чи просування регістрів-вказівників по пам’яті чи операнди складання та віднімання можна виконувати за допомогою збільшення чи зменшення. Для виконання таких часто необхідних дій у наборі інструкцій процесорів 8086 передбачені дві інструкції – INC (збільшити) та DEC (зменшити). Інструкція INC додає до регістру чи змінної у пам’яті 1, а інструкція DEC віднімає з регістрів чи змінної 1.

 

Наприклад, наступна програма заповнює 10-байтовий масив TempArray числами 0, 1, 2, 3, 4, 5, 6, 7, 8, 9:

 

TempArray DB 10 DUP (?)

FillCount DW?

 

mov al,0; перше значення,

; записується у TempArray

mov bx,OFFSET TempArray; BX вказує на TempArray

mov [FillCount],10; число елементів якими потрібно

; заповнити масив

FillTempArrayLoop:

mov [bx],al; установити поточний елемент

; TempArray

inc bx; посилка на наступний елемент

; масиву TempArray

inc al; наступне значення, яке

; записується

dec [FillCount]; зменшити лічильник числа

; елементів, які заповнюються

jnz FillTempArray; обробити наступний елемент,

; якщо ми ще не заповнили всі елементи.

Чому переважно використовувати інструкцію:

 

inc bx

 

а не інструкцію:

 

add bx,1

 

вони ж роблять одне й теж? Це так, але в той же час, як інструкція ADD займає 3 байта, інструкція INC займає тільки 1 байт та виконується швидше. Фактично, більш економно виконати дві операції INC, ніж додати до регістра розміром у слово значення 2 (збільшення чи зменшення регістрів та змінних у пам’яті розміром у байт займає 2 байта, що також коротше, ніж складання та віднімання).

Коротше кажучи, інструкції INC та DEC – це найбільш ефективні інструкції, за допомогою яких можна збільшувати та зменшувати значення змінних у пам’яті та регістрів. Їх слід використовувати там, де це можливо.

Множення та ділення

Процесор 8086 може виконувати окремі типи операцій множення та ділення, Це одна з сильних сторін процесору 8086, тому що в багатьох мікропроцесорах взагалі відсутня безпосередня підтримка операції множення та ділення, а ці операції досить складно виконати програмним шляхом.

Інструкція MUL перемножує 8- чи 16- бітові беззнакові співмножники, створюючи 16- чи 32-бітовий добуток. Давайте спочатку роздивимось множення 8-бітових співмножників.

При 8-бітному (8-розрядному) множенні один з операндів повинен зберігатися у регістрі AL, а інший може являти собою будь-який 8-бітовий загальний регістр чи змінну пам’яті відповідного розміру. Інструкція MUL завжди зберігає 16-бітовий добуток у регістрі AX. Наприклад, в фрагменту програми:

 

mov al,25

mov dh,40

mul dh

 

AL множиться на DH, а результат (1000) розміщується у регістрі AX. Зауважимо, що в інструкції MUL потрібно указувати тільки один операнд, другий співмножник завжди зберігається у регістрі AL (чи в регістрі AX у випадку перемноження 16-бітових множників).

Інструкція перемноження 16-бітових співмножників працює аналогічно. Один зі співмножників повинен зберігатися у регістрі AX, а другий може знаходитися у 16-розрядному загальному регістрі чи у змінній пам’яті. 32-бітовий добуток інструкція MUL розміщує в цьому випадку в регістрі DX:AX, при цьому молодші (менш значущі) 16 бітів додатку записуються у регістр AX, а старші (більш значущі) 16 біт – у регістр DX. Наприклад, інструкції:

 

mov ax,1000

mul ax

 

завантажують у регістр AX 1000, а потім підносять його у квадрат, розміщуючи результат (значення 1000000) у регістри DX:AX.

На відміну від складання та віднімання, у операції множення не враховується, чи являються співмножники операндами зі знаком чи без знака, тому є друга інструкція множення IMUL для множення 8-ми та 16-бітових співмножників зі знаком. Якщо не приймати до уваги, що перемножуються значення зі знаком, інструкція IMUL працює аналогічно інструкції MUL. Наприклад, при виконанні інструкцій:

 

mov al,-2

mov ah,10

imul ah

у регістрі АХ буде записано значення –20. Процесор 8086 дозволяє нам з певними обмеженнями розділити 32-бітове значення на 16-бітове, чи 16-бітове значення на 8-ми бітове. Давайте спочатку розглянемо ділення 16-бітового значення на 8-ми бітове.

При беззнаковому діленні 16-бітового значення на 8-ми бітове ділене повинно бути записано у регістр AX. 8-ми бітовий дільник може зберігатися у любому 8-бітовому загальному регістрі чи змінній у пам’яті відповідного розміру. Інструкція DIV завжди записує 8-бітову частину у регістр AL, а 8-бітовий залишок – в AH. Наприклад, в результаті виконання інструкцій:

 

mov ax,51

mov dl,10

div dl

 

результат 5 (51/10) буде записаний у регістр AL, а залишок 1 (залишок від ділення 51/10) – у регістр AH.

 

Зауважимо, що частка являє собою 8-бітове значення. Це означає, що результат ділення 16-бітового операнда на 8-бітовий операнд повинен перевищити 255. Якщо частка занадто велика, то генерується переривання 0 (переривання по діленню на 0).

Інструкціїї:

 

mov ax,0fffh

mov bl,1

div bl

 

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

 

При діленні 32-бітового операнда на 16-бітовий операнд ділимо повинно записуватися у регістрах DX:AX. 16-бітовий дільник може знаходитися у будь-якому з 16-бітових регістрів загального призначення чи у змінній пам’яті відповідного розміру. Наприклад, у результаті виконання інструкцій:

mov ax,2

mov dx,1; загрузити у DX:AX 10002h

mov bx,10h

div bx

 

вчасне 1000h (результат ділення 100002h на 10h) буде записано у регістрі AX, а 2 (залишок від ділення) у регістрі DX.

Як при множенні, при діленні має значення, використовуються операнди зі знаком чи без знака. Для ділення беззнакових операндів використовується операція DIV, а для ділення операндів зі знаком –IDIV. Наприклад, операції:

 

TestDivisor DW 100

 

mov ax,-667

cwd; встановити DX:AX у значення –667

idiv [TestDivisor]

 

зберігають значення –6 у регістрі AX і значення –67 у регістрі DX.

Логічні операції

Турбо Асемблер підтримує повний набір інструкцій для виконання логічних операцій, включно інструкцій для виконання логічних операцій, включно інструкції AND (і), OR (чи), XOR (виключне чи) та NOT (ні). Ці інструкції можуть виявитися дуже корисними при роботі з окремими бітами слова чи байта, а також для виконування операцій булевої алгебри.

Результати виконання логічних операцій показані у таблиці. Логічна інструкція виконує порозрядні операції над бітами вихідних операндів. Наприклад, інструкція:

 

and ax,dx

 

виконує логічну операцію AND з бітом 0 регістра AX ті бітом 0 регістра DX, потім ту ж саму операцію з бітами 1, 2 і т.п. до біта 15.

 

Виконання логічних інструкцій процесора 8086 AND, OR та XOR наведено в табл. 3.1

 

Таблиця 3.1 – Виконання логічних інструкцій процесора 8086 AND, OR та XOR

Вихідний біт А Вихідний біт В A AND B A OR B A XOR B
         
         
         
         

 

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

 

mov dx,3dah

in al,dx

and al,1

 

виділяють біт 0 байта стану кольорового графічного адаптеру (CGA). Ці інструкції залишають регістр AL встановлений у значення 1, якщо відеопам’ять адаптера CGA можна змінити, не викликаючи перешкод на екрані (“сніг”), та встановлює його у нульове значення у противному разі.

Інструкція OR теж комбінує два операнди у відповідності з правилами, які приведені у таблиці, встановлює кожний біт операнда-приймача у значення 1, якщо будь-який з відповідних бітів операнда-джерела дорівнює 1. Інструкція OR дозволяє вам примусово встановити окремі біти у значення 1. Наприклад, інструкції:

mov ax,40h

mov ds,ax

mov bx,10h

or WORD PTR [bx],0030h

 

встановлює біти 5 та 4 слова флагів апаратури базової системи вводу-виводу BIOS у значення 1. При цьому BIOS буде підтримувати монохромний дисплейний адаптер.

Інструкція XOR також комбінує два операнди у відповідності з правилами, які приведені у таблиці, встановлюючи кожний біт операнда-приймача у значення 1, тільки у тому випадку якщо один з відповідних бітів операнда-джерела дорівнює 0, та у значення 1 у протилежному випадку. Інструкція XOR дозволяє нам “перемикати” значення окремих бітів у байті. Наприклад, інструкції:

 

mov al,01010101b

xor al,11110000b

 

встановлюють регістр AL у значення 10100100b чи A5h. Коли для регістра AL виконується операція XOR зі значенням 11110000b (0F0h), біти зі значенням 0 залишають відповідні біти AL незмінними.

До речі інструкція XOR дає зручний спосіб обнуління змісту регістру. Наприклад, наступна інструкція встановлює зміст регістра AX у значення 0:

 

xor ax,ax

 

Нарешті, інструкція NOT просто змінює значення кожного біту операнда на протилежне (як якщо б над початковим операндом була виконана операція XOR зі значенням 0FFh). Наприклад:

 

mov bl,10110001b

not bl; переключити BL у 01001110b

xor bl,0ffh; переключити BL зворотно у значення

; 10110001b

Date: 2016-05-14; view: 335; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию