ЛЕКЦІЯ 4

Робота з терміналом. Вступ до компілятора NASM та Makefiles

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

VTFK • 2025

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

Лекція 3: Архітектура x86-64

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

План лекції

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

Фокус: інструменти розробки

Асемблер NASM

NASM (Netwide Assembler)

Портативний асемблер для x86/x86-64, який перетворює Assembly код в машинний код.

Аналогія: Як перекладач з англійської в китайську — Assembly для людини, машинний код для CPU

Основні команди терміналу (macOS/Linux)

Практичні команди

День на день

# Навігація
pwd              # /Users/alex/dev
ls -la           # Список з прихованими файлами
cd ~/projects    # Home directory
cd ..            # Батьківська папка

# Роботи з файлами
cat main.asm     # Показати вміст
touch hello.asm  # Новий файл
mkdir src        # Нова папка
cp main.asm backup.asm  # Копіювання
rm backup.asm    # Видалення

Встановлення NASM

Pipeline: код → виконавець

Як Assembly стає програмою

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR SOURCE["main.asm
Assembly код"] --> NASM["nasm
Асемблер"] NASM --> OBJ["main.o
Об'єктний файл
(машинний код)"] OBJ --> LINKER["ld
Лінкер"] LINKER --> EXE["./main
Виконавець"] EXE --> RUN["./main
Результат"] style SOURCE fill:#E5F3FF style EXE fill:#FFE5E5 style RUN fill:#E5FFE5

Hello World в Assembly (64-bit macOS)

Мінімальна програма

; hello.asm - Hello World
section .data
    msg db "Hello, World!", 0

section .text
    global _main  ; точка входу для macOS

_main:
    mov rax, 0x2000004  ; syscall: write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; адреса повідомлення
    mov rdx, 13         ; довжина
    syscall
    
    mov rax, 0x2000001  ; syscall: exit
    mov rdi, 0
    syscall

Компіляція вручну

Makefile

Makefile

Файл, що описує як компілювати проект: залежності, команди, мета (target).

Аналогія: Як рецепт готування: 'якщо A змінилось, перебудувати B, потім запустити C'

Простий Makefile

Автоматизація компіляції

# Makefile для Assembly проекту
CC = nasm
LD = ld
FLAGS = -f macho64

all: hello

hello: hello.o
	$(LD) -lSystem -o hello hello.o

hello.o: hello.asm
	$(CC) $(FLAGS) hello.asm -o hello.o

clean:
	rm -f hello.o hello

.PHONY: all clean

Синтаксис Makefile

Запуск make

Приклади команд

# Побудувати все (за замовчуванням перший target)
make

# Побудувати конкретна мета
make hello.o

# Очистити побудовані файли
make clean

# Примусова перебудова (навіть якщо файли не змінилися)
make -B all

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

Яка різниця між .o та виконавцем?

  • .o — об'єктний код без адрес, exe — лінковані адреси
  • .o — більший файл
  • Немає різниці
✅ Правильна відповідь: .o — об'єктний код без адрес, exe — лінковані адреси
💡 Пояснення:

.o — готовий машинний код, але функції мають відносні адреси. Лінкер розміщує їх в памяти і фіксує адреси.

Помилка: пробіли замість TAB в Makefile

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

Makefile дуже щепетлив до форматування

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

hello.o: hello.asm
    nasm -f macho64 hello.asm -o hello.o  # пробілами

Помилка: make: *** missing separator. Stop.

✓ Правильно

hello.o: hello.asm
	nasm -f macho64 hello.asm -o hello.o  # TAB символ

Команда має починатися с символу TAB (не 4 пробілів!)

Етапи розробки Assembly програми

Підсумки

  • NASM: асемблер для переведення Assembly → машинний код
  • Makefile: автоматизує компіляцію та лінкування
  • Pipeline: .asm → .o (NASM) → exe (ld)

Далі — основи NASM: секції, інструкції, пам'ять

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

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

Лекція 5: Основи NASM

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

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

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

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