ЛЕКЦІЯ 3

Архітектура x86-64: Регістри та базове представлення пам'яті

Спеціалізовані мови програмування

VTFK • 2025

Що вже вивчили

Лекція 2: Системи числення

  • Двійкова та шістнадцяткова системи
  • Перетворення між системами
  • Байти та біти

План лекції

  • Архітектура x86-64 огляд
  • Регістри: призначення та розміри
  • Пам'ять: стек та heap
  • Адресування

Фокус: як CPU бачить дані

x86-64 архітектура

x86-64

64-розрядна архітектура Intel/AMD, основна в ПК та серверах. Розвиток 32-розрядної x86 системи.

Аналогія: Як модернізація доміння: більше вікон (регістрів), більше кімнат (пам'ять)

Регістри: велика пам'ять процесора

Основні регістри (x86-64)

Обривки, їх призначення

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph LR RAX["RAX: акумулятор
(результати операцій)"] RBX["RBX: база
(базова адреса)"] RCX["RCX: лічильник
(цикли)"] RDX["RDX: дані
(частина операцій)"] RSP["RSP: вказівник стеку
(поточна позиція)"] RBP["RBP: база стеку
(початок фрейму)"] style RAX fill:#FFE5E5 style RCX fill:#FFE5E5 style RSP fill:#E5FFE5

Розміри регістрів

Назва Біти Байти Приклад (рах = 0xFF)
RAX 64 8 0x00000000000000FF
EAX 32 4 0x000000FF (заповнює нулями RAX)
AX 16 2 0x00FF
AL 8 1 0xFF (низький байт)
AH 8 1 0x00 (вищий байт)

Пам'ять: організація

Пам'ять програми: layout

Організація адресного простору

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart TB HIGH["0xFFFFFFFF
High
Kernel space"] HEAP1["Heap
(malloc, new)"] UNMAP["Unmapped"] STACK["Stack
(локальні змінні, return addr)"] BSS["BSS
(глобальні, инициализовані)"] DATA["Data
(дані програми)"] TEXT["Text
(код, інструкції)"] LOW["0x00000000"] HIGH --> HEAP1 --> UNMAP --> STACK --> BSS --> DATA --> TEXT --> LOW style STACK fill:#FFE5E5 style HEAP1 fill:#E5F3FF style TEXT fill:#E5FFE5

Стек (Stack)

Стек в C

Як змінні зберігаються

void func() {
    int a = 5;      // На стеку: RSP - 8
    int b = 10;     // На стеку: RSP - 16
    char c = 'x';   // На стеку: RSP - 24
    // Локальні змінні зникають при return
}  // RSP повертається до попередного значення

Heap (Динамічна пам'ять)

Міні-вікторина

Чому стек швидше за heap?

  • Стек у регістрах, heap у RAM
  • Стек менший
  • Немає різниці
✅ Правильна відповідь: Стек у регістрах, heap у RAM
💡 Пояснення:

Стек близько до CPU, просто збільшується/зменшується RSP. Heap потребує malloc/free операцій.

Помилка: путати адресу та значення

⚠️ ЗАСТЕРЕЖЕННЯ

Адреса змінної ≠ значення змінної

❌ Неправильно

int x = 42;
printf("%d\n", x);      // 42 (значення)
printf("%d\n", &x);     // Помилка: адреса — це не int!

&x — це адреса, формат %p (pointer)

✓ Правильно

int x = 42;
printf("Значення: %d\n", x);      // 42
printf("Адреса: %p\n", (void*)&x);  // 0x7fff5fbff8c0

&x дає адресу (unsigned long), потрібен %p

Основні поняття

Підсумки

  • x86-64: 64-розрядна архітектура з 16 основними регістрами
  • Стек: швидкий, локальні змінні, растет донизу
  • Heap: повільний, динамічний, керується вручну

Далі — інструменти: NASM, компілятор, Makefile

Домашнє завдання

Наступна лекція:

Лекція 4: Робота з терміналом

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій