Skip to content

Легкий, подобный ассемблеру, интерпритируемый язык, написаный на C++. Может быть использован вместе с C++

Notifications You must be signed in to change notification settings

striter-no/ASMLSL

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ASMLSL1

Assembly Language Like Scripting Language 1 version

Это язык для программирования на псевдо ассемблере и является оберткой над C++. Данный язык был сделан для легкой интеграции интерполируемого языка в часть компилируемого языка (в данном случае - C++)

Язык имеет возможность взаимодействия с хостовым языком посредством переменных. При работе с памятью на языке asmlsl вы работаете с виртульным стеком, который упрощен для удобства. В первой версии asmlsl не может взаимодейтсвовать с файлами или подкоючать другие *.asmlsl файлы, также не может вызывать внешние функции определенные в хостовом языке, но может вводить данные с консоли (только unsigned int) и выводить любые данные через консоль

Как компилировать *.asmlsl код?

./asmlsl example.asmlsl

Как скомпилировать компилятор?

./comp

На данный момент есть всего 38 команд, их можно разделить на нексолько категорий:

  • Регистрация переменных/указателей/массивов и тд
  • Изменение значений переменных/указателей/массивов и тд
  • Работа со стеком, те пуш/поп/пик значений переменных/указателей/массивов (и тд), а также просто чисел
  • Работа с указателями и адресами
  • Переходы на другие блоки кода, а также зацикливание
  • Работа с функциями
  • Выполнение булевых операций
  • Арифметические действия + инкрементация и декреминтация переменных
  • Работа с внешним стеком, те получение и установка значений переменных из вн. стека
  • Отладочные в том числе комментарии

Структура кода:

Каждый *.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 - значит что на вход подается действительно существующая переменная обозначающая индекс в массиве, или число обозначающее индекс в массиве

Описание всех 38 команд:

  • Регистрация
    • 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:
      • вывод дебаг данных (стек и переменные)

About

Легкий, подобный ассемблеру, интерпритируемый язык, написаный на C++. Может быть использован вместе с C++

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published