Эмулятор и ассемблер процессора Subleq
Императивный язык SUBLEQ (SUbtractandBranchifLessthanorEQualtozero) реализует процессор с одной инструкцией OISC (OneInstructionSetComputer на базе которого можно построить компьютер архитектуры URISC (UltimateReducedInstructionSetComputer) Ассемблер и интерпретатор реализован в 2006-2009 году
Язык процессора Subleq содержит одну инструкцию. Любая инструкция состоит из трех операндов: A B C, где каждый операнд это одно слово: subleq a b c
Процессор Subleq в первой части инструкции осуществляет манипуляции с памятью. Он вычитает значение ячейки памяти, хранящейся по адресу A, из содержимого ячейки памяти, хранящейся по адресу B, а затем записывает результат обратно в ячейку с адресом B. Затем процессор выполняет вторую часть инструкции - проверку. Если значение ячейки по адресу B, после вычитание, меньше или равно нулю, то выполняется переход по адресу, заданного операндом C; в противном случае процессор продолжает обработку инструкций следующих за ячейкой операнда С. Смысл работы инструкции Subleq ассоциируется с работой нейрона искусственной нейронной сети “Формируется разночтение, запоминается дельта, проверяется ступенчатой активационной функцией дельта и осуществляется переход по произвольно линии связи”.
Ассемблирование. Ассемблер языка Subleq обрабатывает текстовый файл с расширением sq.
Программирование на языке Subleq арифметических операций
Метка ZR обозначает зарезервированной регистр с нулевым значением; NR обозначает
зарезервированной регистр с отрицательной единицей; TA, TB, TC, являются временным
хранением регистров A, B и C. Команда JMP m: jumptomemorylocation m.
Сложение – ADD
a b c: m(c) = m(a) + m(b):
# Суммадвухчисел C=A+B
subleq a ZR
subleq b ZR # ZR = - a - b
subleq c c # c = 0
subleq ZR c # c = a +b
sublez ZR ZR # ZR = 0
6) Вычитание – SUB a b c: m(c) = m(b) - m(a):
subleq TA TA # TA = 0
subleq TB TB # TB = 0
subleq a TA
subleq b TB
subleq TB TA # TA = b - a
subleq c c
subleq TB TB
subleq TA TB # TB = a - b
subleq TB c # c = b – a.
Деление – DIV a b c: m(c) = m(a) / m(b):
subleq TA
subleq TB
subleq TC
subleq b TA
subleq TA TB # TB = b
subleq TA TA
subleq a TA
subleq TA TC # TC = a
subleq c c
subleq NR c # c++
subleq TC TB ?+2 # b -= a, if b<=0 JMP 2
subleq ZR ZR ?-2 # loop back to c++
Умножение – MUL a b c: m(c) = m(a) * m(b):
subleq TA
subleq TB
subleq TC
subleq b TA
subleq TA TB # TB = b
subleq NR c # c = 1
subleq TA TA
subleq a TA # TA = -a
subleq c c
#sub (-a) from dest and b--, when b<=0 esc
subleq TA c
subleq TC TB +2
subleq ZR ZR -2 # loopback