ORG - Установить положение в сегменте
Директива ORG устанавливает счётчик положения равным заданной величине, которая передаётся как параметр. Для сегмента данных она устанавливает счётчик положения в SRAM (ОЗУ), для сегмента программ это программный счётчик, а для сегмента EEPROM это положение в EEPROM. Если директиве предшествует метка (в той же строке) то метка размещается по адресу указанному в параметре директивы. Перед началом компиляции программный счётчик и счётчик EEPROM равны нулю, а счётчик ОЗУ равен 32 (поскольку адреса 0-31 заняты регистрами). Обратите внимание что для ОЗУ и EEPROM используются побайтные счётчики а для программного сегмента - пословный.
Синтаксис:
.ORG выражение
Пример:
.DSEG ; Начало сегмента данных
.ORG 0x37 ; Установить адрес SRAM равным 0x37 variable: .BYTE 1 ; Зарезервировать байт по адресу 0x37H
.CSEG
.ORG 0x10 ; Установить программный счётчик равным 0x10
mov r0,r1 ; Данная команда будет размещена по адресу 0x10
SET - Установить переменный символический эквивалент выражения
Директива SET присваивает имени некоторое значение. Это имя позднее может быть использовано в выражениях. Причем в отличии от директивы EQU значение имени может быть изменено другой директивой SET.
Синтаксис:
.SET имя = выражение
Пример:
.SET io_offset = 0x23
.SET porta = io_offset + 2
.CSEG ; Начало кодового сегмента
clr r2 ; Очистить регистр 2
out porta,r2 ; Записать в порт A
Выражения
Компилятор позволяет использовать в программе выражения которые могут состоять операндов,
операторов и функций. Все выражения являются 32-битными.
Операнды
Могут быть использованы следующие операнды:
· Метки определённые пользователем (дают значение своего положения).
· Переменные определённые директивой SET
· Константы определённые директивой EQU
· Числа заданные в формате:
o Десятичном (принят по умолчанию): 10, 255
o Шестнадцатеричном (два варианта записи): 0x0a, $0a, 0xff, $ff
o Двоичном: 0b00001010, 0b11111111
o Восьмеричном (начинаются с нуля): 010, 077
· PC - текущее значение программного счётчика (Programm Counter)
Операторы
Компилятор поддерживает ряд операторов которые перечислены в таблице (чем выше положение в таблице, тем выше приоритет оператора). Выражения могут заключаться в круглые скобки, такие выражения вычисляются перед выражениями за скобками.
Приоритет | Символ | Описание |
! | Логическое отрицание | |
~ | Побитное отрицание | |
- | Минус | |
* | Умножение | |
/ | Деление | |
+ | Суммирование | |
- | Вычитание | |
<< | Сдвиг влево | |
>> | Сдвиг вправо | |
< | Меньше чем | |
<= | Меньше или равно | |
> | Больше чем | |
>= | Больше или равно | |
== | Равно | |
!= | Не равно | |
& | Побитное И | |
^ | Побитное исключающее ИЛИ | |
| | Побитное ИЛИ | |
&& | Логическое И | |
|| | Логическое ИЛИ |
Символ: !
Логическое отрицание
Описание: Возвращает 1 если выражение равно 0, и наоборот
Приоритет: 14
Пример: ldi r16, !0xf0 ; В 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
Символ: +
Суммирование
Описание: Возвращает сумму двух выражений
Приоритет: 12
Пример: ldi r30, c1+c2
Символ: -
Вычитание
Описание: Возвращает результат вычитания правого выражения из левого
Приоритет: 12
Пример: ldi r17, c1-c2
Символ: <<
Сдвиг влево
Описание: Возвращает левое выражение сдвинутое влево на число бит указанное справа
Приоритет: 11
Пример: ldi r17, 1<<bitmask ; В r17 загрузить 1 сдвинутую влево bitmask раз
Символ: >>
Сдвиг вправо
Описание: Возвращает левое выражение сдвинутое вправо на число бит указанное справа
Приоритет: 11
Пример: ldi r17, c1>>c2 ; В r17 загрузить c1 сдвинутое вправо c2 раз
Символ: <
Меньше чем
Описание: Возвращает 1 если левое выражение меньше чем правое (учитывается знак), и 0 в противном случае
Приоритет: 10
Пример: ori r18, bitmask*(c1<c2)+1
Символ: <=
Меньше или равно
Описание: Возвращает 1 если левое выражение меньше или равно чем правое (учитывается знак), и 0 в противном случае
Приоритет: 10
Пример: ori r18, bitmask*(c1<=c2)+1
Символ: >
Больше чем
Описание: Возвращает 1 если левое выражение больше чем правое (учитывается знак), и 0 в противном случае
Приоритет: 10
Пример: ori r18, bitmask*(c1>c2)+1
Символ: >=
Больше или равно
Описание: Возвращает 1 если левое выражение больше или равно чем правое (учитывается знак), и 0 в противном случае
Приоритет: 10
Пример: ori r18, bitmask*(c1>=c2)+1
Символ: ==
Равно
Описание: Возвращает 1 если левое выражение равно правому (учитывается знак), и 0 в противном случае
Приоритет: 9
Пример: andi r19, bitmask*(c1==c2)+1
Символ: !=
Не равно
Описание: Возвращает 1 если левое выражение не равно правому (учитывается знак), и 0 в противном случае
Приоритет: 9
Пример: .SET flag = (c1!=c2) ;Установить flag равным 1 или 0
Символ: &
Побитное И
Описание: Возвращает результат побитового И выражений
Приоритет: 8
Пример: ldi r18, High(c1&c2)
Символ: ^
Побитное исключающее ИЛИ
Описание: Возвращает результат побитового исключающего ИЛИ выражений
Приоритет: 7
Пример: ldi r18, Low(c1^c2)
Символ: |
Побитное ИЛИ
Описание: Возвращает результат побитового ИЛИ выражений
Приоритет: 6
Пример: ldi r18, Low(c1|c2)
Символ: &&
Логическое И
Описание: Возвращает 1 если оба выражения не равны нулю, и 0 в противном случае
Приоритет: 5
Пример: ldi r18, Low(c1&&c2)
Символ: ||
Логическое ИЛИ
Описание: Возвращает 1 если хотя бы одно выражение не равно нулю, и 0 в противном случае
Приоритет: 4
Пример: ldi r18, Low(c1||c2)
Определены следующие функции:
Функции
LOW(выражение) возвращает младший байт выражения HIGH(выражение) возвращает второй байт выражения BYTE2(выражение) то же что и функция HIGHBYTE3(выражение) возвращает третий байт выражения BYTE4(выражение) возвращает четвёртый байт выражения LWRD(выражение) возвращает биты 0-15 выражения HWRD(выражение) возвращает биты 16-31 выражения PAGE(выражение) возвращает биты 16-21 выражения EXP2(выражение) возвращает 2 в степени (выражение) LOG2(выражение) возвращает целую часть log2(выражение)
Открытие файлов
В WAVRASM могут быть открыты как новые так и существующие файлы. Количество открытых файлов ограничено размером памяти, однако объём одного файла не может превышать 28 килобайт (в связи с ограничением MS-Windows). Компиляция файлов большего размера возможна, но они не могут быть редактируемы встроенным редактором. Каждый файл открывается в отдельном окне.
Сообщения об ошибках
После компиляции программы появляется окно сообщений. Все обнаруженные компилятором ошибки будут перечислены в этом окне. При выборе строки с сообщением о ошибке, строка исходного файла,
в которой найдена ошибка, становится красной. Если же ошибка находится во вложенном файле, то этого подсвечивания не произойдёт.
Если по строке в окне сообщений клацнуть дважды, то окно файла с указанной ошибкой становится активным, и курсор помещается в начале строки содержащей ошибку. Если же файл с ошибкой не открыт (например это вложенный файл) то он будет автоматически открыт.
Учтите, что если Вы внесли изменения в исходные тексты (добавили или удалили строки), то информация о номерах строк в окне сообщений не является корректной.
Опции
Некоторые установки программы могут быть изменены через пункт меню Options. Если выбрать этот пункт то появится диалоговое окно
В поле ввода озаглавленном "List-file extension" вводится расширение используемое для файла листинга, а в поле "Output-file extension" находится расширение для файлов с результатом компиляции программы. В прямоугольнике "Output file format" можно выбрать формат выходного файла (как правило используется интеловский). Однако это не влияет на объектный файл (используемый AVR Studio), который всегда имеет один и тот же формат, и расширение OBJ. Если в исходном файле присутствует сегмент EEPROM то будет также создан файл с расширением EEP. Установки заданные
в данном окне запоминаются на постоянно, и при следующем запуске программы, их нет необходимости переустанавливать.
Опция "Wrap relative jumps" даёт возможность "заворачивать" адреса. Эта опция может быть использована только на чипах с объёмом программной памяти 4К слов (8К байт), при этом становится возможным делать относительные переходы (rjmp) и вызовы подпрограмм (rcall) по всей памяти. Опция "Save before assemble" указывает программе на необходимость автоматического сохранения активного окна (и только его) перед компиляцией.
Если Вы хотите чтобы при закрытии программы, закрывались все открытые окна, то поставьте галочку в поле "Close all windows before exit".
Atmel, AVR являются зарегистрированными товарными знаками фирмы Atmel Corporation
Перевод выполнил Руслан Шимкевич, [email protected]