Спеціалізовані мови програмування
VTFK • 2025
Лекція 7: CMP та прапорці
Фокус: робота з масивами та структурами
Способи визначення, яку адресу в пам'яті використати для операції: безпосередня, регістр, пам'ять з обчисленням адреси.
Аналогія: Як знайти човома на столі: скажи номер, або 'ліворуч від X', або 'X плюс 3 см нижче'
Формула для адреси
| Режим | Синтаксис | Адреса | Приклад |
|---|---|---|---|
| Регістр | rax | значення rax | mov rbx, [rax] |
| Базис + зміщення | [rax + 8] | rax + 8 | mov rcx, [rsp + 16] |
| Індекс масив | [rax + rbx*4] | rax + rbx*4 | mov rdx, [base + i*4] |
| Комплексна | [rax + rbx*8 + 10] | rax + rbx*8 + 10 | структури, масиви |
| RIP-relative | [rel label] | label | mov rax, [rel data] |
Від простих до складних
mov rax, [rbx] ; базис
mov rax, [rbx + 8] ; базис + зміщення
mov rax, [rbx + rcx*4] ; базис + індекс*масштаб
mov rax, [rbx + rcx*4 + 16] ; повна формула
mov rax, [rel data] ; RIP-relative
Читаємо другий елемент массива
section .data
arr dd 10, 20, 30, 40, 50 ; Масив з п'яти чисел
section .text
global main
main:
lea rax, [rel arr] ; rax = адреса масиву
mov rbx, [rax + 4] ; rbx = arr[1] (другой элемент, +4 байты)
mov rcx, [rax + 8] ; rcx = arr[2] (третий, +8 байтів)
ret
mov rbx, [rax] читає пам'ять. mov rbx, rax копіює адресу.
Індекс треба помножити на розмір елементу
mov rax, [base + i] ; ПОМИЛКА: i должен быть *4 для int
; правильно: [base + i*4]
Без масштабу отримаємо неправильну адресу
mov rax, [base + i*4] ; base + i*4 для массива int
mov rax, [base + i*8] ; base + i*8 для массива long
Масштаб залежить від типу елементу
Далі — Rust: переходимо від низькорівневого до безпечного
Лекція 9: Вступ до Rust
Дякую за увагу! 💾