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

 
 
 
«Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.»
Brian W. Kernighan.
Русский | Українська


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