Окончание табл. 5
1 |
2 |
3 |
4 |
5 |
6 |
|
|
|
|
|
|
|
|
CLV |
Нет |
Очистить флаг переполнения |
V = 0 |
V |
1 |
|
|
|
|
|
|
|
|
SET |
Нет |
Установить флаг T |
T = 1 |
T |
1 |
|
|
|
|
|
|
|
|
CLT |
Нет |
Очистить флаг T |
T = 0 |
T |
1 |
|
|
|
|
|
|
|
|
SEH |
Нет |
Установить флаг внутреннего |
H = 1 |
H |
1 |
|
переноса |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
|
CLH |
Нет |
Очистить флаг внутреннего |
H = 0 |
H |
1 |
|
переноса |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
|
NOP |
Нет |
Нет операции |
Нет |
Нет |
1 |
|
|
|
|
|
|
|
|
SLEEP |
Нет |
Спать (уменьшить |
Смотрите описание |
Нет |
1 |
|
энергопотребление) |
инструкции |
|||||
|
|
|
|
|||
|
|
|
|
|
|
|
WDR |
Нет |
Сброс сторожевого таймера |
Смотрите описание |
Нет |
1 |
|
инструкции |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
Обозначения в табл. 2 – 5:
Rd, Rr – регистры в регистровом файле;
K6 – константа (6 бит), может быть константное выражение; K8 – константа (8 бит), может быть константное выражение;
k – константа (размер зависит от инструкции), может быть константное выражение;
q – константа (6 бит), может быть константное выражение;
Rdh:Rdl – регистровые пары (R25:R24, R27:R26, R29:R28, R31:R30) в
инструкциях ADIW и SBIW;
X, Y, Z – регистры косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30).
2.2. Выражения
Компилятор позволяет использовать в программе выражения, которые могут состоять из операндов, операторов и функций. Все выражения являются 32-битными в AVRASM и 64-битными в AVRASM2.
2.2.1. Операнды
Могут быть использованы следующие операнды:
Метки, определённые пользователем (дают значение своего положения).
Переменные, определённые директивой SET.
Константы, определённые директивой EQU.
Числа, заданные в формате:
o десятичном (принят по умолчанию): 10, 255;
o шестнадцатеричном (два варианта записи): 0x0a, $0a, 0xff, $ff;
15
o двоичном: 0b00001010, 0b11111111;
o восьмеричном (начинаются с нуля): 010, 077.
Константы с плавающей точкой.
PC – текущее значение программного счётчика (PC – Programm
Counter).
Препроцессор AVRASM2 распознает все форматы целых чисел, в том числе $abcd и 0b011001 признаются препроцессором и могут быть использованы в выражениях в директивах #if.
2.2.2. Операторы
Ассемблер поддерживает ряд операторов, которые перечислены в табл. 6 (чем выше положение в таблице, тем выше приоритет оператора). Выражения могут заключаться в круглые скобки, такие выражения вычисляются перед выражениями за скобками.
|
|
Операторы |
Таблица 6 |
|
|
|
|
|
|
Прио- |
Сим- |
Описание |
Пример |
|
ритет |
вол |
|
||
|
|
|
||
|
|
|
|
|
1 |
2 |
3 |
4 |
|
|
|
|
|
|
14 |
! |
Логическое отрицание возвращает 1, если |
ldi r16, !0xf0 |
|
выражение равно 0, и наоборот |
; В r16 загрузить 0x00 |
|
||
|
|
|
|
|
14 |
~ |
Побитное отрицание возвращает выражение, в |
ldi r16, ~0xf0 |
|
котором все биты проинвертированы |
; В r16 загрузить 0x0f |
|
||
|
|
|
|
|
14 |
- |
Минус возвращает арифметическое отрицание |
ldi r16,-2 |
|
выражения (унитарный минус) |
; Загрузить -2 (0xfe) в r16 |
|
||
|
|
|
|
|
13 |
* |
Умножение возвращает результат умножения |
ldi r30, label*2 |
|
двух выражений |
|
|||
|
|
|
|
|
13 |
/ |
Деление возвращает целую часть результата |
ldi r30, label/2 |
|
деления левого выражения на правое |
|
|||
|
|
|
|
|
13 |
% |
Деление по модулю |
ldi r30,label%2 |
|
; label делится по модулю 2 |
|
|||
|
|
|
|
|
|
|
|
|
|
12 |
+ |
Суммирование возвращает сумму двух |
ldi r30, c1+c2 |
|
выражений |
|
|||
|
|
|
|
|
12 |
- |
Вычитание возвращает результат вычитания |
ldi r17, c1-c2 |
|
правого выражения из левого |
|
|||
|
|
|
|
|
11 |
<< |
Сдвиг влево возвращает левое выражение, |
ldi r17, 1<<bit |
|
сдвинутое влево на число бит, указанное |
; В r17 загрузить 1, |
|
||
|
|
справа |
сдвинутую влево bit раз |
|
|
|
|
|
|
11 |
>> |
Сдвиг вправо возвращает левое выражение, |
ldi r17, c1>>c2 |
|
сдвинутое вправо на число бит, указанное |
;В r17 загрузить c1, |
|
||
|
|
справа |
сдвинутое вправо c2 раз |
|
|
|
|
|
|
16
Окончание табл. 6
1 |
2 |
3 |
4 |
Меньше чем возвращает 1, если левое
10< выражение меньше, чем правое (учитывается ori r18, bitmask*(c1<c2)+1 знак), и 0 в противном случае
10 |
<= |
Меньше или равно: возвращает 1, если левое |
ori r18, bitmask*(c1<=c2)+1 |
выражение равно или меньше, чем правое, |
|||
|
|
(учитывается знак), и 0 в противном случае |
|
|
|
|
|
10 |
> |
Больше чем возвращает 1, если левое |
ori r18, bitmask*(c1>c2)+1 |
выражение больше, чем правое (учитывается |
|||
|
|
знак), и 0 в противном случае |
|
|
|
|
|
10 |
>= |
Больше или равно возвращает 1, если левое |
ori r18, bitmask*(c1>=c2)+1 |
выражение равно или больше, чем правое |
|||
|
|
(учитывается знак), и 0 в противном случае |
|
|
|
|
|
9 |
== |
Равно возвращает 1, если левое выражение |
andi r19, bitmask*(c1==c2)+1 |
равно правому (учитывается знак), и 0 в |
|||
|
|
противном случае |
|
|
|
|
|
|
|
Не равно возвращает 1, если левое |
SET flag = (c1!=c2) |
9 |
!= |
выражение не равно правому (учитывается |
;Установить flag равным 1 или |
|
|
знак), и 0 в противном случае |
0 |
|
|
|
|
8 |
& |
Побитное И возвращает результат |
ldi r18, High(c1&c2) |
побитового И выражений |
|||
|
|
|
|
7 |
^ |
Побитное исключающее ИЛИ возвращает |
ldi r18, Low(c1^c2) |
результат побитового исключающего ИЛИ |
|||
|
|
выражений |
|
|
|
|
|
6 |
| |
Побитное ИЛИ возвращает результат |
ldi r18, Low(c1|c2) |
|
|
побитового ИЛИ выражений |
|
|
|
|
|
|
|
Логическое И возвращает 1, если оба |
|
5 |
&& |
выражения не равны нулю, и 0 в противном |
ldi r18, Low(c1&&c2) |
|
|
случае |
|
|
|
|
|
4 |
|| |
Логическое ИЛИ возвращает 1, если хотя бы |
ldi r18, Low(c1||c2) |
одно выражение не равно нулю, и 0 в |
|||
|
|
противном случае |
|
|
|
|
|
3 |
? |
Условный оператор |
ldi r18, > b? a : b |
Синтаксис: |
; Загрузка в r18 большего |
||
|
|
Условие ? выражение1 : выражение 2 |
числа из двух чисел a и b |
2.2.3.Функции
ВАссемблере определены следующие функции:
LOW(выражение) |
– возвращает младший байт выражения; |
HIGH(выражение) |
– возвращает второй байт выражения; |
BYTE2(выражение) |
– то же, что и функция HIGH; |
BYTE3(выражение) |
– возвращает третий байт выражения; |
17
BYTE4(выражение) |
– возвращает четвёртый байт выражения; |
|
LWRD(выражение) |
– возвращает биты 0-15 выражения; |
|
HWRD(выражение) |
– возвращает биты 16-31 выражения; |
|
PAGE(выражение) |
– возвращает биты 16-21 выражения; |
|
EXP2(выражение) |
– возвращает 2 в степени (выражение); |
|
LOG2(выражение) |
– возвращает целую часть log2(выражение). |
|
Следующие функции определены только в AVRASM2: |
||
INT (выражение) |
– преобразовывает выражение с плавающей точкой в |
|
|
целое (т.е. отбрасывает дробную часть); |
|
FRAC(выражение) – выделяет дробную часть выражения с плавающей |
||
|
точкой (т.е. отбрасывает целую часть); |
|
Q7(выражение) |
– преобразовывает выражение с плавающей точкой в |
|
|
форму пригодную для инструкций FMUL/ |
|
|
FMULS/FMULSU (знак + 7-битовая дробная часть); |
|
Q15(выражение) |
– преобразовывает выражение с плавающей точкой в |
|
|
форму пригодную для инструкций FMUL/ |
|
|
FMULS/FMULSU (знак + 15-битовая дробная |
|
|
часть); |
|
ABS( ) |
– возвращает бсолютную |
величину постоянного |
|
выражения; |
|
DEFINED(символ) |
– возвращает «истина», если символ прежде определен |
|
|
директивами .equ, .set или .def. Обычно |
|
|
используется вместе с директивами if (.if |
|
|
defined(foo)), но может быть использовано в любом |
|
|
контексте. В отличие от других функций |
|
|
DEFINED(символ) требует наличия круглых скобок |
|
|
вокруг своего аргумента. |
|
Ассемблер AVRASM2 различает регистр |
символов (AVRASM не |
|
различает). |
|
|
3. ДИРЕКТИВЫ
Компилятор поддерживает ряд директив. Директивы не транслируются непосредственно в код. Они обрабатываются препроцессором и используются для указания положения в программной памяти, определения макросов, инициализации памяти и т.д.
3.1. Директивы AVRASM
Список директив AVRASM приведён в табл. 7. Директивы AVRASM и AVRASM2 версии 2.1.9 предваряются точкой. Директивы AVRASM2 версии ниже 2.1.9 предваряются #.
18
Таблица 7
|
Директивы AVRASM |
|||
Директива |
|
Описание |
|
|
|
|
|||
.BYTE |
Зарезервировать байты в ОЗУ |
|
||
|
|
|
|
|
.CSEG |
Программный сегмент |
|
|
|
|
|
|||
.CSEGSIZE |
Определяет размер памяти программ |
|
||
|
|
|||
.DB |
Определить байты во FLASH или EEPROM |
|
||
|
|
|||
.DEF |
Назначить регистру символическое имя |
|
||
|
|
|
|
|
.DEVICE |
Определить |
устройство, |
для которого компилируется |
|
программа |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.DSEG |
Сегмент данных |
|
|
|
|
|
|||
.DW |
Определить слова во FLASH или EEPROM |
|
||
|
|
|
|
|
.ENDM, |
Конец макроса |
|
|
|
.ENDMACRO |
|
|
||
|
|
|
|
|
|
|
|||
.EQU |
Установить постоянное выражение |
|
||
|
|
|
|
|
.ESEG |
Сегмент EEPROM |
|
|
|
|
|
|
|
|
.EXIT |
Выйти из файла |
|
|
|
|
|
|
|
|
.INCLUDE |
Вложить другой файл |
|
|
|
|
|
|||
.LIST |
Включить генерацию листинга |
|
||
|
|
|||
.LISTMAC |
Включить разворачивание макросов в листинге |
|
||
|
|
|
|
|
.MACRO |
Начало макроса |
|
|
|
|
|
|||
.NOLIST |
Выключить генерацию листинга |
|
||
|
|
|||
.ORG |
Установить положение в сегменте |
|
||
|
|
|
|
|
.SET |
Установить |
переменный |
символический эквивалент |
|
выражения |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ниже приводится подробное описание директив.
.BYTE зарезервировать байты в ОЗУ
Директива BYTE резервирует байты в ОЗУ. Если вы хотите иметь возможность ссылаться на выделенную область памяти, то директива BYTE должна быть предварена меткой. Директива принимает один обязательный параметр, который указывает количество выделяемых байт. Эта директива может использоваться только в сегменте данных (смотреть директивы CSEG и DSEG). Выделенные байты не инициализируются.
Синтаксис:
МЕТКА: .BYTE выражение
Пример: |
|
|
.DSEG |
|
|
var1: |
.BYTE 1 |
; Резервирует 1 байт для var1. |
table: |
.BYTE tab_size |
; Резервирует tab_size байт. |
.CSEG |
|
|
19