Предмет:
Тип роботи:
Реферат
К-сть сторінок:
11
Мова:
Українська
Регістри процесора (РЗП та індексні)
Крім того, РЗП у ряді випадків мають і особливе призначення. Так, команда організації циклів LOOP в обов'язковому порядку використовує регістр CX, а команди множення MUL/IMUL і розподілу DIV/IDIV спеціальним чином зберігають свої дані в регістрах AX і DX.
Інші чотири регістри (індексні) – SI, DI, BP і SP – мають більш конкретне призначення й можуть застосовуватися для зберігання всіляких тимчасових даних, тільки коли вони не використовуються за призначенням. Так само, як і з регістрами AX-DX, регістри SI, DI, BP і SP є молодшими половинами регістрів ESI, EDI, EBP і ESP відповідно, які з'явилися із уведенням 32- бітної архітектури в 80386.
Регістр SP (Stack Pointer) являє собою покажчик стека (містить поточне значення вершини стека), регістр BP (Base Pointer) використовується при деяких спеціальних формах адресації даних. Нарешті, регістри SI і DI застосовуються при роботі з так званими рядками – послідовностями байтів або слів. Регістр SI (Source Index) указує на поточний оброблюваний елемент вихідного рядка (рядка-джерела), а DI (Destination Index) – на елемент результуючого рядка (рядка-приймача).
Сегментні регістри
При використанні сегментованої моделі пам'яті для формування будь-якої адреси застосовуються два числа – адреса початку сегмента й зміщення шуканого байта відносно цього початку. Програма звертається до сегментів, використовуючи замість фізичної (20-розрядної) адреси початку сегмента 16-розрядне число, яке називається також «селектор сегмента». У процесорах Intel 8086 передбачено чотири 16-бітних регістри – CS, DS, ES, SS, які використовуються для зберігання селекторів. Це не означає, що програма не може одночасно працювати з більшою кількістю сегментів пам'яті, – у будь-який момент часу можна змінити значення, записані в цих регістрах.
Регістр DS (Data Segment) вказує на основний сегмент даних. Саме у цьому сегменті, як правило, зберігається основна маса тих даних, які обробляє програма (числа, символи, рядки, масиви, логічні величини).
Регістр ES (Extra Segment) вказує на додатковий сегмент даних. Його можна розглядати як розширення (продовження) основного, крім того, цей сегмент в обов'язковому порядку використовується командами обробки рядків, такими, як MOVS, CMPS, SCAS.
Регістри CS і SS відповідають за сегменти двох особливих типів – сегмент коду й сегмент стека. Сегмент коду містить програму, що виконується в даний момент, так що запис нового селектора в цей регістр приводить до того, що далі буде виконана не наступна по тексту програми команда, а команда з коду, що перебуває в іншому сегменті, але з тим же зсувом. Зміщення наступної виконуваної команди завжди зберігається в спеціальному регістрі – IP (покажчик команд, 32-бітна форма позначається як EIP), запис в який також приведе до того, що наступною буде виконана яка-небудь інша команда. Насправді всі команди передачі керування – переходу, умовного переходу, циклу і т. п. – і здійснюють цей самий запис адреси в CS і IP.
Розглянемо більш докладно процедуру формування фізичної адреси.
Як відзначалося вище, розрядність шини адреси рівна 20, однак для спрощення операцій зберігання й пересилання адресної інформації процесор маніпулює логічними адресами, які складаються із двох 16-розрядних компонентів: початкової адреси сегмента (селектор) і зміщення всередині сегмента (SEG: OFS).
Ці компоненти використовуються для обчислення 20-розрядних фізичних (абсолютних) адрес за допомогою наступного алгоритму. Вміст кожного сегментного регістру розглядається як 16 старших розрядів А19-А4 адреси відповідного сегмента. Молодші розряди А3-А0 цієї адреси завжди покладаються рівними нулю (отже, їх не потрібно зберігати в регістрах) ; вони автоматично приписуються праворуч до старших розрядів під час операції обчислення фізичних адрес. Ця операція виконується суматором адрес, розташованим у БСШ, і полягає в додаванні 20-розрядної початкової адреси сегмента (SEG) з 16-розрядним зсувом (OFS), який доповнюється чотирма старшими нулями:
Рис. 3. Обчислення фізичної адреси (суматор адрес)
З того, що молодші чотири розряди початкової адреси будь-якого сегмента повинні дорівнювати нулю, випливає, що значення початкових адрес сегментів вибираються кратними 16 (16 = 24). Найбільша ємність пам'яті, що виділяється під один сегмент (довжина сегмента), визначається максимальним значенням 16-розрядного зміщення й становить 64 Кбайт (64 Кбайт = 65536 байт = 216 байт). Сегменти можуть бути роздільними, такими, що частково перекриваються, або навіть повністю співпадаючими (відображеними на те саме місце в пам'яті, на ті самі фізичні адреси).
Стек – це спеціально організована ділянка пам'яті, що використовується для тимчасового зберігання даних, для передачі параметрів викликаним підпрограмам і для збереження адреси повернення при виклику процедур і переривань. Якщо записати в стек числа 1, 2, 3, то при зчитуванні вони будуть виходити у зворотному порядку – 3, 2, 1. Стек розташовується в сегменті пам'яті, який описується регістром SS, а поточне зміщення вершини стека записане в регістрі SP, причому при запису в стек значення цього зміщення зменшується, тобто стек росте вниз від максимально можливої адреси (рис. 4).
Рис. 4. Стек
При виклику підпрограми параметри в більшості випадків поміщають в стек, а в BP записують поточне значення SP. Тоді, якщо підпрограма використовує стек для тимчасового зберігання своїх даних, SP зміниться, але BP можна буде використовувати для того, щоб зчитувати значення параметрів прямо зі стека (їх зсуви будуть записуватися як BP + номер параметра).
Регістр прапорців
Ще один важливий регістр, що використовується при виконанні більшості команд, – регістр прапорців FLAGS. У цьому регістрі кожний біт є прапором, тобто встановлюється в 1 за певних умов або установка його в 1 змінює поведінку процесора (рис. 5).
Рис. 5. Регістр прапорців
CF – прапорець переносу. Установлюється в 1, якщо результат попередньої операції не вмістився в приймачі й відбувся перенос зі старшого біта або якщо потрібне позичання (при вирахуванні), інакше встановлюється в 0. Наприклад, після додавання слова 0Ffffh і 1, якщо регістр, у який треба помістити результат, – слово, у нього буде записано 0000h і прапорець CF = 1.
PF – прапорець парності. Установлюється в 1, якщо молодший байт результату попередньої команди містить парне число біт, рівних 1; установлюється в 0, якщо число одиничних бітів непарне. (Це не те ж саме, що подільність на два. Число ділиться на два без залишку, якщо його самий молодший біт дорівнює нулю, і не ділиться, якщо він рівний 1.)
AF – прапорець напівпереносу або допоміжного переносу. Установлюється в 1, якщо в результаті попередньої операції відбувся перенос (або позика) з третього біта в четвертий.
ZF – прапорець нуля. Установлюється в 1, якщо результат попередньої команди – нуль.
SF – прапорець знаку. Цей прапорець завжди дорівнює старшому біту результату.
TF – прапорець пастки. Цей прапорець був передбачений для роботи відладчиків, що не використовують захищений режим. Установка його в 1 приводить до того, що після виконання кожної команди програми керування тимчасово передається відладчику.
IF – прапорець переривань (у моделі не використовується). Установка цього прапорця в 1 приводить до того, що процесор перестає обробляти переривання від зовнішніх пристроїв. Звичайно його встановлюють на короткий час для виконання критичних ділянок коду.
DF – прапорець напрямку. Цей прапорець контролює поведінку команд обробки рядків – коли він скинутий в 0, рядки обробляються в бік збільшення адрес, а коли DF = 1 – навпаки.
OF – прапорець переповнення. Цей прапорець встановлюється в 1, якщо результат попередньої арифметичної операції над числами зі знаком виходить за припустимі для них межі. Наприклад, якщо при додаванні двох додатніх чисел виходить число зі старшим бітом, рівним одиниці (тобто від’ємне) і навпаки.
Прапорці IOPL (рівень привілеїв вводу-виводу) та NT (вкладене завдання) застосовуються в захищеному режимі.