Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

Компилятор поддерживает ряд директив. Директивы не транслируются непосредственно в код. Вместо этого они используются для указания положения в программной памяти, определения макросов, инициализации памяти и т.д. Список директив приведён в таблице 3.5

Таблица 3.5 Список директив ассемблера

ДирективаОписание
BYTEЗарезервировать байты в ОЗУ
CSEGПрограммный сегмент
DBОпределить байты во флэш или EEPROM
DEFНазначить регистру символическое имя
DEVICEОпределить устройство для которого компилируется программа
DSEGСегмент данных
DWОпределить слова во флэш или EEPROM
ENDMКонец макроса
EQUУстановить постоянное выражение
ESEGСегмент EEPROM
EXITВыйти из файла
INCLUDEВложить другой файл
LISTВключить генерацию листинга
LISTMACВключить разворачивание макросов в листинге
MACROНачало макроса
NOLISTВыключить генерацию листинга
ORGУстановить положение в сегменте
SETУстановить переменный символический эквивалент выражения

Все директивы предваряются точкой.

BYTE — Зарезервировать байты в ОЗУ

Директива BYTE резервирует байты в ОЗУ. Если Вы хотите иметь возможность ссылаться на выделенную область памяти, то директива BYTE должна быть предварена меткой. Директива принимает один обязательный параметр, который указывает количество выделяемых байт. Эта директива может использоваться только в сегменте данных(смотреть директивы CSEG и DSEG). Выделенные байты не инициализируются.

МЕТКА: .BYTE выражение

CSEG — Программный сегмент

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

DB — Определить байты во флэш или EEPROM

Директива DB резервирует необходимое количество байт в памяти программ или в EEPROM. Если Вы хотите иметь возможность ссылаться на выделенную область памяти, то директива DB должна быть предварена меткой. Директива DB должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).

Параметры, передаваемые директиве — это последовательность выражений разделённых запятыми. Каждое выражение должно быть или числом в диапазоне (-128..255), или в результате вычисления должно давать результат в этом же диапазоне, в противном случае число усекается до байта, причём БЕЗ выдачи предупреждений.

Если директива получает более одного параметра и текущим является программный сегмент, то параметры упаковываются в слова (первый параметр — младший байт), и если число параметров нечётно, то последнее выражение будет усечено до байта и записано как слово со старшим байтом равным нулю, даже если далее идет ещё одна директива DB.

МЕТКА: .DB список_выражений

DEF — Назначить регистру символическое имя

Директива DEF позволяет ссылаться на регистр через некоторое символическое имя. Назначенное имя может использоваться во всей нижеследующей части программы для обращений к данному регистру. Регистр может иметь несколько различных имен. Символическое имя может быть переназначено позднее в программе.

.DEF Символическое_имя = Регистр

DEVICE — Определить устройство для которого компилируется программа

Директива DEVICE позволяет указать для какого устройства компилируется программа. При использовании данной директивы компилятор выдаст предупреждение, если будет найдена инструкция, которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегмент EEPROM превысят размер допускаемый устройством. Если же директива не используется то все инструкции считаются допустимыми, и отсутствуют ограничения на размер сегментов.

.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

DSEG — Сегмент данных

Директива DSEG определяет начало сегмента данных. Исходный файл может состоять из нескольких сегментов данных, которые объединяются в один сегмент при компиляции. Сегмент данных обычно состоит только из директив BYTE и меток. Сегменты данных имеют свои собственные побайтные счётчики положения. Директива ORG может быть использована для размещения переменных в необходимом месте ОЗУ. Директива не имеет параметров.

DW — Определить слова во флэш или EEPROM

Директива DW резервирует необходимое количество слов в памяти программ или в EEPROM. Если Вы хотите иметь возможность ссылаться на выделенную область памяти, то директива DW должна быть предварена меткой. Директива DW должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG). Параметры передаваемые директиве — это последовательность выражений разделённых запятыми. Каждое выражение должно быть или числом в диапазоне (-32768..65535), или в результате вычисления должно давать результат в этом же диапазоне, в противном случае число усекается до слова, причем БЕЗ выдачи предупреждений.

