→ Пошук по сайту       Увійти / Зареєструватися
Знання Асемблер Архітектура

Регістри процесора

Як вже наголошувалося вище, в сучасних мікропроцесорах типу, наприклад, Pentium, можна виділити частину (ми назвали її МП 86), призначену для використання в реальному режимі і практично відповідну процесору 8086. Нижче, використовуючи термін "процесор", ми матимемо на увазі іменний МП 86.

Процесор містить дванадцять 16-розрядних регістрів, що програмно-адресуються, які прийнято об'єднувати в три групи: регістри даних, регістри-покажчики і сегментні регістри. Регістри даних і регістри-покажчики часто об'єднують під загальною назвою "Регістри загального призначення". Крім того, до складу процесора входять покажчик команд і регістр прапорів (рис. 1.6).

У групу регістрів даних включаються чотири регістри АХ, ВХ, СХ і DX. Програміст може використовувати їх на свій розсуд для тимчасового зберігання будь-яких об'єктів (даних або адрес) і виконання над ними необхідних операцій. При цьому регістри допускають незалежне звернення до старших (АН, ВН, СН і DH) і молодших (AL, BL, CL і DL) половин. Так, команда

mov BL, АН

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

Рис. 1.6. Регістри процесора.

 У багатьох випадках регістри даних цілком еквівалентні, проте переважно користуватися регістром АХ, оскільки багато команд займають в пам'яті менше місця і виконуються швидше, якщо їх операндом є регістр АХ (або його половина AL). З іншого боку, ряд команд використовує певні регістри неявним чином. Так, всі команди циклів використовують регістр СХ як лічильник числа повторень; у командах множення і ділення регістри АХ і DX виступають як неявні операнди; операції введення-виводу можна здійснювати тільки через регістри АХ або AL і так далі

Індексні регістри SI і DI так само, як і регістри даних, можуть використовуватися довільним чином. Проте їх основне призначення - зберігати індекси, або зсуви щодо деякої бази (тобто початки масиву) при вибірці операндів з пам'яті. Адреса бази при цьому може знаходитися в базових регістрах ВХ або ВР. Спеціально передбачені команди роботи з рядками використовують регістри SI і DI як неявні покажчики в оброблюваних рядках.

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

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

Регістри SI, DI, BP і SP, на відміну від регістрів даних, не допускають побайтову адресацію.

Чотири сегментні регістри CS, DS, ES і SS є найважливішим елементом архітектури процесора, забезпечуючи, як вже наголошувалося вище, адресацію 20-розрядного адресного простору за допомогою 16-розрядних операндів. Докладніше про них буде розказано в наступному розділі.

Покажчик команд IP "стежить" за ходом виконання програми, указуючи в кожен момент відносну адресу команди, наступної за виконуваною. Регістр IP програмно недоступний (IP - це просто його скорочена назва, а не мнемонічне позначення, використовуване в мові програмування); нарощування адреси в нім виконує мікропроцесор, враховуючи при цьому довжину поточної команди. Команди переходів, переривань, виклику підпрограм і повернення з них змінюють вміст IP, здійснюючи тим самим переходи в необхідні точки програми. У наступному розділі ми ще повернемося до ролі регістра IP у виконанні програми.

Регистр прапорів (його часто називають FLAGS), еквівалентний регістру стану процесора інших обчислювальних систем, містить інформацію про поточний стан процесора (рис. 1.7). Він включає 6 прапорів стану і 3 біта управління станом процесора, які, втім, теж називаються прапорами. 

Рис. 1.7. Регістр прапорів

Прапори стану наново встановлюються процесором після виконання кожної чергової команди, і по ним можна якоюсь мірою судити про результат виконання цієї команди (наприклад, чи не рівний її результат, нулю). Прапори управління дозволяють змінювати деякі умови роботи процесора, наприклад, вирішувати або забороняти апаратні переривання. Розглянемо спочатку прапори стану.

Прапор перенесення CF (Carry Flag) відображає перенесення або позика при виконанні арифметичних операцій. Перенесенням називається ситуація, коли в результаті виконання правильною, загалом, команди утворюється число, що містить більше 16 двійкових розрядів і, отже, що не поміщається в регістр або елемент пам'яті. Хай, наприклад, в регістрі АХ міститься число 60000, а в регістрі ВХ - 40000. При виконанні команди складання

add ax,bx

у регістрі-приймачі результату, яким в даному випадку служитиме регістр АХ, має бути записане число 100000, яке, зрозуміло, там поміститися не може. В цьому випадку і встановлюється прапор CF, за станом якого можна встановити, що відбулося перенесення і, отже, вміст АХ (яке в даному випадку дорівнюватиме 100000 - 65536 = 34464) не є правильним результатом.

