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

6. Типы сегментов

При ассемблировании каждому выражению в зависимости от операторов и их операндов назначается тип сегмента. Тип сегмента определяет, какой адресное пространство будет использоваться для адреса результата выражения. Существуют восемь возможных типов сегментов, как показано в табл. 9.

Табл. 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. Расширенный набор инструкций

табл10

В дополнение к инструкциям ассемблер поддерживает общие переходы и вызовы, которые не представлены конкретными кодами операций. Ассемблер реализует следующие две общие инструкции:

JMP addr

CALL addr

Эти инструкции перехода и вызова определяются адресом, хотя и не обязательно самым коротким для перехода на указанное место. JMP может ассемблироваться как SJMP, AJMP, LJMP или EJMP, а вызов вычисляться для ACALL, LCALL или ECALL. Следует отметить, что решение ассемблера может быть не оптимальным. Для адреса, ссылающегося вперед (место в программе), ассемблер не может определить, какая форма наиболее эффективна. Для ссылки вперед ассемблер всегда порождает LJMP или LCALL для стандартных размеров памяти (<= 64 КБ) и EJMP или ECALL для расширенного размера памяти (> 64 КБ). Тем не менее, для обеспечения ссылки назад это по-прежнему мощный инструмент для уменьшения размера кода без лишних хлопот.

Некоторые микроконтроллеры AT89LP используют специальные режимы инструкций для указателя данных (DPTR). C51ASM поддерживает некоторые псевдонимы инструкций, которые лучше отражают намерения программиста. Эти псевдонимы не являются новыми инструкциями, они опираются на существующие инструкции. Когда эти псевдонимы используются, нет возможности проверить, правильный ли режим был установлен. Чтобы разрешить анализ псевдонимов, в командной строке должна быть включена опция -dptr.

Табл. 11. Псевдонимы указателя данных

табл11


Продолжение