МЕТКА: .DW expressionlist

ENDMACRO — Конец макроса

Директива определяет конец макроопределения, и не принимает никаких параметров. Для информации по определению макросов смотрите директиву MACRO.

EQU — Установить постоянное выражение

Директива EQU присваивает метке значение. Эта метка может позднее использоваться в выражениях. Метка которой присвоено значение данной директивой не может быть переназначена и её значение не может быть изменено.

.EQU метка = выражение

ESEG — Сегмент EEPROM

Директива ESEG определяет начало сегмента EEPROM. Исходный файл может состоять из нескольких сегментов EEPROM, которые объединяются в один сегмент при компиляции. Сегмент EEPROM обычно состоит только из директив DB, DW и меток. Сегменты EEPROM имеют свои собственные побайтные счётчики положения. Директива ORG может быть использована для размещения переменных в необходимом месте EEPROM. Директива не имеет параметров.

Читать еще:  Выполняется проверка безопасности как отключить

EXIT — Выйти из файла

Встретив директиву EXIT компилятор прекращает компиляцию данного файла. Если директива использована во вложенном файле (см. директиву INCLUDE), то компиляция продолжается со строки следующей после директивы INCLUDE. Если же файл не является вложенным, то компиляция прекращается.

INCLUDE — Вложить другой файл

Встретив директиву INCLUDE компилятор открывает указанный в ней файл, компилирует его пока файл не закончится или не встретится директива EXIT, после этого продолжает компиляцию начального файла со строки следующей за директивой INCLUDE. Вложенный файл может также содержать директивы INCLUDE.

LIST — Включить генерацию листинга

Директива LIST указывает компилятору на необходимость создания листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако данная директива используется совместно с директивой NOLIST для получения листингов отдельных частей исходных файлов.

LISTMAC — Включить разворачивание макросов в листинге

После директивы LISTMAC компилятор будет показывать в листинге содержимое макроса. По умолчанию в листинге показывается только вызов макроса и передаваемые параметры.

MACRO — Начало макроса

С директивы MACRO начинается определение макроса. В качестве параметра директиве передаётся имя макроса. При встрече имени макроса позднее в тексте программы, компилятор заменяет это имя на тело макроса. Макрос может иметь до 10 параметров, к которым в его теле обращаются через @0-@9. При вызове параметры перечисляются через запятые. Определение макроса заканчивается директивой ENDMACRO.

По умолчанию в листинг включается только вызов макроса, для разворачивания макроса необходимо использовать директиву LISTMAC. Макрос в листинге показывается знаком +.

NOLIST — Выключить генерацию листинга

Директива NOLIST указывает компилятору на необходимость прекращения генерации листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако может быть отключена данной директивой. Кроме того данная директива может быть использована совместно с директивой LIST для получения листингов отдельных частей исходных файлов

ORG — Установить положение в сегменте

Директива ORG устанавливает счётчик положения равным заданной величине, которая передаётся как параметр. Для сегмента данных она устанавливает счётчик положения в SRAM (ОЗУ), для сегмента программ это программный счётчик, а для сегмента EEPROM это положение в EEPROM. Если директиве предшествует метка (в той же строке) то метка размещается по адресу указанному в параметре директивы. Перед началом компиляции программный счётчик и счётчик EEPROM равны нулю, а счётчик ОЗУ равен 32 (поскольку адреса 0-31 заняты регистрами). Обратите внимание что для ОЗУ и EEPROM используются побайтные счётчики а для программного сегмента — пословный.

SET — Установить переменный символический эквивалент выражения

Директива SET присваивает имени некоторое значение. Это имя позднее может быть использовано в выражениях. Причем в отличии от директивы EQU значение имени может быть изменено другой директивой SET.

