Это язык для программирования на псевдо ассемблере и является оберткой над C++. Данный язык был сделан для легкой интеграции интерполируемого языка в часть компилируемого языка (в данном случае - C++)
Язык имеет возможность взаимодействия с хостовым языком посредством переменных. При работе с памятью на языке asmlsl вы работаете с виртульным стеком, который упрощен для удобства. В первой версии asmlsl не может взаимодейтсвовать с файлами или подкоючать другие *.asmlsl файлы, также не может вызывать внешние функции определенные в хостовом языке, но может вводить данные с консоли (только unsigned int) и выводить любые данные через консоль
./asmlsl example.asmlsl./comp- Регистрация переменных/указателей/массивов и тд
- Изменение значений переменных/указателей/массивов и тд
- Работа со стеком, те пуш/поп/пик значений переменных/указателей/массивов (и тд), а также просто чисел
- Работа с указателями и адресами
- Переходы на другие блоки кода, а также зацикливание
- Работа с функциями
- Выполнение булевых операций
- Арифметические действия + инкрементация и декреминтация переменных
- Работа с внешним стеком, те получение и установка значений переменных из вн. стека
- Отладочные в том числе комментарии
Каждый *.asmlsl файл должен иметь в себе функцию main:
.main:
@ Код
;
В коде не должно быть пустых строчек с табуляцией или пробелами. При написании всех команд они пишутся внутри блоков кода (вне блоков кода команды не будут считываться), строчки кода могут быть с отсупами любой длинны (именно \t, а не 4 пробела), а могут быть и без отступов. При добавлении функции или цикла, нужно придерживаться следующей структуры:
.function:
@ Код
;
.loop:
@ Код
lpp
;
...
В функциях особых правил нет, а если вы хотите сделать цикл, то структура будет как у функции, но в конце добовляется команда lpp, она переводит интерпретатор на начало блока цикла.
Приставка S у аргумента обозначает что данный аргемент будет изменятся в ходе выполнения программы, а приставка G у аргумента что будет использовано значение аргумента и не будет изменено
Если в аргументе есть:
intэто обозначает что переменная будет типаintindэто обозночает что дальше идет индекс чего-либо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:- вывод дебаг данных (стек и переменные)