ОСНОВЫ ЯЗЫКА АССЕМБЛЕРА С51ASM
1. Операторы
2. Комментарии
3. Идентификаторы
3.1 Метки
3.2. Предопределенные идентификаторы
4. Константы
5. Выражения
6. Типы сегментов
7. Набор инструкций 8051
8. Директивы ассемблера
9. Управление ассемблером
10. Условное ассемблирование
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНОЙ РАБОТЕ
1. Задание и порядок выполнения работы
2. Задачи
3. Оформление отчета
ПРИЛОЖЕНИЕ
Сообщение об ошибках ассемблера C51ASM
8. Директивы ассемблера
C51ASM предоставляет ряд псевдоинструкций для определения значений идентификаторов, резервирования и инициализации данных и управления размещением кода и данных. Эти операторы не следует путать с инструкциями процессора или элементами управления ассемблера. Они не создают исполняемый код и, за исключением операторов DB, DW, WORD и BYTE, не имеют прямого влияния на содержание памяти программ. Эти директивы изменяют состояние ассемблера, определяют пользовательские идентификаторы и добавляют информацию в объектный файл.
Операторы директив могут быть разделены на следующие категории:
Табл. 12. Директивы управления адресом
Табл. 13. Директивы управления сегментами
Табл. 14. Директивы определения сегментов
Табл. 15. Директивы условного ассемблирования
Табл. 16. Директивы макроопределений
Табл. 17. Директивы инициализации памяти
Табл. 18. Директивы резервирования памяти
Табл. 19. Прочие директивы
9. Управление ассемблером
C51ASM реализует управление ассемблером, которое влияет на процесс ассемблирования и генерацию файла листинга. Есть две группы элементов управления: первичного и общего управления.
Первичные элементы управления могут быть использованы только в начале программы и действуют в процессе ассемблирования. Им могут предшествовать только операторы управления, пустая строка и комментарии. Если же первичный элемент контроля используется несколько раз с различными параметрами, то актуальным является последний из них. Многие основные элементы управления имеют эквиваленты в командной строке. Параметры командной строки всегда заменяют эквивалентные элементы управления при ассемблировании источника.
Основные элементы управления могут быть использованы в программе везде. Они выполняют одно действие и остаются в силе, пока не будут отменены или изменены последующим оператором управления.
Управляющий оператор начинается со знака символа доллар ($), после которого следуют один или несколько элементов управления ассемблера. Пробелы и табуляция допускается между '$' и первым элементом управления. Последующие элементы управления в той же строке должны быть разделены пробелами или табуляцией. Элемент управления $INCLUDE должен быть последним в строке. Все элементы управления после $INCLUDE будут проигнорированы до конца строки.
Элементы управления ассемблера могут иметь операнд численного или строкового типа, который всегда должен быть заключен в скобки. Численными операндами являются десятичные, восьмеричные или шестнадцатеричные константы в стандартной форме Cи. Операндом строкового типа является строка символов, которые заключены в скобки вместо кавычек. Управляющие символы (включая табуляцию) не допускаются в эти строки! Разделители строк '(' и ')' разрешено использовать до тех пор, пока количество открытых и закрытых скобок сбалансировано.
Если элемент управления изменяет формат листинга, сам управляющий оператор всегда указан в новом листинге!
В следующей таблице перечислены все реализованные элементы управления и их аббревиатуры.
Табл. 20. Прочие директивы
Табл. 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. Директивы условного ассемблирования
Директивы 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