.SET имя = выражение

Выражения

Компилятор позволяет использовать в программе выражения которые могут состоять операндов, операторов и функций. Все выражения являются 32-битными.

Операнды

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

  • Метки определённые пользователем (дают значение своего положения).
  • Переменные, определённые директивой SET
  • Константы, определённые директивой EQU
  • Числа, заданные в формате:
    Десятичном (принят по умолчанию): 10, 255 Шестнадцатеричном (два варианта записи): 0x0a, $0a, 0xff, $ff Двоичном: 0b00001010, 0b11111111 Восьмеричном (начинаются с нуля): 010, 077
  • PC — текущее значение программного счётчика (Program Counter)

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

Директивы представляют собой команды управления компилятором. Объявление каждой из них должно начинается с точки. Практика показывает, что в любом ассемблере наиболее интенсивно используется только порядка 10…20 директив. Все остальные либо не являются обязательными, либо отвечают за управление, лишь незначительными свойствами компилятора. К “основным”, характерным и для ассемблеров других процессоров, относятся директивы .equ, .org, .def, .сseg, .dseg и т.д. Ну, а такие директивы, как .dq, .exit, .listmac в реальных программах встречаются действительно очень редко. Ниже приведен перечень, описание и примеры использования директив фирменного ассемблера микроконтроллеров AVR.

Директива .include подставляет текстовый файл в то место программы, где происходит ее употребление. В дополнении к этому сам файл подстановки также может содержать директиву .include. Если файл расположен в директории проекта или в одной из служебных папок, то вместо полного пути, допускается указывать, лишь ссылку на его имя.

Директива .include
Синтаксис написания:
.include «<путь к файлу>»
Пример использования:

Директива .exit указывает ассемблеру место окончания файла исходного текста. Все операторы, находящиеся после директивы, становятся невидимыми для компилятора. Если .exit встречается в подключаемом файле, то сборка проекта заканчивается строкой, где расположена директива .include. В случае отсутствия директивы .exit, конечной точкой сборки считается последняя строка исходного текста.

Директива .exit
Синтаксис написания:
.exit
Пример использования:

Директивы .nolist и .list служат для управления файлом листинга, который обычно генерируется после сборки проекта. Первая из них запрещает, а другая, соответственно, разрешает вывод информации в файл. Директива .list отменяет действие .nolist и наоборот.

Директивы .nolist, .list
Синтаксис написания:
.nolist, .list
Пример использования:

Директива .equ присваивает символьному имени некоторое числовое значение. Символьное имя должно быть уникальным и не может быть изменено в процессе написания программы. Директива не может применяться для назначения символьных имен регистрам общего назначения.

Директива .equ
Синтаксис написания:
.equ <символьное имя>= <выражение>
Пример использования:

Директива .set производит то же самое действие, что и .equ. Но в отличии от последней, символьное имя может быть переопределено в любом месте программы.

Директива .set
Синтаксис написания:
.set <символьное имя>= <выражение>
Пример использования:

Директива .def присваивает символьное имя одному из регистров общего назначения. В дальнейшем ходе программы данное имя может быть отменено директивой .undef.

Директивы .def, .undef
Синтаксис написания:
.def <символьное имя>= <регистр>
.undef <символьное имя>
Пример использования:

Директивы .db, .dw, .dd, .dq предназначены для резервирования памяти микроконтроллера под инициализированные данные. Все они могут применяться только в сегментах кода и EEPROM-памяти. Разница между этими директивами заключается в разрядности, представляемых данных. Директива .db резервирует байты, .dw – слова, .dd – двойные слова. В редких случаях может так же оказаться удобным использование директивы .dq, резервирующей 64-разрядные данные.

Директива .byte резервирует память под неинициализированные данные в сегментах SRAM и EEPROM.

