/sma

Primary LanguageCGNU General Public License v3.0GPL-3.0

sma

Простая машина Арена (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<регистр> - установка значения регистра в 0
  • J<адрес> - переход к указанному адресу
  • +<регистр><число[0:9]> - прибавление значения к регистру
  • A<регистр><регистр> - сложение значений двух регистров
  • S<регистр><регистр> - вычитание значения второго регистра из первого
  • M<регистр><регистр> - умножение значений двух регистров
  • L<регистр><регистр> - деление значения первого регистра на второй
  • C<регистр><регистр> - сравнение значений двух регистров
  • R<регистр><регистр> - копирование значения одного регистра в другой