ЛЕКЦІЯ 8

Базова адресація пам'яті в NASM

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

VTFK • 2025

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

Лекція 7: CMP та прапорці

  • CMP: порівняння
  • Умовні переходи: JE, JA, JG
  • Прапорці ZF, CF, SF

План лекції

  • Режими адресації
  • [базис]
  • [базис + зміщення]
  • [базис + індекс * масштаб + зміщення]

Фокус: робота з масивами та структурами

Адресація пам'яті

Addressing Modes

Способи визначення, яку адресу в пам'яті використати для операції: безпосередня, регістр, пам'ять з обчисленням адреси.

Аналогія: Як знайти човома на столі: скажи номер, або 'ліворуч від X', або 'X плюс 3 см нижче'

Режими адресації (x86-64)

Формула для адреси

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR ADDR["Адреса ="] --> BASE["базис +"] BASE --> INDEX["індекс*масштаб +"] INDEX --> DISP["зміщення"] DISP --> EX1["[rax] = адреса в rax"] DISP --> EX2["[rax + 8] = rax + 8"] DISP --> EX3["[rax + rbx*4 + 16] = rax + rbx*4 + 16"] style ADDR fill:#FFE5E5 style EX1 fill:#E5F3FF style EX2 fill:#E5FFE5 style EX3 fill:#FFE5FF

Основні режими адресації

Режим Синтаксис Адреса Приклад
Регістр rax значення rax mov rbx, [rax]
Базис + зміщення [rax + 8] rax + 8 mov rcx, [rsp + 16]
Індекс масив [rax + rbx*4] rax + rbx*4 mov rdx, [base + i*4]
Комплексна [rax + rbx*8 + 10] rax + rbx*8 + 10 структури, масиви
RIP-relative [rel label] label mov rax, [rel data]

Правила адресації

Приклади адресації

Від простих до складних

mov rax, [rbx]              ; базис
mov rax, [rbx + 8]          ; базис + зміщення
mov rax, [rbx + rcx*4]      ; базис + індекс*масштаб
mov rax, [rbx + rcx*4 + 16] ; повна формула
mov rax, [rel data]         ; RIP-relative

Масив: доступ до елементів

Програма: доступ до масиву

Читаємо другий елемент массива

section .data
    arr dd 10, 20, 30, 40, 50    ; Масив з п'яти чисел

section .text
    global main
main:
    lea rax, [rel arr]           ; rax = адреса масиву
    mov rbx, [rax + 4]           ; rbx = arr[1] (другой элемент, +4 байты)
    mov rcx, [rax + 8]           ; rcx = arr[2] (третий, +8 байтів)
    ret

LEA: Load Effective Address

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

Яка різниця між [rax] та rax?

  • [rax] = значення за адресою, rax = сама адреса
  • Немає різниці
  • [rax] швидше
✅ Правильна відповідь: [rax] = значення за адресою, rax = сама адреса
💡 Пояснення:

mov rbx, [rax] читає пам'ять. mov rbx, rax копіює адресу.

Помилка: забути масштаб для індексу

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

Індекс треба помножити на розмір елементу

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

mov rax, [base + i]      ; ПОМИЛКА: i должен быть *4 для int
                         ; правильно: [base + i*4]

Без масштабу отримаємо неправильну адресу

✓ Правильно

mov rax, [base + i*4]    ; base + i*4 для массива int
mov rax, [base + i*8]    ; base + i*8 для массива long

Масштаб залежить від типу елементу

Структури в Assembly

Підсумки

  • Адреса = базис + індекс*масштаб + зміщення
  • [rax] — значення в пам'яті; rax — адреса
  • LEA для обчисленя адрес без доступу до пам'яті

Далі — Rust: переходимо від низькорівневого до безпечного

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

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

Лекція 9: Вступ до Rust

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

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

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

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