Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._11.doc
Скачиваний:
3
Добавлен:
05.05.2019
Размер:
172.03 Кб
Скачать

Системне програмування, доц. І.І. Мітасов, 2010р. Лекція 11, 9сторінок

Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера

ЛЕКЦІЯ 11. Логічні команди

Питання лекції:

  • Засоби логічного перетворення даних;

  • логічні дані;

  • логічні команди;

  • команди зсуву .

1. Засоби логічного перетворення даних

Поряд із засобами арифметичних обчислень, система команд мікропроцесора має також засоби логічного перетворення даних. Під логічними розуміються такі перетворення даних, в основі яких лежать правила формальної логіки. Формальна логіка працює на рівні тверджень істинно і хибно. Для мікропроцесора це, як правило, означає 1 і 0 відповідно. Для комп'ютера мова нулів та одиниць є рідною, але мінімальною одиницею даних, з якою працюють машинні команди, є байт. Однак, на системному рівні часто необхідно мати можливість працювати на гранично низькому рівні - на рівні біт.

Рис. 11.1 - Класифікація засобів логічної обробки даних

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

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

2. Логічні дані (нагадування з ПТЦА)

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

Обчислення висловлювань являє собою сукупність правил, що використовуються для визначення істинності або хибності деякої комбінації висловлювань. Обчислення висловлювань дуже гармонійно поєднується з принципами роботи комп'ютера і основними методами його програмування. Всі апаратні компоненти комп'ютера побудовані на логічних мікросхемах. Система представлення інформації в комп'ютері на самому нижньому рівні заснована на понятті біта. Біт, маючи всього два стани: 0 (хибність) та 1 (істинність), природним чином вписується в числення висловлювань.

Згідно з ПТЦА, над висловлюваннями (над бітами) можуть виконуватися такі логічні операції:

• заперечення (логічне НЕ);

• логічне додавання (АБО);

• логічне множення (І);

• логічне виключаюче додавання (сума за модулем два).

• заперечення (логічне НЕ) - логічна операція над одним операндом, результатом якої є величина, зворотна значенням вихідного операнда.

Таблиця 11.1 - Таблиця істинності для логічного заперечення

Значення операнда

0

1

Результат операції

1

0

• логічне додавання (логічне АБО) - логічна операція над двома операндами, результатом якої є "істина" (1), якщо один або обидва операнди мають значення "істина" (1), і "хибність" (0) - якщо обидва операнди мають значення "хибність" (0).

Таблиця 11.2 - Таблиця істинності для логічного АБО

Значення операнда 1

0

0

1

1

Значення операнда 2

0

1

0

1

Результат операції

0

1

1

1

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

Таблиця 11.3 - Таблиця істинності для логічного І

Значення операнда 1

0

0

1

1

Значення операнда 2

0

1

0

1

Результат операції

0

0

0

1

• логічне виключаюче додавання (логічне виключаюче АБО) - логічна операція над двома операндами, результатом якої є "істина" (1), якщо тільки один з двох операндів має значення "істина" (1), і хибність (0), якщо обидва операнда мають значення "хибність" (0) або "істина" (1).

Таблиця 11.4 - Таблиця істинності для логічного виключаючого АБО

Значення операнда 1

0

0

1

1

Значення операнда 2

0

1

0

1

Результат операції

0

1

1

0

Система команд мікропроцесора містить п'ять команд, що підтримують дані операції. Ці команди виконують логічні операції над бітами операндів. Розмірність операндів, природно, повинна бути однаковою. Наприклад, якщо розмірність операндів дорівнює слову (16 біт), то логічна операція виконується спочатку над нульовими битами операндів і її результат записується на місце біта 0 результату. Далі команда послідовно повторює ці дії над усіма бітами з першого до п'ятнадцятого.

. 3. Логічні команди

У системі команд мікропроцесора є наступний набір команд, що підтримують роботу з логічними даними:

and операнд_1,операнд_2 - операція логічного множення. Команда виконує порозрядну логічну операцію І (кон'юнкцію) над бітами операндів операнд_1 і операнд_2. Результат записується на місце операнд_1.

or операнд_1,операнд_2 — операція логічного додавання. Команда виконує порозрядну логічну операцію АБО (диз'юнкцію) над бітами операндів операнд_1 і операнд_2. Результат записується на місце операнд_1.

xor операнд_1,операнд_2 — операція логічного виключаючого додавання. Команда виконує порозрядну логічну операцію виключаючого АБО над бітами операндів операнд_1 і операнд_2. Результат записується на місце операнд_1.

test операнд_1,операнд_2 — операція "перевірити" (способом логічного множення). Команда виконує порозрядну логічну операцію І над бітами операндів операнд_1 і операнд_2. Стан операндів залишається тим самим, змінюються тільки прапори zf, sf, і pf, що дає можливість аналізувати стан окремих бітів операнда без зміни їх стану.

not операнд — операція логічного заперечення. Команда виконує порозрядне інвертування (заміну значення на протилежне) кожного біта операнда. Результат записується на місце операнда.

Для представлення ролі логічних команд у системі команд мікропроцесора дуже важливо зрозуміти області їхнього застосування і типові прийоми їх використання при програмуванні.

За допомогою логічних команд можливе виділення окремих бітів в операнд з метою їх встановлення, скидання, інвертування або просто перевірки на певне значення.

Для організації такої роботи з бітами операнд_2 зазвичай грає роль маски. За допомогою встановлених в 1 бітів цієї маски і визначаються потрібні для конкретної операції біти операнд_1. Покажемо, які логічні команди можуть застосовуватися для цієї мети:

  • or eax,10b ; встановити 1-й біт у регістрі eax

    Для установки певних розрядів (бітів) в 1 застосовується команда

or операнд_1,операнд_2.

У цій команді операнд_2, що виконує роль маски, повинен містити одиничні біти на місці тих розрядів, які мають бути встановлені в 1 в операнд _1.

  • and eax,fffffffdh ; скинути в 0 1-й біт у регістрі eax

    Для скидання певних розрядів (бітів) в 0 застосовується команда

and операнд_1, операнд_2.

У цій команді операнд_2, що виконує роль маски, повинен містити нульові біти на місці тих розрядів, які мають бути встановлені в 0 в операнд_1.

  • Команда xor операнд_1, операнд_2 застосовується:

xor eax,10b ; інвертувати 1-й біт у регістрі eax

jz mes ; перехід, якщо 1-й біт в al був поодиноким

– для з'ясування того, які біти в операнд_1 і операнд_2 розрізняються;

– для інвертування стану заданих бітів в операнд_1.

Біти маски, що нас цікавлять (операнд_2), при виконанні команди xor мають бути одиничними, останні — нульовими.

  • Для перевірки стану заданих біт застосовується команда test операнд_1,операнд_2 (перевірити операнд_1).

Перевіряємі біти операнд_1 в масці (операнд_2) повинні мати одиничне значення. Алгоритм роботи команди test подібний до алгоритму команди and, але він не змінює значення операнд_1. Результатом команди є установка значення прапора нуля zf:

- Якщо zf = 1, то в результаті логічного множення вийшов нульовий результат, тобто жоден одиничний біт маски не співпав з відповідним одиничним бітом операнд_1;

- Якщо zf = 0, то в результаті логічного множення вийшов ненульовий результат, тобто хоча б один одиничний біт маски збігся з відповідним одиничним бітом операнд_1.

test eax, 00000010h

jz m1 ; перехід, якщо 4-й біт дорівнює 1

Як видно з прикладу, для реакції на результат команди test доцільно використовувати команду переходу jnz мітка (Jump if Not Zero) - перехід, якщо прапор нуля zf ненульовий, або команду зі зворотною дією - jz мітка (Jump if Zero) - перехід, якщо прапор нуля zf = 0.

Наступні дві команди дозволяють здійснити пошук першого встановленого в 1 біта операнду. Пошук можна зробити як з початку, так і від кінця операнда:

mov al,02h

bsf bx,al ;bx=1

jz m1 ;перехід, якщо al=00h

...

bsf операнд_1,операнд_2 (Bit Scaning Forward) - сканування бітів вперед. Команда переглядає (сканує) біти операнд_2 від молодшого до старшого (від біта 0 до старшого біта) в пошуках першого біта, встановленого в 1. Якщо таке виявляється, в операнд_1 заноситься номер цього біта у вигляді цілочисельного значення. Якщо всі біти операнд_2 рівні 0, то прапор нуля zf встановлюється в 1, інакше прапор zf скидається в 0.

Лістинг 1 Сканування бітів

;prg_9_1.asm

masm

model small

stack 256

.data ;сегмент даних

.code ;сегмент кода

main: ;точка входа в програму

mov ax,@data

mov ds,ax

;...

.486 ; це обов'язково

xor ax,ax

mov al,02h

bsf bx,ax ;bx=1

jz m1 ; перехід, якщо al = 00h

bsr bx,ax

m1:

;...

mov ax,4c00h ; стандартний вихід

int 21h

end main

bsr операнд_1,операнд_2 (Bit Scaning Reset) - сканування бітів у зворотному порядку.

Команда переглядає (сканує) біти операнд_2 від старшого до молодшого (від старшого біта до бита 0) в пошуках першого бита, встановленого в 1. Якщо таке виявляється, в операнд_1 заноситься номер цього біта у вигляді цілочисельного значення. При цьому важливо, що позиція першого одиничного біта ліворуч все одно відраховується щодо біта 0. Якщо всі біти операнд_2 рівні 0, то прапор нуля zf встановлюється в 1, інакше прапор zf скидається в 0.

Лістинг 1 демонструє приклад застосування команд bsr і bsf. Введіть код і досліджуйте роботу програми в відладчик (зокрема, зверніть увагу на те, як змінюється вміст регістра bx після команд bsf і bsr).

Останні моделі мікропроцесорів Intel отримали ще кілька логічних команд, які дозволяють здійснити доступ до одного конкретного биту операнда. Операнд може знаходитися як в пам'яті, так і в регістрі загального призначення. Положення біта задається зміщенням біта щодо молодшого біту операнда. Значення зміщення може задаватися як у вигляді безпосереднього значення, так і міститися у регістрі загального призначення. В якості значення зміщення можна використовувати результати роботи команд bsr і bsf. Всі команди присвоюють значення вибраного біта прапору cf.

bt операнд, зміщення_біта (Bit Test) - перевірка біта.

Команда переносить значення біта в прапор cf.

bt ax,5 ; перевірити значення біта 5

jnc m1 ; перехід, якщо біт = 0

bts операнд, зміщення_біта (Bit Test and Set) - перевірка і установка біта.

Команда переносить значення біта в прапор cf і потім встановлює перевіряємий біт в 1.

mov ax,10

bts pole,ax ;перевірити та встановити 10-й біт в pole

jс m1 ;перехід, якщо перевіряємий біт дорівнював 1

btr операнд, зміщення_біта (Bit Test and Reset) - перевірка і скидання біта.

Команда переносить значення біта в прапор cf і потім скидає цей біт у 0.

btc операнд, зміщення_біта (Bit Test and Convert) - перевірка та інвертування біта.

Команда переносить значення біта в прапор cf і потім інвертує значення цього біта.

4. Команди зсуву

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

коп операнд, лічильник_зсувів

Кількість зсуваних розрядів - лічильник_зсувів - розташовується, як бачите, на місці другого операнда і може задаватися двома способами:

• статично, що припускає завдання фіксованого значення за допомогою безпосереднього операнда;

• динамічно, що означає занесення значення лічильника зсувів в регістр cl перед виконанням команди зсуву.

Виходячи з розмірності регістра cl, зрозуміло, що значення лічильника зсувів може лежати в діапазоні від 0 до 255. Але насправді це не зовсім так. З метою оптимізації, мікропроцесор сприймає тільки значення п'яти молодших бітів лічильника, тобто значення лежить в діапазоні від 0 до 31. В останніх моделях мікропроцесора, у тому числі і в мікропроцесорі Pentium, є додаткові команди, що дозволяють робити 64-розрядні зсуви. Ми їх розглянемо трохи пізніше.

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

За принципом дії команди зсуву можна розділити на два типи:

• команди лінійного зсуву;

• команди циклічного зсуву.

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