- PVSM.RU - https://www.pvsm.ru -
Хочу рассказать о процессоре, который я разработал в 2016 году. Он реализован на C как виртуальная машина. Мой друг Бьёрн написал для него ассемблер на F#.
Periwinkle представляет собой процессор OISC [1] (one instruction set computer), в отличие от RISC и CISC. У него нет никакой конвейеризации. По сути, производительность не является главной задачей проекта, он создан скорее для удовольствия и в учебных целях.
Моя подруга Алёна придумала ему название Periwinkle, то есть барвинок (этот удивительно живучий цветок считается символом жизненной силы — прим. пер.)
Есть множество типов инструкций для OISC. Но в Periwinkle это инструкция move. Просто перемещаете литерал [2] в регистр [3] или значение из одного регистра в другой. Логические и арифметические операции, ветвление и т.д. выполняются с помощью регистров.
Длина инструкции Periwinkle стабильно 40 бит. Шина данных 32 бита.
У Periwinkle в общей сложности 64 регистра.
Вот описание некоторых:
Программный счётчик (PC)
Стек общего назначения (STK)
Генератор случайных чисел (RNG)
Skip If Zero (SIZ)
Skip If Non-zero (SINZ)
Reference (REF)
Dereference (DEF)
Зарезервированные регистры (RSV)
Регистры общего назначения (GPR0-GPR31)
Нулевой регистр
Регистр состояния:
Но как работают регистры PLUS, AND, OR, XOR? В этих четырёх регистрах есть своеобразный стек, который является на самом деле вычислительным стеком. Когда в стеке вычислений два числа, операция запускается.
Вот пример для регистра PLUS. Схема работает аналогично для остальных трёх регистров.
Но как производить арифметические действия всего с четырьмя операторами? Как я уже говорил, цель этого проекта — развлечение и образование. Поэтому можете самостоятельно синтезировать недостающие действия.
Вычитание производится путём сложения с дополнительным кодом [4], который представляет отрицательные числа. Дополнительный код образуется инверсией битов, то есть запушив на число 0xFFFFFFFF (2³²-1) через XOR. И прибавив единицу через регистр PLUS. Впрочем, ассемблер поддерживает отрицательные числа, так что не обязательно всё это делать.
Умножение — просто многократное сложение.
Деление — это сколько раз одно число помещается в число. Это можно посчитать через счётчик последовательных вычитаний.
Битовый сдвиг делается умножением на 2 или делением на 2.
Сами подумайте, как синтезировать другие операции.
Если интересно, вот репозиторий github [5] некоторых программ на ассемблере, которые я написал для Periwinkle. Инструкция move работает слева направо:
#50 gpr0 //переместить литерал 50(base-10) в gpr0
gpr0 gpr1 //переместить значение gpr0 в gpr1
Кроме того, попытаюсь выложить исполняемый файл виртуальной машины Periwinkle VM. Для какой платформы делать виртуальную машину? (Windows (x86? x86-64?), Linux (x86? x86-64? ARM?, ARM64? и т.д.?) и т.д.?) Поскольку ассемблер написан на F#, наверное, он может работать везде, нужен только .NET framework [6], можете заглянуть в Mono [7].
Если вы знаете архитектуру PIC16 [8], то могли заметить у Periwinkle некоторое сходство с ней (STATUS, SIZ, SINZ, REF, DEF). Действительно, она вдохновила меня на работу как первая архитектура, с которой я начал программировать на ассемблере.
Автор: m1rko
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/339813
Ссылки в тексте:
[1] OISC: https://en.wikipedia.org/wiki/One_instruction_set_computer
[2] литерал: https://en.wikipedia.org/wiki/Literal_(computer_programming)
[3] регистр: https://en.wikipedia.org/wiki/Processor_register
[4] дополнительным кодом: https://en.wikipedia.org/wiki/Two%27s_complement
[5] репозиторий github: https://github.com/iketsj/Periwinkle-Assembly-Language-Programs
[6] .NET framework: https://en.wikipedia.org/wiki/.NET_Framework
[7] Mono: https://www.mono-project.com/
[8] архитектуру PIC16: https://en.wikipedia.org/wiki/PIC_instruction_listings
[9] Источник: https://habr.com/ru/post/480024/?utm_campaign=480024&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.