Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/striter-no/asmlsl

Легкий, подобный ассемблеру, интерпритируемый язык, написаный на C++. Может быть использован вместе с C++
https://github.com/striter-no/asmlsl

cpp interpreter newlanguage

Last synced: 4 days ago
JSON representation

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

Awesome Lists containing this project

README

        

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

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

### Как компилировать *.asmlsl код?
```bash
./asmlsl example.asmlsl
```
### Как скомпилировать компилятор?
```bash
./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`:
- вывод дебаг данных (стек и переменные)