Директивы .dseg, .eseg, .cseg определяют начало сегментов данных, EEPROM-памяти и кода соответственно. В исходном файле каждый из сегментов может быть представлен только в одном экземпляре. В случае если все эти директивы отсутствуют в программе, компилятор по умолчанию считает, что все операторы расположены в секции кода.

Директивы .dseg, .eseg, .cseg
Синтаксис написания:
.dseg
.eseg
.cseg
Пример использования:

Директива .org позволяет задать компилятору начальный адрес в пределах сегментов кода, данных и EEPROM-памяти. В случае применения в сегменте кода, директива определяет адрес размещения 16-разрядного слова программ.

Директива .org
Синтаксис написания:
.org <начальный адрес>
Пример использования:

Директивы .macro, .endmacro (.endm), определяющие начало и конец макроса соответственно.

Директивы .macro, .endmacro (.endm)
Синтаксис написания:
.macro <имя макроса>
Пример использования:

Директива .listmac разрешает расширенный вывод текста макросов в файле листинга. В этом случае содержимое каждого макроопределения, встретившегося в программе, отображается целиком. Если директива не используется, то код в нутрии макроса не приводится.

Директива .listmac
Синтаксис написания:
.listmac
Пример использования:

Директивы .message, .warning, .error предназначены для вывода в окно сборки проекта дополнительной информации о ходе компиляции программы. Директива .message генерирует сообщение для строки, в которой был встречен ее вызов. Применение .warning приводит к выдачи предупреждения, а .error – к сообщению об ошибки. В последнем случае сборка проекта прекращается.

Группа директив условной компиляции .ifdef, .ifndef, .if, .else, elif, .endif используются для вставок программного кода в зависимости от различных условий. Директива .ifdef проверяют наличие объявления некоторого символьного имени. За директивой может следовать набор команд, которые будут подставлены в текст, если условие проверки “истина” (имя было объявлено). Директива .ifndef противоположна .ifdef проверяет отсутствие объявления символьного имени. Директива .if производит подстановку кода, когда выполняется условие сравнения, указанное в качестве ее параметра. Команды, которые должны выполняться, в случае если условие директивы .if “ложно” – располагаются после директивы .else. Ветвление типа “если” — “то” может иметь несколько уровней вложения благодаря директиве .elif. Каждый блок проверки, начинающийся с .ifdef, .ifndef, .if, должен быть закрыт директивой .endif.

Директивы if, .ifdef, .ifndef, .else, elif, .endif
Синтаксис написания:
.ifdef <символ>(или .ifndef <символ>)
.if <условие>
.else <выражение>(или .elif < условие>)
.endif
Пример использования:

Ассемблер. Переменные и Константы

Обновл. 12 Окт 2019 |

NASM предоставляет различные директивы определения для резервирования места для хранения переменных. В ассемблере директива определения используется для выделения дискового пространства. Она может использоваться для резервирования или инициализации одного/нескольких байт.

Хранения инициализированных данных

Синтаксис стейтмента выделения памяти для инициализированных данных следующий:

Где имя_переменной является идентификатором для каждого пространства для хранения. Ассемблер связывает значение смещения для каждого имени переменной, определённого в сегменте данных.

Есть 5 основных форм директивы определения:

Директива Цель Пространство для хранения
DBОпределяет ByteВыделяет 1 байт
DWОпределяет WordВыделяет 2 байта
DDОпределяет DoublewordВыделяет 4 байта
DQОпределяет QuadwordВыделяет 8 байт
DTОпределяет 10 Byte-овВыделяет 10 байт

Ниже приведены примеры использования директив определения:

Обратите внимание, что:

каждый байт символа хранится как его ASCII-значение в шестнадцатеричном формате;

каждое десятичное значение автоматически конвертируется в 16-битный двоичный эквивалент и сохраняется в виде шестнадцатеричного числа;

процессор использует прямой порядок байтов;

отрицательные числа конвертируются в форму «two’s complement»;

короткие и длинные числа типа с плавающей запятой представлены с использованием 32 или 64 бит, соответственно.

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

