Микропроцессоры и микроконтроллеры

 
 
 
«Обучение программированию не может научить быть экспертом, также как и изучение кистей и красок не может превратить кого-либо в художника.»
Eric S. Raymond
Русский | Українська


Микропроцессоры и микроконтроллеры :: Принципы программирования MSC-51 :: Правила записи программ на языке Ассемблер

Правила записи программ на языке Ассемблер

Каждая команда представляет собой строку такой конструкции:

[ МЕТКА: ] мнемокод операции операнд(ы) [ ; комментарии ]

[ ] - поле может отсутствовать.

МЕТКА - символическое имя ячейки памяти, начиная с которой размещается в памяти данная команда.

В качестве ОПЕРАНДОВ могут использоваться числа (адреса и данные), зарезервированные и определенные символические имена.

Для указания системы счисления, в которой задается число, используют буквенные индексы после самого числа: 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 Гц !), что бывает важно в системах реального времени.