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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

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

Регістри характеризуються своєю розрядністю, тобто кількістю біт інформації, яка може в них розміщуватись (напр. 8-розрядний регістр, 64-розрядний регістр). Регістри найчастіше реалізуються як масиви статичної пам'яті з довільним доступом (SRAM), хоча також можуть реалізовуватись на базі бістабільних комірок (тригерів), інших схемотехнічних рішень, придатних для реалізації швидких запам'ятовуючих пристроїв.

З точки зору архітектури ЕОМ, під цим терміном розуміють лише набір тих регістрів, які доступні програмісту в рамках документованої програмної моделі процесора. Точніше такі регістри називають архітектурними. Наприклад, архітектура x86 визначає лише 8 32-розрядних регістрів загального призначення, але процесор фактично містить набагато більше реальних апаратних регістрів. Така надлишковість потрібна для реалізації деяких мікроархітектурних оптимізацій швидкодії процесора (див. докладніше Паралелізм рівня команди).

Класифікація[ред.ред. код]

За функціональним призначенням регістри процесора поділяються на такі:

  • Регістри даних — використовуються для збереження цілочисельних даних (див. нижче регістри плаваючої коми). В деяких архітектурах, відомих як акумуляторні, такий регістр лише один.
  • Адресні регістри — зберігають адреси (номери комірок) в пам'яті та використовуються в операціях з пам'яттю. Такі регістри іноді називаються індексними або базовими.
  • Регістри загального призначення — можуть зберігати і дані, і адреси
  • Регістри плаваючої коми — призначаються для зберігання даних для обчислень з плаваючою комою
  • Регістри констант — зберігають константи (наприклад в RISC-архітектурах регістр з порядковим номером нуль зазвичай зберігає константу нуля).
  • Векторні регістри — зберігають векторні дані та забезпечують векторні обчислення (наприклад, в мультимедійних розширеннях архітектури x86).
  • Регістри спеціального призначення — зберігають внутрішню інформацію, необхідну для функціонування процесора (лічильник команд, вказівник стеку, регістр стану процесора та ін.).

Деякі приклади[ред.ред. код]

У таблиці показано кількість регістрів загального призначення в декількох поширених архітектурах мікропроцесорів. Варто відзначити, що в деяких архітектурах використання окремих регістрів може бути ускладнене. Так, як SPARC та MIPS регістр номер 0 не зберігає інформацію і завжди зчитується як 0, а в процесорах x86 з регістром ESP (покажчик на стек) можуть працювати лише деякі команди.

Архітектура Цілочисельних
регістрів
FP
регистрів
Примітки
x86-32 8 8
x86-64[1] 16 16
IBM/360 16 4
z/Architecture 16 16
Itanium 128 128
SPARC 31 32 Регістр 0 (глобальний) завжди занулений
IBM Cell 4~16 1~4
IBM POWER[en] 32 32
Power Architecture[en] 32 32
Alpha 32 32
6502 3 0
W65C816S 5 0
PIC microcontroller 1 0
AVR microcontroller 32 0
ARM 32-bit[2] 16 varies
ARM 64-bit[3] 31 32
MIPS 31 32 Регістр 0 завжди занулений

Архітектура x86[ред.ред. код]

IP (англ. Instruction Pointer) — регістр, який вказує на зміщення (адреса) інструкцій в сегменті коду (1234:0100h сегмент/зміщення).

IP — 16-бітний (молодша частина EIP)

EIP — 32- бітний аналог (молодша частина RIP)

RIP — 64-бітний аналог

Сегментні регістри - регістри, що вказують на сегменти.

CS (англ. Code Segment), DS (англ. Data Segment), SS (англ. Stack Segment), ES (англ. Extra Segment), FS, GS

В реальному режимі роботи процесора сегментні регістри містять адресу початку 64Kb сегмента, зміщений управо на 4 біта. В захищеному режимі роботи процесора сегментні регістри містять селектор сегмента пам'яті, виділеного ОС.

CS — покажчик на кодовий сегмент. Зв'язка CS:IP (CS:EIP / CS:RIP - в захищеному / 64-бітному режимі) вказує на адресу в пам'яті наступної команди.

Регістри даних - служать для зберігання проміжних обчислень.

RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8 — R15 — 64-бітні

EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D — R15D — 32-бітні (extended AX)

AX (англ. Accumulator), CX (англ. Count Register), DX (англ. Data Register), BX (англ. Base Register), SP (англ. Stack Pointer), BP (англ. Base Pointer), SI (англ. Source Index), DI (англ. Destination Index), R8W — R15W — 16-бітні

