Это язык для программирования на псевдо ассемблере и является оберткой над C++. Данный язык был сделан для легкой интеграции интерполируемого языка в часть компилируемого языка (в данном случае - C++)
Язык имеет возможность взаимодействия с хостовым языком посредством переменных. При работе с памятью на языке asmlsl вы работаете с виртульным стеком, который упрощен для удобства. В первой версии asmlsl не может взаимодейтсвовать с файлами или подкоючать другие *.asmlsl файлы, также не может вызывать внешние функции определенные в хостовом языке, но может вводить данные с консоли (только unsigned int) и выводить любые данные через консоль
./asmlsl example.asmlsl
./comp
- Регистрация переменных/указателей/массивов и тд
- Изменение значений переменных/указателей/массивов и тд
- Работа со стеком, те пуш/поп/пик значений переменных/указателей/массивов (и тд), а также просто чисел
- Работа с указателями и адресами
- Переходы на другие блоки кода, а также зацикливание
- Работа с функциями
- Выполнение булевых операций
- Арифметические действия + инкрементация и декреминтация переменных
- Работа с внешним стеком, те получение и установка значений переменных из вн. стека
- Отладочные в том числе комментарии
Каждый *.asmlsl файл должен иметь в себе функцию main
:
.main:
@ Код
;
В коде не должно быть пустых строчек с табуляцией или пробелами. При написании всех команд они пишутся внутри блоков кода (вне блоков кода команды не будут считываться), строчки кода могут быть с отсупами любой длинны (именно \t
, а не 4 пробела), а могут быть и без отступов. При добавлении функции или цикла, нужно придерживаться следующей структуры:
.function:
@ Код
;
.loop:
@ Код
lpp
;
...
В функциях особых правил нет, а если вы хотите сделать цикл, то структура будет как у функции, но в конце добовляется команда lpp
, она переводит интерпретатор на начало блока цикла.
Приставка S
у аргумента обозначает что данный аргемент будет изменятся в ходе выполнения программы, а приставка G
у аргумента что будет использовано значение аргумента и не будет изменено
Если в аргументе есть:
int
это обозначает что переменная будет типаint
ind
это обозночает что дальше идет индекс чего-либоaddr
это адресс в стекеst
это статическая переменная()
те если он в скобках, значит он не обязателен
Если говорится слово поп
- это значит что вместо него надо подставить последний элемент стека, а после этого удалить его.
Если говорится слово пуш
- это значит какое-то значение будет добавлено в конец стека.
Если говорится слово пик
- это значит что вместо него надо подставить последний элемент стека, но не удалять его.
Описание команды mov svar gvar/gint ...
:
mov
- названиеsvar
- значит что на вход подается действительно существующая переменнаяgvar/gint
- значит что на вход подается переменная или целочисленное число (unsigned int
)...
- значит что на вход может подоваться бесчисленное кол-во повтор. аргументов
reg gname
:
reg
- названиеgname
- значит что на вход подается имя не существующей переменной
set svar gvarind/gind
:
set
- названиеsvar
- значит что на вход подается действительно существующая переменнаяgvarind/gind
- значит что на вход подается действительно существующая переменная обозначающая индекс в массиве, или число обозначающее индекс в массиве
- Регистрация
reg gname
:- регистрация переменной
tmp gname
:- регистрация временной переменной, при создании в значение записывается поп
stv gname
:- регистрация статической переменной (не удаляется при выходе из стека)
ptr gname
:- регистрация указателя. Указатели в asmlsl могут указывать только на элементы стека, не переменные
arr gname
:- регистрирует массив
- Изменение
mov svar gvar/gint
:- установка значения в переменную
set svar gvarind/gind
:- установка значения на индексе в массиве на значение
get gvar gvarind/int
:- пуш конкретного элемента из массива
sget gstvar
:- пуш статического элемента
sset sstvar gvar/gint ...
:- установка статической переменной
- Работа со стеком
psh gvar/gint
:- пуш значения переменной / числа
pop (gvar)
:- поп из стека, или поп в переменную
pek gvar
:- пик значения в переменную
- Работа с указателями и адресами
pget gname
:- пуш значения переменной за указателем
pset sname ...
:- переопределение переменной за указателем
paddr gname
:- пуш последнего адреса за указателем
addr
:- пуш адреса стека
dref gint/gaddr
:- пуш значения по адресу
- Переходы
lpp
:- переход в начало блока кода
jmp gname
:- переход в ключ. точку
jbp gname
:- переход в ключ. точку если попстек переменная равна 1/true
jnb gname
:- переход в ключ. точку если попстек переменная равна 0/false
- Работа с функциями
fpush sname gvar/gint ...
:- добовляет во временный стек значение. После jmp/jbp/jnb стек переносится в область функции
brk
:- выход из блока кода
ret gvar
:- brk + push
- Выполнение булевых операций
exc goper
:- выполнение булевой операции и пуш результата в стек (a > b, a < b, ...)
exc goper &
:- exc + при верном равенстве, выполняется следующая строчка, иначе пропускается
- Арифметические действия
sum gavar gbvar/gint
:- пуш суммы переменных a и b/числа
sub gavar gbvar/gint
:- пуш разности переменных a и b/числа
div gavar gbvar/gint
:- пуш частного переменных a и b/числа
mlt gavar gbvar/gint
:- пуш произведения переменных a и b/числа
pwr gavar gbvar/gint
:- пуш a в степени b/числа
inc svar ...
:- инкрементация переменной (+1)
dcr svar ...
:- дикрементация переменной (-1)
- Работа с внешним стеком
gip svara gvarb ...
:- копирование данных из глобального стека в переменную (лок.переменная, глоб.переменная)
got svara gvarb ...
:- копирование данных в глобальный стек из переменной
- Отладочные
inp svar ...
:- ввод данных в переменную через консоль
out gvar ...
:- вывод данных переменной через консоль
@
:- комментарий, ставится в начале строки
check
:- вывод дебаг данных (стек и переменные)