Лекції з курсу "Проектування ассемблеров, компонувальник, макропроцесор"
Процесор цікавить нас, перш за все, як набір регістрів.
Крім осередків оперативної пам'яті для зберігання даних (правда, короткочасного) можна використовувати і регістри - комірки, розташовані в центральному процесорі і доступні з машинних програм. Доступ до регістрів здійснюється набагато швидше, ніж до комірок пам'яті, тому використання регістрів помітно зменшує час виконання програм.
Регістр - швидкодіючий пристрій, реалізоване на електронних компонентах.
Всі регістри мають розмір слова (16 розрядів), за кожним з них закріплено певне ім'я. За призначенням і способом використання регістри можна розбити на наступні групи:
- регістри загального призначення (AX, BX, CX, DX, SI, DI, BP, SP);
- сегментні регістри (CS, DS, SS, ES);
- покажчик команд (IP);
- регістр прапорів (Flags).
Наведемо розшифровку назв регістрів:
AX accumulator, акумулятор;
BX base, база;
CX counter, лічильник;
DX data, дані;
(Буква X - від слова eXtended, розширений: в процесорі 8080 були байтові регістри A, B, C і D, але потім їх розширили до розміру слова)
SI source index, індекс джерела;
DI destination index, індекс приймача;
BP base pointer, покажчик бази;
SP stack pointer, покажчик стека;
IP instruction pointer, покажчик команд;
SS stack segment, сегмент стека;
DS data segment, сегмент даних;
CS code segment, сегмент команд;
ES extra segment, додатковий сегмент.
Регістри загального призначення
Особливістю регістрів загального призначення є те, що їх можна використовувати в будь-яких арифметичних, логічних і т.п. машинних операціях. Наприклад, можна скласти число з регістра DI з числом з регістра SP (add DI, SP) або відняти від вмісту регістра BP вміст регістра CX (sub BP, CX).
У той же час кожен з цих регістрів має певну спеціалізацію: деякі команди вимагають, щоб їх операнд або операнди обов'язково знаходилися в певних регістрах. Наприклад, команда ділення вимагає, щоб перший операнд (ділене) знаходився в регістрі AX або регістрах AX і DX (в залежності від розміру операнда), а команди управління циклом використовують регістр CX як лічильник циклу.
При роботі зі стеком використовується регістр SP. У командах, які працюють зі стеком, передбачається, що регістр SP вказує на осередок стека, в якій знаходиться елемент, записаний в стек останнім.
Регістри AX, BX, CX і DX влаштовані так, що можливий незалежний доступ до їх старшої і молодшої половин. Позначають ці половини буквами H (high - вище, старший) і L (low - нижче, молодший) і першою літерою з назви регістра: AH і AL - в AX, BH і BL - в BX і т.д.
Відзначимо, що на частині діляться тільки регістри AX, BX, CX і DX. Запис же в інші регістри і читання з них здійснюються тільки цілком.
сегментні регістри
покажчик команд
регістр прапорів
Прапор - це біт, що приймає значення 1 ( "прапор встановлений") або значення 0 ( "прапор скинутий"). У i8086 використовується 9 прапорів, зібраних в один 16-розрядний регістр, званий регістром прапорів (Flags). Деякі розряди регістру не зайняті.
Прапори поділяються на дві групи: прапори умов (вони автоматично змінюються при виконанні команд і фіксують ті чи інші властивості їх результату (наприклад, дорівнює він нулю)) і прапори станів (їх змінює програма; стан цих прапорів впливає на подальшу поведінку процесора) .
- CF (carry flag) - прапор переносу. Найбільш корисний в арифметичних операціях над числами без знака; наприклад, якщо при додаванні беззнакових чисел вийшла дуже велика сума - з одиницею переносу, якій немає місця в осередку, тоді прапор CF приймає значення 1, а якщо сума "вкладається" в розмір осередку, то значенням CF буде 0.
- OF (overflow flag) - прапор переповнення. Корисний в арифметичних операціях над числами зі знаком; наприклад, якщо при додаванні або вирахуванні знакових чисел вийшов результат, по модулю перевершує допустиму величину (сталося переповнення мантиси), тоді прапор OF отримує значення 1, а якщо переповнення мантиси не було - значення 0.
- ZF (zero flag) - прапор нуля. Встановлюється в 1, якщо результат команди виявився нульовим.
- SF (sign flag) - прапор знака. Встановлюється в 1, якщо в операції над знаковими числами вийшов негативний результат.
- PF (parity flag) - прапор парності. Дорівнює 1. якщо в 8 молодших бітах результату черговий команди міститься парна кількість двійкових одиниць.
- AF (auxiliary carry flag) - прапор додаткового перенесення. Фіксує особливості виконання операцій над двійковій-десятковими числами.