This commit is contained in:
roma-dxunvrs
2026-09-14 20:07:06 +03:00
parent a518b98943
commit 00b700a410
7 changed files with 176 additions and 4 deletions
@@ -21,7 +21,7 @@
### 1. Операции над памятью
- `load_imm <val>` - прямая загрузка (5 байт)
- `load <offset>` - относительная загрузка (3 байта)
- `store <offset>` - отночительное сохранение (3 байта)
- `store <offset>` - относительное сохранение (3 байта)
- `load_addr <addr>` - абсолютная загрузка (5 байт)
- `store_addr <addr>` - абсолютное сохранение (5 байт)
- `load_acc` - разыменование указателя из `Acc` (1 байт, загружает значение по адресу из аккумулятора `acc <- mem[acc]`)
@@ -34,4 +34,29 @@
- Адрес `0x80` - входной поток - очередь FIFO. При чтении процессором выдает очередной элемент из тестового массива
- Адрес `0x84` - выходной поток. Принимает 32-битные слова. Запись любого числа отправляет его в выходной поток
## Порядок байтов и адресация
Адресация побайтовая, то есть один адрес - один байт. Например, в 32-битной архитектуре чтение по `0x80` захватывает сразу `0x80, 0x81, 0x82, 0x83`. Порядок - `Little Endian`
Адресация побайтовая, то есть один адрес - один байт. Например, в 32-битной архитектуре чтение по `0x80` захватывает сразу `0x80, 0x81, 0x82, 0x83`. Порядок - `Little Endian`
## Крайние случаи
### Запись во входной порт (0x80)
- `load_imm 42` $\to$ `store_addr 0x80`
- Программа не упала, продолжила работу. Данные исчезли навсегда
- Контроллер порта `0x80` работает только на чтение
### Чтение из выходного порта (0x84)
- Попытались сделать `load_addr 0x84` (или `load_acc` по этому адресу)
- Аварийное завершение `ERROR: input is depleted` по адресу `132` (`0x84`)
- Порт `0x84` — это write-only устройство. У него нет входящей очереди (FIFO), из которой процессор мог бы прочитать байт
### Исполнение кода из порта ввода (JMP 0x80)
- jmp 0x80`
- Аварийное завершение `ERROR: instruction in memory corrupted`
- `PC` выставил адрес `0x80`. Процессор забрал из очереди ввода пользовательский байт (например, букву `'H'` = 72) и попытался декодировать его как машинную команду (Opcode). Команды с таким кодом нет
### Размещение данных прямо в портах (`.org 0x80`)
- Написали `.org 0x80`, положили `.word 42`, а следом секцию `.text` с командой `halt`
- Аварийное завершение при старте: `ERROR: iomemory[132]: instruction corrupted`
- Данные `.word 42` (4 байта) заняли адреса `0x80, 0x81, 0x82, 0x83`.
- Код программы (`halt`) "перелился" в следующую свободную ячейку — `0x84` (132)
- Процессор попытался стартовать с адреса `0x84` (считая его началом `.text`)
- Но `0x84` - это порт только для записи! Процессор не смог прочитать оттуда код и умер при старте
### Несколько `.org`
- Ошибка компилятора `multiple .org directives not allowed`
- В одной секции - один `.org` (один в `.text`, один в `.data`)
### Чтение из пустого ввода
- `ERROR: memory access error: input is depleted`