ЛЕКЦІЯ 6

Арифметичні інструкції (ADD, SUB, INC, DEC)

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

VTFK • 2025

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

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

  • Секції: .text, .data, .bss
  • Інструкція MOV
  • RIP-relative адресація

План лекції

  • ADD: додавання
  • SUB: віднімання
  • INC/DEC: збільшення/зменшення
  • Прапорці (flags)

Фокус: перша математика в Assembly

Арифметичні інструкції

Arithmetic Instructions

Набір інструкцій для математичних операцій: додавання, віднімання, множення. Встановлюють прапорці ZF, CF, OF.

Аналогія: Як калькулятор: операція + результат + индикатори (overflow, zero)

Основні арифметичні операції

Арифметичні операції та прапорці

Результат впливає на ZF, CF

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR ADD["ADD rax, 5"] --> EXEC["rax += 5"] EXEC --> FLAGS["Встановлюються прапорці"] FLAGS --> ZF{"ZF=1?
Result=0?"} FLAGS --> CF{"CF=1?
Overflow?"} FLAGS --> SF{"SF=1?
Negative?"} ZF -->|Так| ZERO["Результат нуль"] ZF -->|Ні| NONZERO["Результат ≠ нуль"] style ADD fill:#E5F3FF style FLAGS fill:#FFE5E5

Арифметичні інструкції

Інструкція Операція Приклад Прапорці?
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 після: add rax, 0 (коли rax=5)?

  • ZF=0 (результат 5, не нуль)
  • ZF=1 (додавання зробило 0)
  • ZF не змінюється
✅ Правильна відповідь: ZF=0 (результат 5, не нуль)
💡 Пояснення:

ZF встановлюється залежно від результату. 5+0=5, тому ZF=0.

Помилка: забути про CF та OF

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

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

Прапорці та умовні переходи

Підсумки

  • ADD/SUB: додавання та віднімання з встановленням прапорців
  • INC/DEC: збільшення/зменшення на 1
  • Прапорці ZF, CF, OF критичні для умовного коду

Далі — CMP та прапорці детально

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

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

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

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

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

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

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