ОСНОВЫ ЯЗЫКА АССЕМБЛЕРА С51ASM
1. Операторы
2. Комментарии
3. Идентификаторы
3.1 Метки
3.2. Предопределенные идентификаторы
4. Константы
5. Выражения
6. Типы сегментов
7. Набор инструкций 8051
8. Директивы ассемблера
9. Управление ассемблером
10. Условное ассемблирование
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНОЙ РАБОТЕ
1. Задание и порядок выполнения работы
2. Задачи
3. Оформление отчета
ПРИЛОЖЕНИЕ
Сообщение об ошибках ассемблера C51ASM
6. Типы сегментов
При ассемблировании каждому выражению в зависимости от операторов и их операндов назначается тип сегмента. Тип сегмента определяет, какой адресное пространство будет использоваться для адреса результата выражения. Существуют восемь возможных типов сегментов, как показано в табл. 9.
Табл. 9. Типы сегментов
Результаты выражений в большинстве случаев не имеют тип и являются типом NUMBER. Тем не менее, некоторые выражения получат значение определенного типа сегмента, если удовлетворяют следующим шести правилам:
• Числовые константы всегда не имеют тип сегмента и им присваивается тип NUMBER.
• Идентификаторам задается тип сегмента во время их определения. Идентификаторы, которые определены с помощью EQU или SET имеют тип NUMBER. Идентификаторы, которые определены явно директивой типа, например DATA, BIT и т.д., будут иметь тот же тип. Метки получат тот тип сегмента, в котором они были определены.
• Результаты унарных операций (+, -, NOT, HIGH, LOW) будут иметь тип сегмента своего операнда.
• Результаты всех бинарных операций (кроме "+", "-" и ".") не будут иметь тип сегмента.
• Если только один операнд в бинарных операциях "+" или "-" имеет тип сегмента, то результат будет тот же, что и тип сегмента. Во всех остальных случаях, результат не будет иметь тип сегмента.
• Результат битовой операции "." всегда будет иметь типа сегмента BIT.
Например, следующие идентификаторы определены в программе:
OFFSET EQU 16
START CODE 30H
DOIT CODE 0100H
REDLED BIT P1.3
VARIAB4 DATA 20H
PORT DATA 0C8H
RELAY EQU 5
• Выражение START+OFFSET+3 будет иметь тип сегмента CODE
• Выражение START+DOIT будет без типа
• Выражение DOIT-REDLED будет без типа
• Выражение 2*VARIAB4 будет без типа
• Выражение PORT.RELAY будет иметь тип сегмента BIT
Тип сегмента проверяется, только если выражения имеют значение адреса. Если результат выражения без типа и не имеет тип соответствующего сегмента, инструкция отмечается сообщением об ошибке. Единственными исключениями являются типы сегментов DATA и IDATA, которые, как предполагается, должны быть совместимыми с адресом в диапазоне от 0 до 7FH.
Пример:
Line I Addr Code Source 1: N 30 DSEG AT 030H ;внутренняя RAM 2: 30 N 01 COUNT: DS 1 ;переменная счетчика 3: 4: CSEG ;ROM 5: 0000 C2 30 START: CLR COUNT ^ @@@@@ segment type mismatch @@@@@
Инструкция CLR отмечается сообщением об ошибке "несоответствие типов сегмента" в файле листинга ассемблера, потому что здесь допускается только тип битового адреса. Однако, COUNT является меткой с типом сегмента данных.
7. Набор инструкций 8051
Ассемблер Atmel ® C51ASM реализует все 255 машинных команд стандартного 8051. Таблица всех 8051 инструкций с их кодами операций, мнемониками, аргументами и размерами, а также подробными описаниями можно найти в справочнике Help приложения AT89LP Developer Studio.
C51ASM также поддерживает расширенный набор команд семейства Atmel AT89LP. Эти инструкции могут не поддерживаться какими-то устройствами. Расширенный набор инструкций перечислен ниже:
Табл. 10. Расширенный набор инструкций
В дополнение к инструкциям ассемблер поддерживает общие переходы и вызовы, которые не представлены конкретными кодами операций. Ассемблер реализует следующие две общие инструкции:
JMP addr
CALL addr
Эти инструкции перехода и вызова определяются адресом, хотя и не обязательно самым коротким для перехода на указанное место. JMP может ассемблироваться как SJMP, AJMP, LJMP или EJMP, а вызов вычисляться для ACALL, LCALL или ECALL. Следует отметить, что решение ассемблера может быть не оптимальным. Для адреса, ссылающегося вперед (место в программе), ассемблер не может определить, какая форма наиболее эффективна. Для ссылки вперед ассемблер всегда порождает LJMP или LCALL для стандартных размеров памяти (<= 64 КБ) и EJMP или ECALL для расширенного размера памяти (> 64 КБ). Тем не менее, для обеспечения ссылки назад это по-прежнему мощный инструмент для уменьшения размера кода без лишних хлопот.
Некоторые микроконтроллеры AT89LP используют специальные режимы инструкций для указателя данных (DPTR). C51ASM поддерживает некоторые псевдонимы инструкций, которые лучше отражают намерения программиста. Эти псевдонимы не являются новыми инструкциями, они опираются на существующие инструкции. Когда эти псевдонимы используются, нет возможности проверить, правильный ли режим был установлен. Чтобы разрешить анализ псевдонимов, в командной строке должна быть включена опция -dptr.
Табл. 11. Псевдонимы указателя данных