Register — protsessor ichidagi juda tez va kichik xotira elementi. CPU instructionlarni bajarishda operandlar, manzillar, holat bitlari va oraliq natijalarni registerlarda saqlaydi.
Registerga murojaat operativ xotiraga murojaatdan ancha tez. Shu sababli compiler tez-tez ishlatiladigan qiymatlarni imkon qadar registerlarda ushlashga harakat qiladi.
Register soni va vazifasi protsessor arxitekturasining instruction set architecture qismiga kiradi.
General-purpose register
Umumiy maqsadli registerlar:
uchun ishlatilishi mumkin.
x86-64 arxitekturasida RAX, RBX, RCX, RDX kabi registerlar mavjud.
ARM64da X0–X30 kabi registerlar ishlatiladi.
Maxsus registerlar
Ba’zi registerlar maxsus vazifaga ega.
Program counter
Keyingi bajariladigan instruction manzilini saqlaydi.
x86da instruction pointer, ARMda program counter tushunchasi bilan bog‘liq.
Stack pointer
Call stackning joriy yuqori qismini ko‘rsatadi.
Frame pointer
Funksiya stack frame’iga barqaror reference beradi.
Compiler optimizationda frame pointer olib tashlanishi mumkin.
Flags register
Arithmetic va control holatlarini saqlaydi:
- zero;
- carry;
- sign;
- overflow;
- interrupt enable;
- privilege bilan bog‘liq bitlar.
Register width
Register hajmi arxitekturaga bog‘liq.
- 8-bit;
- 16-bit;
- 32-bit;
- 64-bit;
- 128-bit va undan katta vector registerlar.
64-bit CPUda general-purpose registerlar ko‘pincha 64 bit.
Bitta register ichida kichik qiymatning faqat pastki qismi ishlatilishi mumkin.
Arithmetic operation
ALU operandlarni registerlardan oladi va natijani registerga yozadi.
Misol:
R1 = 10
R2 = 20
ADD R3, R1, R2
R3 = 30
Ayrim instruction operanddan birini xotiradan ham olishi mumkin, ammo ichki bajarishda qiymat baribir processor data path’iga kiradi.
Load va store
RISC arxitekturalarda arithmetic instructionlar odatda faqat registerlar bilan ishlaydi.
Xotiradan qiymat olish:
LOAD R1, [address]
Xotiraga yozish:
STORE [address], R1
Bu load-store architecture deb ataladi.
Register file
CPU ichidagi umumiy registerlar to‘plami register file deb ataladi.
U bir clock cycle ichida bir nechta operandni o‘qish va natijani yozish uchun ko‘p portga ega bo‘lishi mumkin.
Ko‘p port register file chip maydoni va energiya sarfini oshiradi.
Calling convention
Function argument va return value qaysi registerlarda uzatilishi ABI bilan belgilanadi.
Masalan, bir arxitekturada birinchi argumentlar ma’lum registerlarda, qolganlari stackda bo‘lishi mumkin.
Return value odatda alohida registerda qaytariladi.
Calling convention quyidagilarni belgilaydi:
- argument registerlari;
- return registeri;
- caller-saved;
- callee-saved;
- stack alignment.
Caller-saved register
Function chaqiruvchi tomon register qiymati kerak bo‘lsa, chaqirishdan oldin saqlaydi.
Called function uni erkin o‘zgartirishi mumkin.
Callee-saved register
Called function registerdan foydalansa, eski qiymatni stackga saqlab, qaytishda tiklaydi.
Bu kelishuv compilerlar va turli tillarda yozilgan kodlarning birga ishlashiga imkon beradi.
Register allocation
Compiler vaqtinchalik o‘zgaruvchilarni fizik registerlarga taqsimlaydi.
Muammo:
- virtual qiymatlar ko‘p;
- registerlar soni cheklangan;
- live range’lar ustma-ust tushadi.
Compiler graph coloring, linear scan yoki boshqa algoritm ishlatishi mumkin.
Register spilling
Register yetmasa, ayrim qiymatlar stack yoki memoryga vaqtincha yoziladi.
Bu spill deb ataladi.
Spill qo‘shimcha load/store instruction yaratib, performance’ni pasaytiradi.
Code optimization register pressure’ni kamaytirishga intiladi.
SIMD register
Vector instructionlar bitta register ichida bir nechta elementni parallel qayta ishlaydi.
Misollar:
- SSE;
- AVX;
- NEON;
- SVE.
Qo‘llanishlar:
- multimedia;
- machine learning;
- encryption;
- signal processing;
- matrix operation.
Vector registerlar 128, 256, 512 bit yoki scalable hajmda bo‘lishi mumkin.
Floating-point register
Floating-point qiymatlar uchun alohida registerlar bo‘lishi mumkin.
Zamonaviy arxitekturada floating-point va SIMD registerlar bir register file’da birlashtirilishi mumkin.
Control register
Operatsion tizim CPU rejimini boshqaradigan privileged registerlardan foydalanadi.
Ular:
- page table manzili;
- memory protection;
- interrupt;
- virtualization;
- debug;
- feature enable
ni boshqarishi mumkin.
User mode dastur ularga to‘g‘ridan-to‘g‘ri kira olmaydi.
Status register
CPU instruction natijasidagi holatni saqlaydi.
Misol:
CMP R1, R2
instruction natijani yozmasdan flaglarni o‘zgartiradi. Keyingi conditional branch shu flaglarga qaraydi.
Register renaming
Out-of-order CPUlarda architectural registerlardan ko‘proq physical register mavjud bo‘lishi mumkin.
Register renaming false dependencylarni yo‘qotadi.
Masalan, bir xil RAX nomiga ketma-ket yozuvlar ichki fizik registerlarga ajratiladi.
Bu parallel instruction executionni oshiradi.
Context switch
Thread almashtirilganda uning register holati saqlanib, boshqa threadniki tiklanadi.
Saqlanadigan qiymatlar:
- general register;
- stack pointer;
- instruction pointer;
- flags;
- vector state;
- control state, kerak bo‘lsa.
Katta vector register state context switch xarajatini oshirishi mumkin.
Debug register
Hardware breakpoint va watchpoint uchun maxsus debug registerlar mavjud.
Debugger ma’lum manzil bajarilganda yoki o‘qilganda CPUni to‘xtatishi mumkin.
Hardware breakpoint soni cheklangan.
Register va cache farqi
Register CPU execution unitga eng yaqin va eng tez xotira.
Cache esa RAMdan olingan ma’lumot bloklarini saqlaydi.
| Jihat | Register | Cache |
|---|---|---|
| Hajm | Juda kichik | Kattaroq |
| Boshqaruv | Instruction/compiler | Hardware |
| Murojaat | Register nomi | Memory address |
| Tezlik | Eng yuqori | Registerdan past |
Diagnostika
Low-level xatoda registerlar debugger yoki core dump orqali ko‘riladi.
Muhim ma’lumot:
- instruction pointer;
- stack pointer;
- argument registerlari;
- return registeri;
- flags;
- fault address;
- calling convention.
Register qiymatini source code bilan bog‘lash uchun assembly va debug symbol kerak.
Bog‘liq tushunchalar
CPU, ALU, Program counter, Stack pointer, Flags register, Calling convention, Register allocation, SIMD, Context switch, Cache