Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Примечания можно добавлять в конце строки после знака "точка с запятой". Все, что расположено после точки с запятой и до знака конца строки (обычно в текстовом формате DOS/Windows это пара символов $0А $0D, которая вводится при нажатии ; редакторы их. не показывают, но нумеруют строки именно по наличию этих символов), игнорируется, поэтому комментарий может быть и на русском. Длина строки ограничена 120 символами. Если необходимо продлить комментарий на следующую строку, то эту строку нужно опять начинать со знака "точка с запятой".

Числа и выражения
В некоторые команды можно включать выражения и числовые значения. Числа по умолчанию считаются десятичными, за исключением чисел с веду- щим нулем, которые, если не имеют дополнительных признаков, восприни- маются как восьмеричные. Шестнадцатеричные числа можно записывать двояким способом: как в языке С (ОХОА), так и в языке Pascal ($ОА). "Интелов- ская" форма записи (OAh) не допускается. Двоичные числа записывают как в языке С: оьооооюю.

В команды можно включать алгебраические и логические выражения, например, ldi r30,ci+c2 (где ci и с2— константы). В выражениях допустимы все арифметические и логические операции, включая даже операции сравнения (за их полным перечнем я отсылаю к фирменному описанию ассемблера). Однако действия в выражениях могут, естественно, производиться только над константами, а не над содержимым регистров, которое к моменту компиляции неизвестно. Хитрый нюанс тут заключается в том, что адреса в программе— тоже константы, поэтому допустима такая, например, конструкция: г jmp metka+i. По этой команде произойдет переход не на команду, помеченную меткой metka, а на следующую за ней. Впрочем, увлекаться этим не стоит, т. к. дейкстровская "лапша" условных и безусловных переходов и без того затрудняет чтение ассемблерных программ.

Укажем на одну операцию с константами, которой мы часто будем пользоваться: это логический сдвиг влево, обозначающийся знаком «. Оператор этот хорошо известен знатокам языка С, для всех остальных поясним, что выражение х«п равносильно выражению х-2", или, другими словами, число х, сдвинутое влево на п двоичных разрядов. В совокупности с побитовым "ИЛИ" (" | ") операцию эту удобно применять для установки поименованных битов сразу "всей кучей", например:
ldi temp, (1«INT0) I (1«INT1) out GIMSK,temp

Эта последовательность операторов установит разрешение двух прерываний IntO и Intl в один прием. Запись I«INTO означает число 1, сдвинутое на INTO разрядов влево, т. е. оказавшееся в позиции INTO. МОЖНО устанавливать сразу два и более битов, если они идут подряд: например, запись ldi
temp, (3«INTO) равносильна ldi temp, (1«INTO) I (1«INTI), причем указывать нужно самый младший бит.
Но раздельная запись лучше читается и употребляется чаще. Вместо логического побитного сложения (" | ") можно применить обычное арифметическое ("+"). Скобки в выражениях используются по тем же правилам, что и в обычной алгебре — для явного указания старшинства операций. Старшинство (приоритет) операций соответствует их положению в таблице, приведенной в описании AVR-ассемблера (чем ниже положение, тем приоритет выше). Скажем, в приведенном примере при указании знака логического побитного сложения скобки можно не ставить (эта операция имеет наивысший приоритет среди всех, кроме редко употребляющихся логического "И" и логического "ИЛИ", возвращающих не байтовый, а логический результат 0 или 1 — прямого аналога среди команд МК этим функциям нет). При использовании арифметического сложения они становятся обязательными, но, чтобы не плодить источники возможных ошибок, во всех сомнительных случаях лучше употреблять скобки.

Директивы и функции
Кроме собственно команд, в ассемблерной программе могут встречаться директивы компилятора. Их довольно много, но самых употребительных, которые есть практически в каждой программе, три: def (definitions), equ (equvalent) и include. Первые две предназначены для определения имен пользовательских переменных и констант соответственно (обратите внимание на точку перед именем директивы):
.equ max_value = $11 ;максимальное значение = 17
.def temp = rl6 ;регистр г16 есть переменная temp
.def counter = r05 /регистр r05 есть переменная counter

Эти определения в целях структурирования программы обычно располагают в начале текста. Только учтите, что никаких проверок, кроме синтаксических, тут не производится, потому возможно объявить два разных имени для одного регистра, и они будут восприниматься как синонимы:
.def temp = г16 /регистр г16 есть переменная temp
.def counter = rl'6 /регистр rl6 есть переменная counter

Изменение temp будет автоматически означать изменение counter и наоборот. Иногда этим пользуются, если в разных частях программы один регистр применяется для разных по смыслу вещей (и вы можете встретить такие примеры в фирменных "аппнотах"). В общем случае такую возможность следует использовать только в исключительных случаях— слишком много ошибок можно наделать.

С помощью директивы equ, вообще говоря, можно определять довольно сложные выражения, но этим пользуются редко — гораздо чаще ее применяют для определения переменных, которые располагаются не в регистрах, а в области SRAM. Например, следующая последовательность директив и команд (листинг 5.2) запишет содержимое регистра counter в SRAM по адресу $60 (для большинства моделей, кроме старших Mega, — это первый свободный адрес после занятых адресами регистров).

Листинг 5.2
.equ counter_addr = $60
clr ZH
ldi ZL,counter_addr st Z,counter



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru