Спеціалізовані мови програмування
VTFK • 2025
Лекція 6: Арифметичні інструкції
Фокус: умовна логіка в Assembly
Порівняння: обчислює (rax - rbx), встановлює прапорці, але не зберігає результат. Як SUB, але без зміни операндів.
Аналогія: Як шкала для вимірювання: знаємо результат, але не змінюємо предмет
Таблиця результатів
| Умова | 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) |
Перевіря чи два числа рівні
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 (числа рівні)
Порівняння без знаку
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:
JA: рай боюн, -1 > 2 якщо беззнакові. JG: звичайна математика, -1 < 2.
Вибір неправильного флага дає неправильний результат
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
Далі — адресація пам'яті: [базис + індекс + зміщення]
Лекція 8: Адресація пам'яті
Дякую за увагу! 💾