Результат выполнения программы выше:

Хранение неинициализированных данных

Директивы резервирования используются для резервирования пространства для неинициализированных данных. Директивы резервирования принимают один операнд, который определяет количество единиц пространства, которое будет зарезервировано. Каждая директива определения имеет связанную директиву резервирования.

Есть 5 основных форм директив резервирования:

Директива Цель
RESBРезервирует Byte
RESWРезервирует Word
RESDРезервирует Doubleword
RESQРезервирует Quadword
RESTРезервирует 10 Byte-ов

Несколько определений

Вы можете иметь несколько стейтментов определения данных в программе. Например:

Ассемблер выделяет смежную память для нескольких определений переменных.

Несколько инициализаций

Директива TIMES позволяет выполнить несколько инициализаций одного значения. Например, массив с именем marks длиной 9 может быть определён и инициализирован нулём следующим образом:

Директива TIMES полезна при определении массивов и таблиц. Следующая программа выводит на экран 9 звездочек:

Директивы ассемблера (Лекция)

1. Директивы (псевдокоманды) ассемблера

2. Регистры специальных функций i8051

3. Регистр флагов (PSW)

4. Команды арифметических операций 8051

5. Команды операций с битами микроконтроллера 8051

6. Команды операций с битами микроконтроллера 8051

1. Директивы (псевдокоманды) ассемблера

Ассемблирующая программа трансли­рует исходную программу в объектные коды. Хотя транслирующая программа берет на себя многие из рутинных задач программиста, та­ких как присвоение действительных адресов, преобразование чисел, присвоение действительных значений символьным переменным и т.п., программист все же должен указать ей некоторые параметры: началь­ный адрес прикладной программы, конец ассемблируемой программы, форматы данных и т.п. Всю эту информацию программист вставляет в исходный текст своей прикладной программы в виде псевдокоманд (директив) ассемблера, которые только управляют процессом трансля­ции и не преобразуются в коды объектной программы.

Все директивы предваряются точкой.

Псевдокоманда . ORG 10 h задает ассемблеру адрес ячейки памяти (10 h ), в которой должна быть расположена следующая за ней команда прикладной программы.

Псевдокомандой . EQU можно любому символическому имени, исполь­зуемому в программе, поставить в соответствие определенный операнд. Например, запись

приводит к тому, что в процессе ассемблирования всюду, где встретится символическое имя RED , оно будет заменено числом 13.

Символические имена операндов, переопределяемых в процессе ис­полнения программы, определяются псевдокомандой . SET :

ALFA . SET ALFA +1

Ассемблер МК51 позволяет определить символическое имя как адрес внутренних (псевдокоманда . DATA ), внешних ( . XDATA ) данных или адрес бита (псевдокоманда . BIT ). Например, директива

ERROR-FLAG .BIT 25Н.З

определяет символическое имя ERROR _ FLAG как третий бит ячейки ОЗУ с адресом 25Н.

Псевдокоманда . DB обеспечивает занесение в память программ константы, пред­ставляющей собой байт.

Псевдокомандой . END программист дает ассемблеру указание об окончании трансляции.

В результате трансляции должна быть получена карта памяти про­грамм, где каждой ячейке памяти поставлен в соответствие хранящийся в ней код.

В соответствии с форматом команд для представления их объектных кодов отводятся одна, две или три ячейки памяти программ. В первой ячейке всегда располагается код операции, во второй (а для МК51 и в третьей) – непосредственный операнд, адрес прямоадресуемого опе­ранда или смещение (для команд передачи управ­ления МК51). Для команд LCALL и LJMP во втором и третьем байтах объектного кода указывается адрес передачи управления (во втором – старшая часть, в третьем – младшая).

2. Регистры специальных функций i8051

К адресному пространству памяти данных примыкает адресное пространство регистров специальных функций SFR ( Special Function Register ).

