Спеціалізовані мови програмування
VTFK • 2025
Лекція 4: Робота з терміналом та NASM
Фокус: перша робоча програма
Частина програми з однією призначеністю: код (.text), ініціалізовані дані (.data), неініціалізовані дані (.bss).
Аналогія: Як розділи книги: «Вступ» (код), «Додаток» (дані)
Три основні секції
| Секція | Визначення | Приклад | Розмір у файлі |
|---|---|---|---|
| .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 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)
Як визначити дані
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
.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)
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
Далі — арифметичні інструкції: ADD, SUB, INC, DEC
Лекція 6: Арифметичні інструкції
Дякую за увагу! 💾