ЛЕКЦІЯ 5

Основи NASM: секції (.data, .bss, .text) та інструкція MOV

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

VTFK • 2025

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

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

  • Основні команди терміналу
  • Компіляція та лінкування
  • Makefile синтаксис

План лекції

  • Структура Assembly програми
  • Секції: .text, .data, .bss
  • Інструкція MOV
  • Типи даних

Фокус: перша робоча програма

Секція (Section)

Section

Частина програми з однією призначеністю: код (.text), ініціалізовані дані (.data), неініціалізовані дані (.bss).

Аналогія: Як розділи книги: «Вступ» (код), «Додаток» (дані)

Структура Assembly програми

Три основні секції

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart TB TEXT["section .text
Код програми
Інструкції
main: mov..."] DATA["section .data
Глобальні змінні
З значеннями
x: dd 42"] BSS["section .bss
Буфери
Без значень
buffer: resb 1024"] TEXT --> EXEC["Виконавець
.text має точку входу"] DATA --> EXEC BSS --> EXEC style TEXT fill:#E5F3FF style DATA fill:#FFE5E5 style BSS fill:#E5FFE5

Три секції NASM

Порівняння секцій

Секція Визначення Приклад Розмір у файлі
.text Код (read-only) mov rax, rbx Так, займає місце
.data Дані (read-write) x: dd 42 Так, займає місце
.bss Буфер (read-write) buf: resb 1000 Ні, тільки позначка
.rodata Константи PI: dq 3.14 Так, read-only

Інструкція MOV

MOV (Move)

Базова інструкція: копіює дані з источника в призначення. Не стирає источник (копіює, не переміщує).

Аналогія: Як скопіювати текст: оригіналу залишається, копія з'являється в місці вставки

MOV: синтаксис та приклади

Переміщення даних

mov rax, 42         ; rax = 42 (негайна константа)
mov rbx, rax        ; rbx = rax (регістр→регістр)
mov rcx, [rax]      ; rcx = значення за адресою rax (пам'ять→регістр)
mov [rbx], rdx      ; Адреса rbx = rdx (регістр→пам'ять)
mov r8, [rel msg]   ; r8 = адреса msg відносно RIP (RIP-relative)

Синтаксис NASM

Приклад: інініціалізація змінних

Як визначити дані

section .data
    num1    dd      10          ; 32-bit: 10
    num2    dq      20          ; 64-bit: 20
    message db      'Hello', 0  ; Рядок з нулем
    pi      dq      3.14        ; Float

section .bss
    buffer  resb    1024        ; Буфер 1024 байти
    array   resq    100         ; Масив 100 64-bit слів

section .text
    global main
main:
    mov rax, [rel num1]  ; rax = 10
    mov rbx, [rel num2]  ; rbx = 20
    ret

MOV обмеження

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

Яка різниця між .data та .bss?

  • .data має початкові значення, .bss — ні
  • .bss швидше
  • Немає різниці
✅ Правильна відповідь: .data має початкові значення, .bss — ні
💡 Пояснення:

.data займає місце в виконавчому файлі. .bss — тільки позначка (виділяється при запуску).

Помилка: забути [дужки] для пам'яті

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

Дужки означають адресацію пам'яті

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

section .data
    x dd 42

section .text
    mov rax, x      ; Помилка: x без дужок = адреса, а не значення

NASM дає помилку або неправильну адресу

✓ Правильно

section .data
    x dd 42

section .text
    mov rax, [rel x]  ; rax = 42 (значення з адреси x)

[rel x] = значення за адресою x (RIP-relative)

Режим адресації: RIP-relative

Перша робоча програма на Assembly

Hello World (простіша версія)

section .data
    msg db 'Hello', 0
    len equ $ - msg

section .text
    global main
main:
    ; Читаємо адресу повідомлення
    mov rsi, [rel msg_ptr]
    
    ; Стандартна процедура виводу
    mov rax, 0x2000004   ; write syscall (macOS)
    mov rdi, 1           ; stdout
    mov rdx, 5           ; довжина
    syscall
    ret

Підсумки

  • .text: код, .data: дані з значеннями, .bss: буфери без значень
  • MOV: базова інструкція для копіювання даних
  • [rel адреса]: RIP-relative адресація у 64-біт

Далі — арифметичні інструкції: ADD, SUB, INC, DEC

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

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

Лекція 6: Арифметичні інструкції

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

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

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

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