====== Аппаратные регистры для x86-64, RISC, CISC ======
Разберём основные аппаратные регистры для трёх архитектур:
- **x86-64** (CISC, наиболее распространённая CISC-архитектура)
- **Классическая RISC** (пример: ARMv8-A/AArch64, MIPS)
- **Классическая CISC** (на примере x86-64, с комментариями по отличиям от RISC)
===== 1. Регистры x86-64 (CISC) =====
^ Категория ^ Регистр ^ Разрядность ^ Назначение и особенности ^
| Общего назначения | RAX, RBX, RCX, RDX | 64 | Основные регистры (арифметика, универсальные) |
| Общего назначения | RSI, RDI | 64 | Индексы для строковых операций, аргументы вызовов |
| Общего назначения | RBP, RSP | 64 | Базовый и стековый указатели |
| Дополнительные | R8–R15 | 64 | Дополнительные универсальные регистры |
| Программный счётчик | RIP | 64 | Адрес следующей инструкции |
| Флаги | RFLAGS | 64 | Флаги процессора |
| Сегментные | CS, DS, ES, SS, FS, GS | 16 | Сегментация памяти (редко используется в 64 бит) |
| Контроля | CR0, CR2, CR3, CR4, CR8 | 64 | Управление страницами и режимами процессора |
| SIMD/SSE | XMM0–XMM15 | 128 | SIMD/FPU операции |
| AVX | YMM0–YMM15 | 256 | Расширенные SIMD |
| AVX-512 | ZMM0–ZMM31 | 512 | Ещё шире SIMD |
| MMX/FPU | ST(0)–ST(7), MM0–MM7 | 80/64 | Стек FPU/MMX |
* Каждый RAX разбивается на EAX (32), AX (16), AL (8), AH (8 верхний байт), и аналоги для других регистров.
----
===== 2. Регистры классической RISC (ARMv8/AArch64, элементы MIPS) =====
==== ARMv8-A/AArch64 ====
^ Категория ^ Регистр ^ Разрядность ^ Назначение и особенности ^
| Общего назначения | X0–X30 | 64 | 31 регистр общего назначения (X30=LР) |
| Аргументы/возврат | X0–X7 | 64 | Аргументы функций, X0 — возврат из функции|
| Стековый | SP | 64 | Stack Pointer |
| Программный счётчик | PC | 64 | Program Counter |
| Флаги | NZCV | 4 | Negative, Zero, Carry, Overflow |
| Системный | PSTATE | - | Статус, управление привилегиями |
| SIMD/Vector | V0–V31 | 128 | Регистры для NEON/SIMD/FPU |
==== MIPS (32/64-бит, неполный список) ====
^ Назначение ^ Имя ^ Описание ^
| zero | $zero | Всегда 0 |
| Аргументы | $a0–$a3 | Аргументы функций |
| Вызов | $ra | Return address |
| Счётчик | $t0–$t9 | Временные регистры |
| Сохранение | $s0–$s7 | Saved регистры |
| Стек | $sp | Stack pointer |
| Программный счётчик| $pc | Program counter |
----
===== 3. Классическая CISC =====
* Современная CISC — см. x86-64 выше.
* В старых CISC (VAX, 68000): используются спец. регистры управления/адресации, меньшее число GPR, возможность сложной адресации.
* Пример: VAX-11 — регистры R0–R15, PSW (status), PC.
----
===== 4. Сводная таблица по архитектурам =====
^ Архитектура ^ Категория ^ Имя регистра(-ов) ^ Разрядность ^ Кол-во ^ Назначение, особенности ^
| x86-64 | Общие | RAX…RDI, RBP, RSP | 64 | 8 | Универсальные, арифметика, стек |
| | Дополнительные | R8–R15 | 64 | 8 | Универсальные |
| | Программный счётчик | RIP | 64 | 1 | IP (указатель команды) |
| | Флаги | RFLAGS | 64 | 1 | Флаги |
| | Сегментные | CS, DS, ES, SS, FS, GS | 16 | 6 | Сегмент. память |
| | SIMD | XMM0–XMM15, YMM*, ZMM* | 128–512 | 16–32 | Векторные регистры |
| | FPU/MMX | ST(0)–ST(7), MM0–7 | 80/64 | 8 | FPU/MMX |
| ARMv8 | Общие | X0–X30 | 64 | 31 | Универсальные (X30 — LR) |
| | Стек | SP | 64 | 1 | Stack Pointer |
| | Программный счётчик | PC | 64 | 1 | Program Counter |
| | Флаги | NZCV | 4 | 1 набор | Флаги состояния |
| | SIMD/VFP | V0–V31 | 128 | 32 | Векторные регистры |
| MIPS | Общие | $0–$31 | 32/64 | 32 | Универсальные (назначение по ABI) |
| | Стек | $sp | 32/64 | 1 | Stack Pointer |
| | PC | $pc | 32/64 | 1 | Program Counter |
| | HI/LO | hi, lo | 32/64 | 2 | Для умножения/деления |
----
===== 5. Сравнение отличий CISC и RISC =====
^ Особенность ^ x86-64 (CISC) ^ RISC (ARMv8, MIPS) ^
| Количество GPR | 16 (реальных) | 31–32 |
| Размер регистров | 64 бит (есть 8/16/32 бита)| 64 бит (обычно) |
| Специализация | Некоторые спец. регистры | Все практически общие |
| Адресация памяти | Сложная, много режимов | Простая |
| Указатель команд | RIP | PC |
----
===== 6. Пример кода =====
**x86-64:**
mov rax, rbx ; Копировать rbx в rax
add rax, rcx ; Сложение
mov [rsp+8], rax ; Сохр. rax на стеке
**ARMv8/AArch64:**
MOV X0, X1 ; Копировать X1 в X0
ADD X0, X0, X2 ; Сложить X0 и X2, результат в X0
STR X0, [SP, #8] ; Сохр. X0 по адресу SP+8
----