====== Аппаратные регистры для 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 ----