AH, AL, CH, CL, DH, DL, BH, BL, SPL, BPL, SIL, DIL, R8B — R15B — 8-бітні (половинки 16-бітних регістрів)

наприклад, AH — high AX — старша половинка 8 біт

AL — low AX — молодша половинка 8 біт

RAX RCX RDX RBX
EAX ECX EDX EBX
AX CX DX BX
AH AL CH CL DH DL BH BL


RSP RBP RSI RDI Rx
ESP EBP ESI EDI RxD
SP BP SI DI RxW
SPL BPL SIL DIL RxB

де x — 8..15.
Регістр прапорів FLAGS (16 біт) / EFLAGS (32 біта) / RFLAGS (64 біта) — містить поточний стан процесора.

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

Регістр GDTR містить 32-бітний (24-бітний для Intel 286) базовий адресу і 16-бітний межа глобальної таблиці дескрипторів (GDT).

Видима частина регістра LDTR містить тільки селектор дескриптора локальної таблиці дескрипторів (LDT). Сам дескриптор LDT автоматично завантажується в приховану частину LDTR з глобальної таблиці дескрипторів.

Регістр IDTR містить 32-бітний (24-бітний для Intel286) базовий адресу і 16-бітний межа таблиці дескрипторів переривань (IDT). У реальному режимі може бути використаний для зміни місця розташування таблиці векторів переривань.

Видима частина регістра TR містить селектор дескриптора сегмента стану задачі (TSS). Сам дескриптор TSS автоматично завантажується в приховану частину TR з глобальної таблиці дескрипторів.

Зсувні регістри представляють собою послідовно з'єднану ланцюжок тригерів. Основний режим роботи - зрушення розрядів коду від одного тригера до іншого на кожен імпульс тактового сигналу. За призначенням регістри розрізняються на:

  • Акумулятор - використовується для зберігання проміжних результатів арифметичних і логічних операцій та інструкцій введення-виведення;
  • Флагової - зберігають ознаки результатів арифметичних і логічних операцій;
  • Загального призначення - зберігають операнди арифметичних і логічних виразів, індекси й адреси;
  • Індексні - зберігають індекси вихідних і цільових елементів масиву;
  • Вказівні - зберігають покажчики на спеціальні області пам'яті (покажчик поточної операції, покажчик бази, покажчик стека);
  • Сегментні - зберігають адреси та селектори сегментів пам'яті;
  • Керуючі - зберігають інформацію, керуючу станом процесора, а також адреси системних таблиць.

Лічильник команд[ред.ред. код]

Докладніше: Лічильник_команд

IP[ред.ред. код]

IP (англ. Instruction Pointer) - регістр, що містить адресу-зміщення наступної команди, що підлягає виконанню, щодо кодового сегмента CS в процесорах сімейства x86.

Регістр IP пов'язаний з CS у вигляді CS: IP, де CS є поточним кодовою сегментом, а IP - поточним зсувом щодо цього сегмента.

Регістр IP є 16-розрядним регістром-покажчиком. Крім нього, до складу регістрів цього типу входять SP (англ. Stack Pointer - покажчик стека) і BP (англ. Base Pointer - базовий покажчик).

Принцип роботи

Наприклад, CS містить значення 2CB5[0]H, в регістрі IP зберігається зсув 123H.

Адреса наступної інструкції, що підлягає виконанню, обчислюється шляхом підсумовування адреси в CS (сегменті коду) зі зміщенням в регістрі IP:

2CB50H + 123H = 2CC73H

Таким чином, адреса наступної інструкції для виконання дорівнює 2CC73H .

При виконанні поточної інструкції процесор автоматично змінює значення в регістрі IP, в результаті чого реєстрова пара CS: IP завжди вказує на наступну підлягає виконанню інструкцію.

Див. також[ред.ред. код]

  • Smith, J. E.; Pleszkun, A. R. (June 1985). "Implementation of precise interrupts in pipelined processors". ACM SIGARCH Computer Architecture News 13 (3): 36–44. doi:[4].
  • Smith, J. E.; Pleszkun, A. R. (May 1988). "Implementing precise interrupts in pipelined processors". IEEE Trans. Comput[en]. 37 (5): 562–573. doi:10.1109/12.4607[5].
  • Smith, J. E.; Pleszkun, A. R. (1998). "Implementation of precise interrupts in pipelined processors". 25 years of the international symposia on Computer architecture (selected papers) - ISCA '98. pp. 291–299. doi:10.1145/285930.285988[6]. ISBN 1581130589.

Примітки[ред.ред. код]