Программа на языке Техно IL представляет собой последовательность инструкций. Каждая инструкция должна начинаться с новой строки и должна содержать оператор с опциональным модификатором и, для некоторых операций, один или более операндов, разделенных пробелами.
Техно IL поддерживает одноадресный и двухадресный режимы записи инструкций, которые оперируют с двумя операндами. В первом случае первым операндом является аккумулятор, который опускается при записи, во втором случае указываются два операнда.
Под аккумулятором в Техно IL понимается хранилище текущего результата вычислений (в этом качестве выступает один из регистров процессора). Далее в описании языка Техно IL значение аккумулятора обозначается словом result.
Пример. В данном примере представлена запись процедуры a = a + b в одноадресном и двухадресном режиме.
Одноадресный режим:
LD a //result = a
ADD b //result = result + b
ST a //a = result
Двухадресный режим позволяет записать ту же операцию компактнее:
ADD a b // a = a + b
Операторы обмена с аккумулятором
Синтаксис
Модификатор
Действие
LD operand
N
result := operand
ST operand
N
operand := result
В качестве операнда может использоваться численная или булева переменная. В качестве операнда оператора LD может использоваться число. Отличное от нуля значение аккумулятора интерпретируется как TRUE, нулевое – как FALSE, поэтому значение аккумулятора может быть присвоено как численной, так и булевой переменной.
Пример:
VAR VAR_000 : INT := 10; END_VAR
VAR VAR_001 : BOOL := TRUE; END_VAR
VAR VAR_002 : BOOL; END_VAR
LD 8 //result := 8
ST VAR_000 //VAR_000 := 8
ST VAR_002 //VAR_002 := TRUE
LD 0 //result := 0
ST VAR_001 //VAR_001 := FALSE
LD VAR_001 //result := FALSE
ST VAR_002 //VAR_002 := FALSE
ST VAR_000 //VAR_000 := 0
Логические операторы
Синтаксис
Модификатор
Действие
S operand
operand := TRUE (см. примечание)
R operand
operand := FALSE (см. примечание)
AND operand1 operand2
N
result := operand1 := operand1 AND operand2
OR operand1 operand2
N
result := operand1 := operand1 OR operand2
XOR operand1 operand2
N
result := operand1 := operand1 XOR operand2
Примечание. Оператор выполняется только тогда, когда result = TRUE.
В качестве операндов могут использоваться булевы переменные. Вторым операндом может быть число (но не численная переменная), которое интерпретируется следующим образом: не равно 0 – TRUE; равно 0 – FALSE. Выполнение операторов R и S не изменяет значения аккумулятора.
Пример:
VAR VAR_001 : BOOL := TRUE; END_VAR
VAR VAR_002 : BOOL; END_VAR
VAR VAR_004 : INT := 0; END_VAR
LD 1 //result := 1
S VAR_002 //VAR_002 := TRUE
R VAR_002 //VAR_002 := FALSE
AND VAR_001 VAR_002 //result := VAR_001 := FALSE
LD 1 //result := 1
S VAR_001 //VAR_001 := TRUE
OR VAR_002 VAR_001 //result := VAR_002 := TRUE
XOR VAR_002 VAR_001 //result := VAR_002 := FALSE
OR VAR_002 10 //result := VAR_002 := TRUE
Арифметические операторы
Синтаксис
Действие
ADD operand1 operand2
result := operand1 := operand1 + operand2
SUB operand1 operand2
result := operand1 := operand1 – operand2
MUL operand1 operand2
result := operand1 := operand1 * operand2
DIV operand1 operand2
result := operand1 := operand1 : operand2
В качестве операндов используются численные переменные, в качестве второго операнда может использоваться число. Арифметические операторы не допускают использования модификаторов.
Пример:
VAR VAR_000 : REAL := 20; END_VAR
VAR VAR_001 : LREAL := 30; END_VAR
ADD VAR_000 10 //result := VAR_000 := 30
MUL VAR_001 9 //result := VAR_001 := 270
SUB VAR_001 VAR_000 //result := VAR_001 := 240
DIV VAR_001 VAR_000 //result := VAR_001 := 8
Операторы сравнения
Синтаксис
Действие
GT operand1 operand2
result := TRUE, если operand1 > operand2
GE operand1 operand2
result := TRUE, если operand1 >= operand2
EQ operand1 operand2
result := TRUE, если operand1 == operand2
NE operand1 operand2
result := TRUE, если operand1 <> operand2
LE operand1 operand2
result := TRUE, если operand1 <= operand2
LT operand1 operand2
result := TRUE, если operand1 < operand2
В качестве операндов используются численные переменные, в качестве второго операнда может использоваться число. Операторы сравнения не допускают использования модификаторов. Операторы сравнения, как правило, предшествуют операторам JMPC, CALC и RETC. Если результат сравнения ложен, инструкции сравнения не изменяют значения аккумулятора, а последующий оператор JMPC, CALC или RETC игнорируется (даже если result = TRUE).
Операторы перехода выполняются, если строка с указанной меткой находится в том же программном компоненте. В круглых скобках через запятую указываются значения, передаваемые в функцию. Между именем функции и круглыми скобками пробел необязателен. Число передаваемых в функцию значений должно быть равно числу аргументов, заданных для этой функции. При выполнении оператора RET и его разновидностей функция возвращает значение result. Определены следующие модификации данных операторов:
JMP, CAL, RET – соответственно оператор безусловного перехода, безусловного вызова и безусловного выхода.
JMPX, CALX, RETX – соответственно оператор условного перехода, условного вызова и условного выхода. Инструкция, содержащая любой их этих операторов, выполняется только тогда, когда result=TRUE, в противном случае игнорируется.
JMPC, CALC, RETC – соответственно оператор условного перехода, условного вызова и условного выхода. Эти операторы следуют непосредственно за оператором сравнения. Инструкция, содержащая любой их этих операторов, выполняется только тогда, когда результат предыдущей операции сравнения истинен, в противном случае игнорируется.
Модификаторы Техно IL
Модификаторы Техно IL – это литеры N, C и X, которые могут быть приписаны справа к имени ряда операторов. Модификатор N обозначает логическое отрицание операнда. Например, инструкция AND a интерпретируется как result = result AND a, а инструкция ANDN a интерпретируется как result = result AND NOT a. Для операторов JMP, CAL и RET: модификатор C обозначает, что инструкция выполняется в том случае, если результат предыдущей операции сравнения истинен; модификатор X обозначает, что инструкция выполняется в том случае, если result = TRUE.