Правила записи программ на языке Ассемблер
Каждая команда представляет собой строку такой конструкции:
[ МЕТКА: ] мнемокод операции операнд(ы) [ ; комментарии ]
[ ] - поле может отсутствовать.
МЕТКА - символическое имя ячейки памяти, начиная с которой размещается в памяти данная команда.
В качестве ОПЕРАНДОВ могут использоваться числа (адреса и данные), зарезервированные и определенные символические имена.
Для указания системы счисления, в которой задается число, используют буквенные индексы после самого числа: B - двоичная, Q - восьмеричная, D или ничего - десятичная, H - шестнадцатеричная.
КОММЕНТАРИИ - любые символы.
Понятие об Ассемблере
Ассемблер - это программное средство, предназначенное для преобразования исходного текста программы, содержащего мнемонические имена команд и операндов, в последовательность двоичных кодов, которые представляют собой исполняемые команды для процессора.
Таким образом, входная информация для Ассемблера представляется в виде текстового файла, а исходная информация генерируется в виде так называемого файла ОБЪЕКТНЫХ кодов (объектного файла). Кроме этого, Ассемблер выполняет проверку корректного написания команд. Иногда его называют компилятором (транслятором) с языка Ассемблер.
В результате работы Ассемблера есть возможность кроме объектного файла получить также файл ЛИСТИНГА, который содержит текстовую информацию о размещении кодов команд и данных по конкретным адресам памяти микроконтроллера или микропроцессорной системы.
Программа на языке Ассемблера состоит из логических сегментов - блоков из элементов одного типа (команды, данные). Для МК51 эти логические сегменты непосредственно соответствуют физическим областям памяти (РПП, ВПП, РПД, ВПД, битовая область).
Для указания адресов команд и данных или значений данных удобно использовать символические имена (далее - просто имена), которые отвечают физическому или математическому содержанию задачи. Использование имен делает программу более понятной для программиста и его коллег, облегчает процесс модификации программы и ее отладку. Имя может начинаться с буквы и содержать не более 32 символов.
Для сегментного построения программы и определения символических имен адресов и значений данных используют ДИРЕКТИВЫ Ассемблера. Директивы Ассемблера не являются исполняемыми командами, а представляют собой инструкции для компилятора по размещению команд и данных в памяти МК или МПС.
СТРУКТУРА ПРОГРАММЫ: программа на языке Ассемблер содержит такие блоки:
- ДЕКЛАРАТИВНАЯ часть - описание символических имен данных и адресов, которые используют в программе, а также директивы выделения памяти для переменных и указания значений констант (посредством директивы Ассемблера);
- блок ИНИЦИАЛИЗАЦИИ - настройка портов и блоков периферийных функций на необходимые режимы работы, инициализация стека (посредством команд);
- блок РЕАЛИЗАЦИИ алгоритмов и функций управления (посредством команд).
Директивы определения символических имен
Директива EQU - любому имени ставится в соответствие операнд.
Формат директивы: <имя> EQU <выражение>
Например: z1 equ 10
z2 equ z1 + 4
z3 equ z1 + z2 + 5
Имена, определенные директивой EQU, можно использовать как адрес кода, адрес данных (внутренних или внешних) или значение данных. Например:
MOV A, #z1; Загрузка числа 10 в аккумулятор
MOV A, z1; Пересылка в аккумулятор из ячейки с адресом 0AH
Операторы, допустимые для использования в выражениях в директивах Ассемблера, описаны далее.
Директива DATA - задает имя для адреса данных в РПД.
Формат директивы: <имя> DATA <адресное выражение>
Директива XDATA – задает имя для адреса внешних данных (ВПД).
Формат директивы: <имя> XDATA <адресное выражение>
Директива BIT - задает имя для адреса бита из области внутреннего ОЗУ с битовой адресацией.
Формат директивы: <имя> BIT <адрес бита>
Например: control DATA 2AH
f1 bit control.3 ; Адрес в виде битового селектора
f2 bit f1 + 4 ; Адресное выражение
f3 bit 60H ; Абсолютный адрес
Примеры удобного использования символических имен:
counter DATA 20H flag BIT P1.7
. . . on BIT 30H
MOV counter, 10 . . .
m1: < действия в цикле > SETB on
. . . wait: JNB flag, wait
DJNZ counter, m1 CLR on
Счетчик адресов (не путать со счетчиком команд (PC))
В процессе компиляции Ассемблер с каждым сегментом связывает свою внутреннюю переменную, называемую счетчиком адресов. В этой переменной подсчитывается, сколько байтов отведено в памяти под каждую команду или число и, соответственно, по какому адресу будет размещена следующая команда или число. Таким образом, счетчик адресов «следит» за размещением в памяти кодов команд и данных.
Метка команды – это, по сути, символическое имя адреса ячейки памяти, начиная с которой данная команда размещена в памяти.
Метки команд связываются с адресами автоматически в процессе компиляции, и специальных директив для этого не существует.
Директивы управления сегментами программы
Появление в тексте программы этих директив означает, что размещенные далее команды или данные относятся к сегменту (типу) памяти, указанному директивой:
CSEG - начало сегмента кодов (память программ);
DSEG - начало сегмента данных в ОЗУ РПД;
XSEG - начало сегмента внешних данных (ВПД).
Управление значением счетчика адресов
При первом появлении в тексте программы любой из директив управления сегментами Ассемблер создает новый счетчик адресов для этого сегмента и устанавливает его в нуль. При повторном открытии сегмента продолжается счет от предшествующего значения.
Существует директива ORG, которая позволяет программисту устанавливать нужные значения счетчика адреса для текущего активного сегмента и таким образом размещать коды в памяти по нужным адресам.
Формат директивы: ORG < адресное выражение >
Директивы инициализации памяти DB, DW заполняют байт или слово (2 байты) указанным значением. Используют для размещения значений констант в сегменте кодов (т.е. в памяти программ):
[ имя: ] DB <значение> [ имя: ] DW <значение>
Директива резервирования (выделения) памяти DS для переменной в сегменте внешних или внутренних данных (ВПД или ОЗУ РПД):
[ имя: ] DS <количество байтов>
END - директива определения конца программного модуля.
Операторы периода трансляции
Для удобства записи команд и директив в языке Ассемблер допускается задавать числовые значения и адреса памяти в виде выражений, которые вычисляются. Значение такого выражения будет определено компилятором еще во время трансляции, а в код команды будет подставляться только результат этих действий. Допустимыми операциями являются: +, -, *, /, (), AND, OR, XOR, NOT, LOW - выделение младшего байта, HIGH - выделение старшего байта из двухбайтового выражения.
Например:
1) X equ 10 ; число X = 10
Y equ X + 2 ; число Y = 12
Z equ (X + Y) * 4 ; число Z = 88
2) DSEG
org 70H
V1: ds 4 ; Выделение памяти для четырехбайтовой переменной
. . .
MOV A, V1+1 ; Чтение в ACC другого байта переменной V1
3) X equ 3704 ; Объявление двухбайтового числа
. . .
MOV R0, #LOW(X) ; Запись младшего байта X в регистр R0
MOV R1, #HIGH(X) ; Запись старшего байта X в регистр R1
В данных материалах представленные только те директивы Ассемблера, которые будут использоваться в программах для лабораторных работ.
Полный перечень команд МК51 с необходимыми комментариями и указанием особенностей использования представлен в пособии в пособии, а также в специальном буклете, предоставляемом студентам на лабораторных работах.
В настоящее время значительный сегмент рынка однокристальных микроконтроллеров занимает продукция фирмы Atmel. Отличительная особенность фирмы – широкое использование высококачественной Flash – технологии, которая в последнее десятилетие вытесняет традиционные EPROM.
Основные характеристики новейших микроконтроллеров семейства 8051 фирмы Atmel :
Основные характеристики новейших микроконтроллеров семейства 8051 фирмы Atmel :
- использование базового ядра 80С51;
- предельно низкие цены на микроконтроллеры (единицы долларов);
- микроконтроллеры с каналом SPI (serial programming interface), обеспечивающие возможность внутрисхемного программирования Flash-памяти; эта функция очень удобна в производстве, особенно мелкосерийном, когда физическое программирование контроллеров выполняется после их монтажа;
- внутренняя память данных на базе EEPROM (т.н. Flash-память данных), обеспечивающая хранение оперативных данных при отключении питания микросхем контроллеров; запись в такое энергонезависимое ОЗУ происходит несколько дольше, чем в обычные ячейки внутрикристального ОЗУ;
- возможность работы на низких тактовых частотах (вплоть до 0 Гц !), что бывает важно в системах реального времени.
|