Материал: 1755

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Окончание табл. 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