📌 GPR

GPR (General Purpose Register, регистр общего назначения) — быстродействующий элемент хранения внутри CPU, предназначенный для временного размещения операндов, адресов, промежуточных результатов арифметических и логических операций. Используется в большинстве инструкций, напрямую доступен программно через ISA. GPR — фундаментальный компонент архитектуры процессора, определяющий эффективность вычислений и глубину оптимизации кода.


🧠 Как работает

Назначение и структура

  • GPR хранят значения, которые используются в вычислениях и передаются между инструкциями без обращения к RAM.
  • Количество и разрядность GPR определяются ISA (например: x86 — 8×32-битных, 16×64-битных; ARM — 16 или 31×32/64-битных; RISC-V — 32×32/64-битных; MIPS — 32×32-битных).
  • GPR могут использоваться как:
    • Операнды арифметических/логических инструкций (add, sub, and, or)
    • Адресные регистры (указание адреса в памяти)
    • Счетчики, индексные и временные регистры
    • Хранение возвращаемых значений и параметров функции

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

  • Каждая инструкция процессора работает преимущественно с содержимым GPR.
  • В современных процессорах чтение/запись в GPR происходит за 1 такт, что значительно быстрее обращения к Cache или RAM.
  • При вызове функций параметры и результаты обычно передаются через определённые GPR (ABI calling convention).
  • В некоторых архитектурах есть “нулевой” GPR (например, MIPS $zero), всегда возвращающий 0 при чтении.

Классическая схема регистра GPR в процессоре (совместима с Mermaid v8/v9/v10)

flowchart TB
    ALU["ALU (арифметико-логическое устройство)"]
    GPR["GPR Bank"]
    RAM["RAM"]
    PC["Program Counter"]
    CU["Control Unit"]

    GPR -- "операнды" --> ALU
    ALU -- "результат" --> GPR
    GPR -- "адрес/данные" --> RAM
    PC -- "адрес" --> GPR
    CU -- "управление" --> GPR

⚙️ Где применяется

  • Во всех современных CPU, MCU, DSP, GPU (иногда — регистровые файлы с тысячами GPR для параллельных потоков).

  • Регистр-ориентированные вычисления, оптимизация компиляторов (регистровое распределение).

  • Контекст-переключение (Context Switch) — сохранение/восстановление содержимого всех GPR.

  • В low-level-программировании: ASM, отладка, вызовы ОС, bootloader, RTOS.


✅ Преимущества

  • Максимальная скорость доступа по сравнению с любой памятью.

  • Гибкость — универсальное назначение, упрощённая работа компилятора.

  • Эффективность — снижение количества обращений к кешу и RAM.

  • Аппаратная поддержка операций “без памяти” (register-to-register).


❌ Недостатки

  • Ограниченность — количество GPR фиксировано (по стандарту ISA).

  • Не все GPR равноправны — в некоторых ISA часть из них зарезервирована или имеет специальное назначение (PC, SP, FLAGS).

  • Регистровое давление — при дефиците GPR увеличиваются обращения к стеку или RAM, страдает производительность.

  • Сложность ABI — разные calling conventions для разных платформ и языков.


🔗 Связанные технологии

CPU, ISA, ALU, FPU, Register File, PC, SP, FLAGS, x86, ARM, RISC-V, MIPS, ABI, Calling Convention, MCU, DSP, Pipeline


Резюме

GPR — центральный компонент архитектуры любого процессора, определяющий скорость, стиль программирования и компиляторные оптимизации. Их число, назначение и структура — одна из ключевых характеристик ISA. GPR минимизируют обращения к памяти, обеспечивают высокую производительность и гибкость вычислений. При проектировании архитектуры или написании низкоуровневого кода знание принципов работы GPR — базовая необходимость.


Примеры кода

x86-64: сложение в GPR (ассемблер)

section .data
    x dq 10
    y dq 20
    result dq 0
 
section .text
    global _start
_start:
    mov rax, [x]     ; rax — GPR
    add rax, [y]
    mov [result], rax
    mov rax, 60
    xor rdi, rdi
    syscall

ARM: работа с регистром общего назначения

    MOV R0, #5        // r0 — GPR, присваиваем значение 5
    ADD R1, R0, #10   // r1 — GPR, r1 = r0 + 10

C: работа с inline-ассемблером (gcc, x86)

int a = 3, b = 4, c;
asm("addl eax" : "=a"(c) : "a"(a), "b"(b));

Linux: просмотр состояния GPR через gdb

gdb ./myprog
(gdb) info registers

Источники: Intel® SDM, ARM Architecture Reference Manual, RISC-V Spec, osdev.org, habr.com, Википедия, AMD64 ABI, gcc docs, LLVM docs, архитектуры MIPS/MIPS64.