-
Notifications
You must be signed in to change notification settings - Fork 5
Description
На жаль, db i dw зараз функціонують неочікувано. Їх роль -- створити змінну/порцію даних.
- Поточну db/dw перейменуйте в EQU (EQUB/EQUW, заради простоти). (Конкретну назву можна обговорювати, але "name equ val" багато в яких асемблерах використовується).
- Директива db створює чергову змінну в сегменті даних, розміром -- байт. Ім'я змінної -- адреса її початку.
- Аналогічно, dw -- створює двобайтову змінну, розмір як у машинного слова наших ISA.
- Адреса сегменту даних задається аналогічно до "initial IP" (формально можна розділяти сегмент коду і entry point, але немає поки сенсу) -- "Data segment origin/Data segment base" абощо (краще лаконічніше, звичайно). По замовчуванню -- 0. Додати це і до Web-інтерфейсу.
- Приклад (назвемо початок сегменту даних DataSegBase):
.a db 5
.b db 7
.c db 10, 11, 12, 13
.d db "abcd"
Тоді .a == DataSegBase + 0; .b = DataSegBase+1, .c = DataSegBase+2, .d = DataSegBase + 6 тощо.
6. Для завантаження за цією адресою, якщо такий режим підтримується, бажано якось так могти використати:
mov %R00, [.b] # R00 == 7
mov %R00, [.c] # R00 == 10
mov %R00, [.c+2] # R00 == 12
7. Для звертання до самої адреси потрібні якісь додаткові директиви, наприклад такі (але пропонуйте свій варіант!):
mov_low %R03, lo.a # В R03 -- молодший байт адреси змінної .a
mov_high %R03, hi.a # Довантажуємо старший байт, R03 тепер рівний адресі .a
8. Аналогічно, для dw.
A. Корисною також може бути директива org XX. Нехай DataSegBase == 0:
.a db 10
.b dx 11
org 100 # hex
.c db 12
.d db 13
То .c == 100, .d == 101.
Це менш-більш відтворює поведінку класичних асемблерів.