Необхідно підкреслити, що ситуація перенесення, як і взагалі будь-яка помилка, що виникла по ходу виконання програми, не приводить ні до яких наслідків, окрім установки відповідного прапора. Процесор, встановивши прапор, вважає свою місію за виконану і переходить до виконання наступної команди. Якщо перенесення в даному випадку дійсно є індикатором помилки, програма повинна після виконання команди складання проаналізувати стан прапора CF, і при встановленому прапорі перейти на фрагмент обробки цієї помилки. Такий аналіз виконується за допомогою команд умовного переходу, в даному випадку за допомогою команди jc (jump if carry, перехід по перенесенню):

add AX,BX
jc error ;B випадку перенесення перехід 
;на мітку 
error ;
Нормальне продовження

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

Прапор паритету PF (Parity Flag) встановлюється в 1, якщо результат операції містить парне число двійкових одиниць, і скидається в Про, якщо число двійкових одиниць непарно. Цей прапор можна використовувати, наприклад, для пошуку помилок при передачі даних і при виконанні діагностичних тестів.

Прапор допоміжного перенесення AF (Auxiliary Flag) використовується в операціях над двійково-десятковими числами. Він відображає перенесення або позику із старшої тетради (бита 4). Двійково-десятковий формат має на увазі запис в кожній половинці байта десяткової цифри у вигляді її двійкового еквівалента, що дозволяє зберігати в байті дворозрядне десяткове число в діапазоні від 0 до 99 Двійково-десяткових чисел використовуються, зокрема, для обміну даними з вимірювальними приладами. Для їх обробки в процесорі передбачений цілий ряд специфічних команд, при використанні яких доводиться аналізувати стан прапора допоміжного перенесення.

Прапор нуля ZF (Zero Flag) встановлюється в 1, якщо результат операції дорівнює 0. Наприклад, прапор ZF встановиться, якщо з 5 відняти 5 або до 10 додати -10.

Прапор знаку SF (Sign Rag) показує знак результату операції, встановлюючись в 1 при негативному результаті. Як буде показано в наступному розділі, процесор розрізняє числа без знаку, тобто істотно позитивні, і числа із знаком, які можуть бути як позитивними, так і негативними. Ознакою отріцательності числа служить встановлений старший біт цього числа (битий 15 для слів або біт 7 для байтів). Прапор SF встановлюється, якщо в результаті якої-небудь операції сформовано число зі встановленим старшим бітом, наприклад, S000h або Ffffh.

Прапор переповнювання OF (Overflow Rag) фіксує переповнювання, тобто вихід результату за межі допустимого діапазону значень для чисел із знаком. У знаковому представленні числа від 0000h до 7fffh вважаються за позитивних, а числа від S000h до Ffffh, тобто числа зі встановленим старшим бітом - негативними. Прапор OF встановлюється, якщо, наприклад, при складанні двох позитивних чисел вийшов результат, 7fffh (тому що, починаючи з S000h, йдуть вже негативні числа), що перевищує, або при відніманні з негативного числа вийшов результат, менший S000h (тому що такі числа вважаються за позитивні). Пізніше це питання буде розглянуто детальніше.

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

Прапор трасування (пастки) TF (Trace Rag), що управляє, використовується для здійснення покрокового виконання програми. Якщо Tf=1, то після виконання кожної команди процесор реалізує процедуру переривання через вектор з номером 1, розташований за фізичною адресою 04. Цей прапор активно використовується в програмах відладчиків, які повинні допускати виконання відладжуваної програми по кроках або з точками останову.

Прапор дозволу переривань IF (Interrupt Rag), що управляє, вирішує (якщо рівний 1) або забороняє (якщо рівний 0) процесору реагувати на переривання від зовнішніх пристроїв. Тим самим створюється можливість виконання особливо відповідальних фрагментів програм без яких-небудь перешкод.

Прапор напряму DF (Direction Rag), що управляє, використовується командами обробки рядків. Якщо Df=0, рядок обробляється в прямому напрямі, від менших адрес до великих; якщо Df=1, обробка рядка йде у зворотному напрямі. Приклади використання цього прапора будуть приведені при розгляді відповідних команд процесора.

Для установки і скидання прапорів, що управляють, передбачені особливі команди, наприклад sti (set interrupt, встановити переривання) або cli (clear interrupt, скинути переривання).

загрузка...
Сторінки, близькі за змістом