Выражения

Компилятор позволяет использовать в программе выражения, которые могут состоять операндов, знаков операций и функций. Все выражения являются 32-битными.

· Операнды

В выражениях могут быть использованы следующие операнды:

· Метки, определённые пользователем (дают значение своего положения).

· Переменные, определённые директивой SET.

· Константы, определённые директивой EQU.

· Числа заданные в формате:
Десятичном (принят по умолчанию): 10, 255.
Шестнадцатеричном (два варианта записи): 0x0a, $0a, 0xff, $ff.
Двоичном: 0b00001010, 0b11111111.
Восьмеричном (начинаются с нуля): 010, 077.

· PC - текущее значение программного счётчика (Program Counter).

· Операторы

Компилятор поддерживает ряд операторов, которые перечислены в таблице (чем выше положение в таблице, тем выше приоритет оператора). Выражения могут заключаться в круглые скобки, такие выражения вычисляются перед выражениями за скобками.

Приор. Символ Описание Пример
! Логическое отрицание. Возвращает 1, если выражение равно 0, и наоборот. ldi r16, !0xf0 ; В r16 загрузить 0x00
~ Побитное отрицание. Возвращает результат, в котором все биты проинвертированы. ldi r16, ~0xf0 ;В r16 загрузить 0x0f
- Минус. Возвращает арифметическое отрицание выражения. ldi r16,-2 ;Загрузить –2 (0xfe) в r16
* Умножение. Возвращает результат умножения двух выражений. ldi r30, label*2
/ Деление. Возвращает целую часть результата деления левого выражения на правое. ldi r30, label/2
+ Суммирование. Возвращает сумму двух выражений. ldi r30, c1+c2
- Вычитание. Возвращает результат вычитания правого выражения из левого. ldi r17, c1-c2
<< Сдвиг влево. Возвращает левое выражение сдвинутое влево на число бит, указанное справа. ldi r17, 1<<bitmask ; В r17 загрузить 1, сдвинутую влево на bitmask
>> Сдвиг вправо. Возвращает левое выражение сдвинутое вправо на число бит указанное справа. ldi r17, c1>>c2 ; В r17 загрузить c1, сдвинутое вправо c2 раз
< Меньше чем. Возвращает 1 если левое выражение меньше чем правое (учитывается знак), и 0 в противном случае. ori r18, bitmask*(c1<c2)+1
<= Меньше или равно. Возвращает 1 если левое выражение меньше или равно чем правое (учитывается знак), и 0 в противном случае. ori r18, bitmask*(c1<=c2)+1
> Больше чем. Возвращает 1 если левое выражение больше чем правое (учитывается знак), и 0 в противном случае. ori r18, bitmask*(c1>c2)+1
>= Больше или равно. Возвращает 1 если левое выражение больше или равно чем правое (учитывается знак), и 0 в противном случае. ori r18, bitmask*(c1>=c2)+1
== Равно. Возвращает 1 если левое выражение равно правому (учитывается знак), и 0 в противном случае. andi r19, bitmask*(c1==c2)+1
!= Не равно. Возвращает 1 если левое выражение не равно правому (учитывается знак), и 0 в противном случае. .SET flag = (c1!=c2)═ ;Установить flag равным 1 или 0
& Побитное И. Возвращает результат побитового И выражений. ldi r18, High(c1&c2)
^ Побитное исключающее ИЛИ. Возвращает результат побитового исключающего ИЛИ выражений. ldi r18, Low(c1^c2)
| Побитное ИЛИ. Возвращает результат побитового ИЛИ выражении. ldi r18, Low(c1|c2)
&& Логическое И. Возвращает 1, если оба выражения не равны нулю, и 0 в противном случае. ldi r18, Low(c1&&c2)
|| Логическое ИЛИ. Возвращает 1, если хотя бы одно выражение не равно нулю, и 0 в противном случае. ldi r18, Low(c1||c2)

· Функции

Определены следующие функции:

· LOW(выражение) возвращает младший байт выражения.

· HIGH(выражение) возвращает второй байт выражения.

· BYTE2(выражение) то же что и функция HIGH.

· BYTE3(выражение) возвращает третий байт выражения.

· BYTE4(выражение) возвращает четвёртый байт выражения.

· LWRD(выражение) возвращает биты 0-15 выражения.

· HWRD(выражение) возвращает биты 16-31 выражения.

· PAGE(выражение) возвращает биты 16-21 выражения.

· EXP2(выражение) возвращает 2 в степени (выражение).

· LOG2(выражение) возвращает целую часть log2(выражение).