ЛЕКЦІЯ 7

Інструкція CMP та основи прапорців (ZF, SF)

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

VTFK • 2025

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

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

  • ADD, SUB, INC, DEC операції
  • Прапорці: ZF, CF, OF, SF
  • Встановлення прапорців

План лекції

  • CMP: порівняння двох чисел
  • Прапорці ZF, SF, CF детально
  • Умовні переходи
  • Таблиця мнемоніків

Фокус: умовна логіка в Assembly

Інструкція CMP

CMP (Compare)

Порівняння: обчислює (rax - rbx), встановлює прапорці, але не зберігає результат. Як SUB, але без зміни операндів.

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

CMP: синтаксис

CMP та прапорці

Таблиця результатів

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR CMP["cmp rax, rbx"] --> COMPUTE["(rax - rbx)"] COMPUTE --> GT{"rax > rbx?"} GT -->|Так| ZF0CF0["ZF=0, CF=0"] GT -->|Ні| EQUAL{"rax = rbx?"} EQUAL -->|Так| ZF1["ZF=1"] EQUAL -->|Ні| LT["rax < rbx"] LT --> ZF0CF1["ZF=0, CF=1"] style ZF0CF0 fill:#E5FFE5 style ZF1 fill:#FFE5E5 style ZF0CF1 fill:#FFE5E5

CMP результати та прапорці

Умова ZF CF SF Умовний перехід
rax = rbx 1 0 0 JE (Jump if Equal)
rax ≠ rbx 0 0 - JNE (Jump if Not Equal)
rax > rbx (unsigned) 0 0 - JA (Jump if Above)
rax < rbx (unsigned) 0 1 - JB (Jump if Below)
rax >= rbx (signed) 0 або 1 - 0 JGE (Jump if Greater Equal)
rax < rbx (signed) - - 1 JL (Jump if Less)

CMP: приклад 1 — рівність

Перевіря чи два числа рівні

mov rax, 10
mov rbx, 10
cmp rax, rbx        ; 10 - 10 = 0, ZF = 1
je equal_label      ; Перейти, бо ZF = 1
mov rcx, 0
jmp done
equal_label:
mov rcx, 1
done:
; rcx = 1 (числа рівні)

CMP: приклад 2 — більше/менше

Порівняння без знаку

mov rax, 50
mov rbx, 30
cmp rax, rbx        ; 50 - 30 = 20 > 0, ZF=0, CF=0
ja greater_label    ; JA (Jump if Above, unsigned)
jmp not_greater
greater_label:
mov rcx, 1          ; rax > rbx
jmp done
not_greater:
mov rcx, 0
done:

Умовні переходи (після CMP)

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

Яка різниця між JA і JG?

  • JA для беззнакових, JG для зі знаком
  • Немає різниці
  • JG швидше
✅ Правильна відповідь: JA для беззнакових, JG для зі знаком
💡 Пояснення:

JA: рай боюн, -1 > 2 якщо беззнакові. JG: звичайна математика, -1 < 2.

Помилка: мішати JA та JG

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

Вибір неправильного флага дає неправильний результат

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

mov rax, -5    ; -5 як беззнакове = 0xFFFFFFFFFFFFFFFB (велике число)
mov rbx, 3
cmp rax, rbx
ja greater     ; ПОМИЛКА: -5 як беззнакове > 3

JA порівнює як беззнакові, тому -5 сприймається як величезне число

✓ Правильно

mov rax, -5
mov rbx, 3
cmp rax, rbx
jl less        ; JL правильно: -5 < 3 (зі знаком)

JL перевіряє SF (знак бітів), дає правильний результат

Програма: максимум двох чисел

CMP + условний перехід

section .data
    a dd 42
    b dd 17

section .text
    global main
main:
    mov rax, [rel a]    ; rax = 42
    mov rbx, [rel b]    ; rbx = 17
    cmp rax, rbx
    jg a_greater        ; a > b?
a_greater:
    ; rax уже максимум
    ret

Три режими порівняння

Підсумки

  • CMP: порівняння без зміни операндів
  • ZF=1: рівність, ZF=0: нерівність
  • JA vs JG: вибір залежить від знаку чисел

Далі — адресація пам'яті: [базис + індекс + зміщення]

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

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

Лекція 8: Адресація пам'яті

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

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

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

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