Исходный текст программы на языке ассемблера может быть создан в любом текстовом редакторе и должен быть размещен в файлах с расширениями .asm, .inc или .txt. Удобнее всего для этих целей использовать встроенный в AVR Studio редактор.
Алфавит ассемблера состоит из набора символов ACSII. Однако в комментариях к программам допускается использовать любой удобный язык, основанный на наборе символов в кодировке UNICODE. Изначально ассемблер не чувствителен к регистру символов. Так, например, между тремя именами переменной TEMP, temp, Temp нет ни какой разницы.
Ассемблер может работать с числами, представленными в одной из четырех системах исчисления:
- десятичной (примеры чисел: 10, 255),
- шеснадцатиричной (примеры чисел: 0x0A, $FF),
- двоичной (примеры чисел: 0b00001010, 0b11111111),
- восмиричной (примеры чисел: 012, 0377).
По умолчанию применяется десятичная система, и любое число без префикса будет воспринято именно как десятичное. Необходимо обратить внимание также на то, что ассемблер AVR не поддерживает распространенную форму записи 16-тиричных чисел c постфиксом “H” (1AH, 0FFH).
В табл.1 приведен список операторов, доступных для использования в числовых выражениях. Операторы расположены в порядке убывания приоритета. Как и всегда, очередность следования арифметических и логических операций можно изменять, применяя круглые скобки.
Табл 1. Арифметические и логические операторы, использующие в числовых выражениях:
Обозначение оператора |
Описание |
Пример использования |
- |
Унарный оператор. Изменяет знак числа, используя дополнительный код. |
ldi R16,-3 R16 <- 0xFD |
* |
Бинарный оператор. Производит умножение двух чисел. |
ldi R16,x1 * x2 ;R16 <- x1*x2 |
/ |
Бинарный оператор. Производит деление двух чисел. |
ldi R16,x1 / x2 ;R16 <- x1/x2 |
% |
Бинарный оператор. Возвращает целочисленный остаток от деления двух чисел. |
ldi R16,x1 % x2 ;R16 <- {x1/x2} |
! |
Унарный оператор сравнения. Возвращает 1 если число было равно нулю и 0 если число не было равно нулю. |
ldi R16,!x R16 <- 1 если x = 0
;R16 <- 0 если x ≠ 0 |
~ |
Унарный оператор. Производит инвертирование всех битов в числе. |
ldi R16,~0xF0 R16 <- 0x0F |
+ |
Бинарный оператор. Производит сложение двух чисел. |
ldi R16,x1 + x2 ;R16 <- x1 + x2 |
- |
Бинарный оператор. Производит вычитание двух чисел. |
ldi R16,x1 - x2 ;R16 <- x1 - x2 |
<< |
Бинарный оператор. Производит сдвиг выражения стоящего слева от оператора на число разрядов, стоящих справа от оператора. Сдвиг происходит в левую сторону. |
ldi R16,1<<5 R16 <- 0b00100000 |
>> |
Бинарный оператор. Производит сдвиг выражения стоящего слева от оператора на число разрядов, стоящих справа от оператора. Сдвиг происходит в правую сторону. |
ldi R16,0x50>>4 ;R16 <- 0b00000101 |
< |
Бинарный оператор сравнения. Возвращает 1 если число, стоящее слева от оператора, меньше числа, стоящего справа. В противном случае возвращает 0. |
ldi R16,x1 < x2 ;R16 <- 1 если x1 < x2
;R16 <- 0 если x1 >=x2 |
<= |
Бинарный оператор сравнения. Возвращает 1 если число, стоящее слева от оператора, меньше или равно числу, стоящему справа. В противном случае возвращает 0. |
ldi R16,x1 <= x2 ;R16 <- 1 если x1 <=x2
;R16 <- 0 если x1 > x2 |
> |
Бинарный оператор сравнения. Возвращает 1 если число, стоящее слева от оператора, больше числа, стоящего справа. В противном случае возвращает 0. |
ldi R16,x1 > x2 ;R16 <- 1 если x1 > x2
;R16 <- 0 если x1 <=x2 |
>= |
Бинарный оператор сравнения. Возвращает 1 если число, стоящее слева от оператора, больше или равно числу, стоящему справа. В противном случае возвращает 0. |
ldi R16,x1 >= x2 ;R16 <- 1 если x1 >=x2
;R16 <- 0 если x1 < x2 |
== |
Бинарный оператор сравнения. Возвращает 1 если числа, стоящие по обе стороны от оператора, равны. В противном случае возвращает 0. |
ldi R16,x1 == x2 ;R16 <- 1 если x1 = x2
;R16 <- 0 если x1 ≠ x2 |
!= |
Бинарный оператор сравнения. Возвращает 1 если числа, стоящие по обе стороны от оператора, не равны. В противном случае возвращает 0. |
ldi R16,x1 != x2 ;R16 <- 1 если x1 ≠ x2
;R16 <- 0 если x1 = x2 |
& |
Бинарный оператор. Производит побитовую операцию “Логическое И” между двух чисел. |
ldi R16,x1 | x2 ;R16 <- x1|x2 |
^ |
Бинарный оператор. Производит побитовую операцию “Исключающее ИЛИ” между двух чисел. |
ldi R16,x1 ^ x2 ;R16 <- x1^x2 |
| |
Бинарный оператор. Производит побитовую операцию “Логическое ИЛИ” между двух чисел. |
ldi R16,x1 & x2 ;R16 <- x1&x2 |
&& |
Бинарный оператор сравнения. Возвращает 1 если числа, стоящие по обе стороны от оператора, не равны нулю. В противном случае возвращает 0. |
ldi R16,x1 && x2 ;R16 <- 1 если x1 и x2 ≠ 0
;R16 <- 0 если x1 или x2 = 0 |
|| |
Бинарный оператор сравнения. Возвращает 1 если хотя бы одно из чисел, стоящих по обе стороны от оператора, не равно нулю. В противном случае возвращает 0. |
ldi R16,x1 || x2 ;R16 <- 1 если x1 или x2 ≠ 0
;R16 <- 0 если x1 и x2 = 0 |
Ассемблер содержит также ряд встроенных функций. Некоторые из них, имеющие наибольшее практическое значение, приведены в табл.2.
Табл 2. Некоторые встроенные в ассемблер функции:
Обозначение функции |
Описание |
Пример использования |
low() |
Функция возвращает младший байт выражения. |
low(0x1234) = 0x34 |
high(), byte2() |
Функция возвращает второй байт выражения. |
high(0x1234) = byte2(0x1234) = 0x12 |
byte3() |
Функция возвращает третий байт выражения. |
byte3(0xABCD1234) = 0xCD |
byte4() |
Функция возвращает четвертый байт выражения. |
byte4(0xABCD1234) = 0xAB |
lwrd() |
Функция возвращает младшее слово выражения. |
lwrd(0xABCD1234) = 0x1234 |
hwrd() |
Функция возвращает второе слово выражения. |
hwrd(0xABCD1234) = 0xABCD |
abs() |
Функция возвращает абсолютное значение выражения. |
abs(-1000) = 1000 |
Операторы арифметических и логических операций, а также символы “;”, “.”, “(”, “)”, “[”, “]”, “{”, “}”, “?” - зарезервированы компилятором. Они не должны встречаться в обозначениях констант, инструкций и меток. Кроме этого, пользовательские имена, не могут начинаться с цифр и не должны совпадать с названиями регистров (R0…R31,X,Y,Z) и встроенными в ассемблер функциями.
|