3.6 Директивы препроцессора
В ассемблере доступны следующие директивы препроцессора Языка C, указанные в таблице 6.
Таблица 6 – Директивы препроцессора
|
Директива |
Описание |
|
#define |
Назначает значение метке. |
|
#elif |
Вводит новое условие в блок #if ... #endif . |
|
#else |
Обрабатывает команды, если условие является ложным |
|
#endif |
Заканчивает блоки #if, #ifdef, или #ifndef. |
|
#error |
Генерирует ошибку. |
|
#if |
Обрабатывает команды, если условие истинно. |
|
#ifdef |
Обрабатывает команды, если переменная определена |
|
#ifndef |
Обрабатывает команды, если переменная не определена |
|
#include |
Подключает файлы |
|
#pragma |
Распознаётся и игнорируется. |
|
#undef |
Отменяет метки (переменные) |
|
/*comment*/ |
Комментарий в стиле языка С |
|
// |
Комментарий в стиле языка С++ |
Синтаксис:
#define label text
#elif condition
#else
#endif
#error "message"
#if condition
#ifdef label
#ifndef label
#include {"filename" | <filename>}
#message "message"
#undef label
/*comment*/
//comment
где: параметр condition принимает одно из следующих значений:
Абсолютное выражение
Выражение не должно содержать внешние ссылки, и любое ненулевое значение рассматривают как истина.
string1=string2
Условие истинно, если string1 и string2 имеют одинаковую длину и содержание.
string1<>string2
Условие истинно, если string1 и string2 имеют разную длину и содержание
filename – имя подключаемого файла
label – метка, которая должна быть определена, отменена или проверена.
message – текст выводимого сообщения
text - Значение, которое будет назначено.
Описание директив препроцессора
#define
Используется для определения временной переменной. Подобно тому, как записывается label VAR value
#undef
Используется для отмены переменной.
/*comment*/
Используется для комментирования секции листинга
//comment
Используется для комментирования строки
#if, #else, #endif
Директивы #if ... #else ... #endif используются для управления процессом трансляции во время ассемблирования. Если условие после директивы #if не истинно, последующие команды не будут обрабатываться, пока не будут найдены директивы #endif или #else .
#ifdef
Используется, для трансляции команд до следующей директивы #else или #endif , только если символическая метка определена.
#ifndef
Используется, для трансляции команд до следующей директивы #else или #endif , только если символическая метка не определена.
#include
Используется, чтобы вставить содержимое файла в исходный код в указанной точке. #include "filename" ищет следующие каталоги в указанном порядке:
-Каталог исходного кода.
-Каталоги, указанные опцией -I
-Текущий каталог
если указывается не кавычки, а скобки #include <filename>, то файл ищется в порядке:
-Каталоги, указанные опцией -I
-Текущий каталог
#error
Используется для генерации ошибки, определяемой пользователем.
Примеры:
Следующий пример определяет метки tweak и adjust.
#define tweak 1
#define adjust 3
#ifdef tweak
#if adjust=1
SUB A,#4
#elif adjust=2
SUB A,#20
#elif adjust=3
SUB A,#30
#endif
#endif
Следующий пример использует #include, чтобы включить файл, определяющий макрос в исходный файл. Например, следующий макрос мог быть определен в файле macros.s26 :
xchrp MACRO a,b
PUSH a
PUSH b
POP a
POP b
ENDM
NAME include
#include c:\iar\asm\inc\”macros.s26”
main: xchrp RP2,RP3
RET
END main
