Простая машина Арена (SMA)
- 64 килобайта ПЗУ которая транслируется в ОЗУ
- 4 16 бит регистра общего назначения (R0, R1, R2, R3)
- 16 бит адресация (регистр IP содержит текущий адрес инструкции)
- До 9 потоков на ядро (флаг CID хранит номер текущего потока)
Для сборки нужен gcc версии 9 и новее.
#!/bin/sh
# Сборка
./build.sh
#!/bin/sh
# Запуск компилятора
./compiler
#!/bin/sh
# Запуск эмулятора
./sma
Пример программы для инициализации второго потока:
ADDN R0 2 ; R0 += 2
MUL R0 R0 ; R0 *= R0
MUL R0 R0 ; R0 *= R0
ADDN R0 9 ; R0 += 9
OUT CID ; Вывести cpu_id
ENA 1 R0 ; Включить ядро 1 и установить адрес из R0
HALT ; Отключаем ядро 0
OUT CID ; Вывести cpu_id
HALT ; Отключаем ядро 1
Список команд ассемблера:
- OUT <регистр> - Вывод значения регистра на экран
- HALT - Остановка процессора
- ENA <номер потока> <регистр> - Включение потока процессора
- INC <регистр> - Инкремент значения регистра
- DEC <регистр> - Декремент значения регистра
- CLR <регистр> - Установка значения регистра в 0
- JMP <адрес> - Переход к указанному адресу
- ADDN <регистр> <число[0:9]> - Прибавление значения к регистру
- ADD <регистр1> <регистр2> - Сложение значений двух регистров
- SUB <регистр1> <регистр2> - Вычитание значения второго регистра из первого
- MUL <регистр1> <регистр2> - Умножение значений двух регистров
- DIV <регистр1> <регистр2> - Деление значения первого регистра на второй
- CMP <регистр1> <регистр2> - Сравнение значений двух регистров
- MOV <регистр1> <регистр2> - Копирование значения одного регистра в другой
Список кодов операций:
P<регистр>
- вывод значения регистра на экранH
- остановка процессораO<номер потока><регистр>
- включение потока процессораI<регистр>
- инкремент значения регистраD<регистр>
- декремент значения регистраN<регистр>
- установка значения регистра в 0J<адрес>
- переход к указанному адресу+<регистр><число[0:9]>
- прибавление значения к региструA<регистр><регистр>
- сложение значений двух регистровS<регистр><регистр>
- вычитание значения второго регистра из первогоM<регистр><регистр>
- умножение значений двух регистровL<регистр><регистр>
- деление значения первого регистра на второйC<регистр><регистр>
- сравнение значений двух регистровR<регистр><регистр>
- копирование значения одного регистра в другой