Электронные системы ускорителей

8. Директивы ассемблера

C51ASM предоставляет ряд псевдоинструкций для определения значений идентификаторов, резервирования и инициализации данных и управления размещением кода и данных. Эти операторы не следует путать с инструкциями процессора или элементами управления ассемблера. Они не создают исполняемый код и, за исключением операторов DB, DW, WORD и BYTE, не имеют прямого влияния на содержание памяти программ. Эти директивы изменяют состояние ассемблера, определяют пользовательские идентификаторы и добавляют информацию в объектный файл.

Операторы директив могут быть разделены на следующие категории:

Табл. 12. Директивы управления адресом

табл12

Табл. 13. Директивы управления сегментами

табл13

Табл. 14. Директивы определения сегментов

табл14

Табл. 15. Директивы условного ассемблирования

табл15

Табл. 16. Директивы макроопределений

табл16

Табл. 17. Директивы инициализации памяти

табл17

Табл. 18. Директивы резервирования памяти

табл18

Табл. 19. Прочие директивы

табл19

9. Управление ассемблером

C51ASM реализует управление ассемблером, которое влияет на процесс ассемблирования и генерацию файла листинга. Есть две группы элементов управления: первичного и общего управления.

Первичные элементы управления могут быть использованы только в начале программы и действуют в процессе ассемблирования. Им могут предшествовать только операторы управления, пустая строка и комментарии. Если же первичный элемент контроля используется несколько раз с различными параметрами, то актуальным является последний из них. Многие основные элементы управления имеют эквиваленты в командной строке. Параметры командной строки всегда заменяют эквивалентные элементы управления при ассемблировании источника.

Основные элементы управления могут быть использованы в программе везде. Они выполняют одно действие и остаются в силе, пока не будут отменены или изменены последующим оператором управления.

Управляющий оператор начинается со знака символа доллар ($), после которого следуют один или несколько элементов управления ассемблера. Пробелы и табуляция допускается между '$' и первым элементом управления. Последующие элементы управления в той же строке должны быть разделены пробелами или табуляцией. Элемент управления $INCLUDE должен быть последним в строке. Все элементы управления после $INCLUDE будут проигнорированы до конца строки.

Элементы управления ассемблера могут иметь операнд численного или строкового типа, который всегда должен быть заключен в скобки. Численными операндами являются десятичные, восьмеричные или шестнадцатеричные константы в стандартной форме Cи. Операндом строкового типа является строка символов, которые заключены в скобки вместо кавычек. Управляющие символы (включая табуляцию) не допускаются в эти строки! Разделители строк '(' и ')' разрешено использовать до тех пор, пока количество открытых и закрытых скобок сбалансировано.

Если элемент управления изменяет формат листинга, сам управляющий оператор всегда указан в новом листинге!

В следующей таблице перечислены все реализованные элементы управления и их аббревиатуры.

Табл. 20. Прочие директивы

табл20

Табл. 21. Прочие директивы

табл21

Состояние по умолчанию элементов управления ассемблера соответствует следующему:

$DATE( )

$TITLE(Copyright (c) 2010 Atmel Corp.)

$MACRO(50)

$MOD51

$OBJECT NOPRINT NODEBUG

$PAGING PAGELENGTH(64) PAGEWIDTH(132)

$SYMBOLS NOXREF

$COND GEN LIST

10. Условное ассемблирование

C51ASM поддерживает условное ассемблирование с помощью нескольких директив. Условное ассемблирование позволяет ассемблировать или игнорировать отдельные части исходного текста. Условное ассемблирование может использоваться для упрощения управления конфигурацией и обслуживания путем реализации версий различных программ или модели другой памяти в рамках одного исходного файла. Используя условную сборку, можно легко использовать один модуль источника, который удовлетворяет разным приложениям. Поддерживаются следующие инструкции директив:

Табл. 22. Директивы условного ассемблирования

табл22

Директивы IF, ELSEIF, ELSE и ENDIF определяют условное ассемблирование блоков. C51ASM поддерживает несколько вариантов директив IF и ELSEIF, которые различаются определением условия как положительного, так и отрицательного. Для этого документа предполагается, что IF и ELSEIF являются синонимами для соответствующих вариантов.

Условное ассемблирование блоков должно начинаться с инструкции IF и должно заканчиваться оператором ENDIF. Блок условного ассемблирования может включать дополнительные альтернативные блоки, начиная с директив ELSEIF или ELSE. Каждый оператор ELSEIF или ELSE заканчивает предыдущий блок IF или ELSEIF. ENDIF завершает последний блок ELSEIF или ELSE и всей конструкции IF-ELSE-ENDIF.

IF <условие 1>

. . . ;ассемблируется, если <условие 1> является TRUE

. . .

ELSEIF <условие 2>

. . . ; ассемблируется, если <условие 1> является FALSE,

. . . ;и <условие 2> является TRUE

. . .

ELSEIF <условие n>

. . . ; ассемблируется, если с <условие 1> до

. . . ;<условие n-1> являются FALSE и

. . . ;<условие n> является TRUE

ELSE

. . . ; ассемблируется, если с <условие 1> до

. . . ;<условие n> являются FALSE

ENDIF

Тело каждого условного и альтернативного блока может содержать любое количество операторов языка ассемблера, включая мнемонику инструкций, элементы управления, директивы, макросы и вложенные условные блоки IF-ELSE-ENDIF. Блоки IF-ELSE-ENDIF могут быть вложены с любой глубиной! Используйте элементы управления $COND, $NOCOND и $CONDONLY для задания режима листинга с условным ассемблированием блоков.

Пример: Простой блок IF-ENDIF для проверки определения NOLISTING.

IFDEF NOLISTING

$NOPRINT

ENDIF

Пример: Блок IF-ELSE-ENDIF для оптимизации, если X равен 0.

IF (X == 0)

CLR A

ELSE

MOV A, #X

ENDIF

Пример: Блок IF-ELSEIF-ELSE-ENDIF, обеспечивающий правильные операнды макроса.

CMP MACRO OP1, OP2

IFB

$ERROR(Missing 1st operand to CMP)

ELSEIFB

$ERROR(Missing 2nd operand to CMP)

ELSE

MOV A, OP1

CLR C

SUBB A, OP2

ENDIF

ENDM