Таблица. Размещение регистров специальных функций в пространстве SFR

Регистр расширитель аккумулятора ( Multiplication Register)

Слово состояния программы ( Program Status Word )

Регистр указатель стека ( Stack Pointer )

Старший байт регистра указателя данных DPTR ( Data Pointer High )

Младший байт регистра указателя данных DPTR ( Data Pointer Low )

Старший байт таймера 0 ()

Младший байт таймера 0 ()

Старший байт таймера 1 ()

Младший байт таймера 1 ()

Регистр режимов таймеров счетчиков (Timer/Counter Mode Control Register)

Регистр управления статуса таймеров (Timer/Counter Control Register)

Регистр приоритетов (Interrupt Priority Control Register)

Регистр маски прерывания (Interrupt Enable Register)

Регистр управления мощностью ( Power Control Register )

Регистр управления приемопередатчиком (Serial Port Control Register)

Буфер приемопередатчика ( Serial Data Buffer )

Примечание. Регистры, символ которых отмечен знаком (*), допускают адресацию своих отдельных бит при использовании команд из группы команд операций над битами.

Адреса, по которым расположены эти регистры, приведены в таблице.

Отметим, что регистры занимают только часть 128-байтового адресного пространства. Т.е. ячейки памяти с адресами 80 H -0 FFH , которые не заняты регистрами, физически отсутствуют, на кристаллах микроконтроллеров семейства 8051 при обращении к ним можно прочитать лишь код команды возврата.

Регистры специальных функций управляют работой блоков, входящих в микроконтроллер.

— Регистры-защелки SFR параллельных портов Р0. Р3 — служат для ввода-вывода информации.

— Две регистровые пары с именами TH 0, TL 0 и ТН1, TL 1 представляют собой регистры, двух программно-управляемых 16-битных таймеров-счетчиков.

— Режимы таймеров-счетчиков задаются с использованием регистра TMOD , а управление ими осуществляется с помощью регистра TCON .

— Для управления режимами энергопотребления микро-ЭВМ используется регистр PCON .

— Регистры IP и IE управляют работой системы прерываний микро-ЭВМ,

— регистры SBUF и SCON – работой приемопередатчика последовательного порта.

— Регистр-указатель стека SP в микро-ЭВМ рассматриваемого семейства – восьми битный. Он может адресовать любую область внутренней памяти данных. У микро-ЭВМ семейства 8051 стек «растет вверх», т.е. перед выполнением команды PUSH или CALL содержимое SP инкрементируется, после чего производится запись информации в стек. Соответственно при извлечении информации из стека регистр SP декрементируется после извлечения информации. В процессе инициализации микро-ЭВМ после сигнала сброса или при включении питающего напряжения в SP заносится код 07Н. Это означает, что первый элемент стека будет располагаться в ячейке памяти с адресом 08Н.

— Регистр-указатель данных DPTR чаще всего используют для фиксации 16-битного адреса в операциях обращения к внешней памяти программ и данных. С точки зрения программиста он может выступать как в виде одного 16-битного регистра, так и в виде двух независимых регистров DPL и DPH

— Аккумулятор (АСС) является источником операнда и местом фиксации результата при выполнении арифметических, логических операций и ряда операций передачи данных. Кроме того, только с использованием аккумулятора могут быть выполнены операции сдвигов, проверка на нуль, формирование флага паритета и т.п. В распоряжении пользователя имеются 8 регистров общего назначения R 0- R 7 одного из четырёх возможных банков. При выполнении многих команд в АЛУ формируется ряд признаков операции (флагов), которые фиксируются в регистре PSW .

— Регистр В используется как источник и как приемник при операциях умножения и деления, обращение к нему, как к регистру SFR , производится аналогично аккумулятору.

— При выполнении ряда команд в арифметико-логическом устройстве (АЛУ) формируются признаки операций – флаги, которые фиксируются в регистре PSW .

Ссылка на основную публикацию
Adblock
detector