Simple Robots Language

Программа на SRL состоит из нескольких частей, которые можно перемешивать, как душе угодно

Пример программы

include header.inc                      ; вложить файл header.inc

const   константа = значение            ; константа
fix     engine [0x10000]                ; "обозвать" ячейку памяти именем

метка:
        команды

еще_метка:                              ; комментарий
        еще_команды

var     переменная
var     переменная = начальное_значение

data_label:                             ; чтобы обратиться к этим данным
data:   1, 2, 3, 4, 5, 6, 7             ; поместить в программу 7 чисел
data    10                              ; поместить в программу 10 нулей

end

Структура программы

Программа разделяется на блоки автоматически (описание блоков см. в тексте "Процессы"). Но все же иногда полезно разбить один блок на несколько принудительно. Я точно не знаю, когда это может понадобиться, но команду такую я ввел:

        ---

Она принудительно разрежет блок на два. Но учтите, что два идущих подряд в исходнике блока, необязательно будут идти подряд в откомпилированном файле. То есть, применяйте разрыв блока, только если точно знаете, зачем это надо.

Теперь собственно инструкции. Я буду их писать в таком виде:

        mov     ident, exp

mov - это команда, ident - идентификатор или любое другое адресное выражение, exp - выражение.

Возможные типы ident:

переменнаяадрес переменной
меткаадрес метки
[exp]адресное выражение
ident expлюбой другой адрес + выражение

Возможные типы exp:

число12345 (десятичное) или 0x12345 (16-ричное)
константаобъявление const
любая их комбинация5 + (some_const / 2) & 4

Например:

        mov     some_var - 10, 5 + (some_const & 4)

Приоритеты операций:

~унарный-унарный+
*/
+-
&
|

Инструкции процессора

ИнструкцияКомментарий
stopсм. Process - переход на run
resetсброс процессора и переход на init
mov ident, expпересылка константа -> память
mov ident1, ident2пересылка память2 -> память1
mov ident1, [ident2]пересылка в память1 того, что лежит в памяти по адресу, записанного в ячейке память2 (в том числе допустимы выражения mov some_var, [[0x1000]])
mov [ident1], ident2в другую сторону
mov ident1, @ident2записать в ident1 адрес ячейки ident2
call identвызов подпрограммы
abortпереход на fail
nopпустая команда
add ident, expсложение
add ident, ident-//-
sub ident, expвычитание
sub ident, ident-//-
mul ident, expумножение
mul ident, ident-//-
div ident, expделение
div ident, ident-//-
mod ident, expостаток от деления
mod ident, ident-//-
inc identувеличить ident на 1
dec identуменьшить на 1
loop ident1, ident2уменьшить ident1, и если оно стало 0, то перейти на ident2
xor ident, expисключающее или
xor ident, ident-//-
and ident, expи
and ident, ident-//-
or ident, expили
or ident, ident-//-
ind identзаписать в ident то, что сейчас находится в ячейке по адресу ident
not identинвертировать все биты
clr identзаписать 0 в переменную
set identзаписать 1 во все биты переменной
cmp ident, expсравнить вычитанием
cmp ident, ident-//-
test ident, expсравнить логическим умножением
test ident, ident-//-
jmp identбезусловный переход
retвозврат из подпрограммы
jz identпереход, если 0
jnz identпереход, если не 0
jc identпереход, если перенос
jnc identпереход, если нет переноса
push identположить в стек переменную
push expположить в стек число
pop identвытащить из стека число и положить в переменную
pop expвытащить из стека exp чисел
jmp [ident]косвенный переход
call [ident]косвенный вызов подпрограммы
debug expвызвать debug-процедуру* с кодом exp
debug identвызвать debug-процедуру* с кодом ident

* Сейчас debug-процедура при коде 0 извергает неприятный звук из звуковой платы.



Вернуться на страницу проекта


Вернуться на главную страницу

100% MS Free Rambler's Top100 Мониторинг сервера осуществляется системой UpTime.Ru
Best viewed with Lynx