Skip to content

Реалізація директив визначення даних #3

@indrekis

Description

@indrekis

На жаль, db i dw зараз функціонують неочікувано. Їх роль -- створити змінну/порцію даних.

  1. Поточну db/dw перейменуйте в EQU (EQUB/EQUW, заради простоти). (Конкретну назву можна обговорювати, але "name equ val" багато в яких асемблерах використовується).
  2. Директива db створює чергову змінну в сегменті даних, розміром -- байт. Ім'я змінної -- адреса її початку.
  3. Аналогічно, dw -- створює двобайтову змінну, розмір як у машинного слова наших ISA.
  4. Адреса сегменту даних задається аналогічно до "initial IP" (формально можна розділяти сегмент коду і entry point, але немає поки сенсу) -- "Data segment origin/Data segment base" абощо (краще лаконічніше, звичайно). По замовчуванню -- 0. Додати це і до Web-інтерфейсу.
  5. Приклад (назвемо початок сегменту даних 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.

Це менш-більш відтворює поведінку класичних асемблерів.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions