Спеціалізовані мови програмування
VTFK • 2025
Лекція 5: Основи NASM
Фокус: перша математика в Assembly
Набір інструкцій для математичних операцій: додавання, віднімання, множення. Встановлюють прапорці ZF, CF, OF.
Аналогія: Як калькулятор: операція + результат + индикатори (overflow, zero)
Результат впливає на ZF, CF
| Інструкція | Операція | Приклад | Прапорці? |
|---|---|---|---|
| ADD | rax += src | add rax, 5 | Так (ZF, CF, OF) |
| SUB | rax -= src | sub rbx, rcx | Так (ZF, CF, OF) |
| INC | rax += 1 | inc r8 | Так (крім CF) |
| DEC | rax -= 1 | dec rdx | Так (крім CF) |
| NEG | rax = -rax | neg rax | Так (ZF, CF, OF) |
| IMUL | rax *= src (signed) | imul rax, 3 | Так (CF, OF) |
Від просто до складного
mov rax, 10
add rax, 5 ; rax = 15
mov rbx, 20
sub rbx, 3 ; rbx = 17
inc rcx ; rcx += 1
inc rcx ; rcx += 1
dec rdx ; rdx -= 1
neg r8 ; r8 = -r8 (якщо r8 був 5, тепер -5)
ZF встановлюється залежно від результату. 5+0=5, тому ZF=0.
ADD/SUB мають побічні ефекти (встановлюють прапорці)
mov rax, 0xFFFFFFFFFFFFFFFF
add rax, 1 ; rax = 0, CF = 1 (переповнення!)
jz end ; JZ перевіряє ZF, не помічає переповнення
CF (переповнення) і ZF (нуль) — різні прапорці
mov rax, 0xFFFFFFFFFFFFFFFF
add rax, 1 ; rax = 0, CF = 1, ZF = 1
jc overflow ; JC перевіряє CF (переповнення)
jz is_zero ; JZ перевіряє ZF (результат нуль)
Кожний прапорець для своєї мети
ADD в дії
section .data
x dd 42
y dd 8
section .text
global main
main:
mov rax, [rel x] ; rax = 42
add rax, [rel y] ; rax += 8 → 50
; rax тепер має 50
; Виходимо (вже с системою, вихід буде в rax)
ret
Далі — CMP та прапорці детально
Лекція 7: CMP та прапорці
Дякую за увагу! 💾