
- •Программирование микроконтроллеров mcs-51
- •Учебное издание
- •Предисловие
- •1.1. Микроконтроллеры фирмы Intel
- •1.2. Микроконтроллеры фирмы Philips
- •1.3. Микроконтроллеры фирм Siemens, Atmel
- •2.1. Программная модель микроконтроллера 8051
- •2.2. Ассемблерный язык микроконтроллера 8051
- •2.2.1. Система команд языка асм51
- •2.2.2. Директивы языка асм51
- •Include операнды
- •3.1. Этапы проектирования ппо
- •3.2. Кросс-ассемблер x8051
- •3.3. Кросс-редактор связей Link
- •3.4. Примеры микроконтроллерных программ
- •Оглавление
- •Глава 1. Состав семейства mcs-51. . . . . . . 5
- •Глава 2. Особенности программирования
- •Глава 3. Технология разработки прикладного
2.2. Ассемблерный язык микроконтроллера 8051
Для эффективной разработки прикладного программного обеспечения микропроцессоров и микроконтроллеров необходимо выбрать подходящий язык программирования. Если требуется не очень сложная и при этом быстрая и компактная программа, которая не содержит сложных вычислительных операций, то для ее написания лучше выбрать язык низкого уровня (язык ассемблера). Язык высокого уровня (ЯВУ) следует выбрать в том случае, если необходимо производить сложные вычисления: операции над 16-, 32-разрядными числами, числами с плавающей точкой и др. Очень часто наиболее подходящей является смешанная модель, где критичные к быстродействию части программы написаны на ассемблере, а вычислительные процедуры реализованы на ЯВУ, например, на Си.
Изучение языков программирования целесообразнее всего начинать с ассемблера, поскольку он дает наглядное представление о функционировании аппаратной части целевого микропроцессора (микропроцессора для которого разрабатывается прикладная программа), что в конечном счете обеспечивает получение оптимальных схемотехнических решений разрабатываемой микропроцессорной техники. Язык ассемблера относится к группе машинно-ориентированных языков. Иначе говоря, каждому типу микропроцессоров или микроконтроллеров соответствует свой ассемблерный язык.
Оператором языка ассемблера микроконтроллера 8051 (языка АСМ51) является строка исходного текста микроконтроллерной программы (МК-программы), имеющая следующий формат:
-
метка
команда/ директива
;комментарий
операция операнды
Поле команда/ директива является главным полем строки и состоит из поля операция и поля операнды, разделенных пробелом.
Поле операция содержит мнемоническое обозначение команды или директивы ассемблера, которое является сокращением (аббревиатурой) полного английского наименования выполняемого действия. Например: MOV - move - переслать, JMP - jump - перейти, DB - define byte - определить байт. Кроме того, поле операция может содержать символическое имя ассемблерной макрокоманды.
Поле операнды зависит от поля операция и может указывать группу разделенных запятой операндов, либо может быть исключено вообще.
Операнды ассемблерных команд определяют тип используемых данных (бит, байт, 2-байтовое слово), способ адресации этих данных и адреса переходов в области памяти программ микроконтроллера. Различают следующие способы адресации данных: регистровый, прямой, косвенно-регистровый и непосредственный.
Регистровая адресация обеспечивает обращение к байтовому содержимому регистров A, B или регистров R0-R7 выбранного банка, к 2-байтовому содержимому регистра DPTR и к битовому содержимому флага переноса C, при этом в качестве операндов используются принятые имена перечисленных программно доступных элементов, а также символические имена (только для регистров R0-R7), определяемые пользователем.
Прямая адресация применяется для обращения к байтовому содержимому 128-ми ячеек резидентной памяти данных или 21-го регистра специальных функций, а также к битовому содержимому 16-ти ячеек РПД или 11-ти РСФ, допускающих побитовое обращение (рис.2). При прямой адресации данных в поле операнды указывается прямой адрес используемых ячейки РПД, регистра специальных функций или бита. Этот адрес может быть задан числом, символическим именем, выражением, именем (только для РСФ и битов РСФ). Имена регистров специальных функций приведены в табл.2.1, а имена битов РСФ - в табл.2.3, табл.2.5-2.8. Кроме того, имя бита РСФ может быть представлено структурой вида: имя РСФ.номер бита. Например, имя пятого бита регистра TCON можно записать как TCON.5, имя второго бита аккумулятора - как A.2 и т.д.
С помощью косвенно-регистровой адресации обеспечивается обращение к байтовому содержимому 128-ми ячеек РПД, при этом адрес используемой ячейки определяется содержимым указателя стека SP или одного из регистров R0, R1 выбранного банка. Косвенно-регистровая адресация используется также для обращения к внешней памяти данных. В этом случае регистром-указателем может быть 16-разрядный указатель данных DPTR или один из упомянутых выше регистров R0, R1. Для работы с данными, "зашитыми" в виде констант в память программ микроконтроллера, применяется косвенно-регистровая адресация по сумме: базовый регистр (содержимое DPTR или программного счетчика PC) плюс индексный регистр (содержимое аккумулятора A). Любая такая константа может быть выбрана по адресу, который вычисляется сложением содержимого DPTR (PC) с содержимым A. Операнд, определяющий косвенно-регистровую адресацию данных, задается именем регистра-указателя или символическим именем (только для R0 и R1) с обязательным префиксом @.
При непосредственной адресации данные, предназначенные для обработки, непосредственно указываются в поле операнды и могут быть представлены в нем числом, символическим именем или выражением с обязательным префиксом #.
Аналогичным образом (за исключением префикса #) представляется операнд, определяющий адрес перехода в памяти программ микроконтроллера.
В качестве операндов ассемблерных директив и макрокоманд обычно используются числа, символические имена, выражения, имена программно доступных элементов микроконтроллера (только для директивы REG и макрокоманд), а в ряде случаев мнемоники языка АСМ51 (только для макрокоманд).
Символические имена, являющиеся операндами команд или директив, должны быть обязательно определены с помощью соответствующих директив (EQU, VAR или REG) языка АСМ51. Кроме того, символическое имя адреса в памяти программ может быть определено использованием этого имени в поле метка одной из строк исходного текста МК-программы. Отметим, что корректное символическое имя должно быть представлено комбинацией букв латинского алфавита и цифр и начинаться с буквы, при этом указанная комбинация допускает использование символа подчеркивания.
Применяемые в качестве операндов числа приводятся с указанием системы счисления (СС), для чего используется суффикс (латинская буква, стоящая после числа): B - для двоичной СС, Q - для восьмеричной СС, D - и H - соответственно для десятичной и шестнадцатеричной СС. Число без суффикса считается десятичным.
Выражение, используемое в поле операнды, вычисляется в процессе трансляции исходной МК-программы и представляет собой совокупность символических имен и (или) чисел (в формате 2-байтовых слов), содержащую следующие основные операторы:
"+" - сложение (третий уровень приоритета);
"-" - вычитание (третий уровень приоритета);
"" - умножение (четвертый уровень приоритета);
"/" - деление (четвертый уровень приоритета);
"" - возведение в степень (пятый уровень приоритета);
.OR. - ИЛИ (первый уровень приоритета);
.AND. - И (второй уровень приоритета);
.XOR. - исключающее ИЛИ (первый уровень приоритета);
.NOT. - отрицание (шестой уровень приоритета);
"<" (">") - выделение младшего (старшего) байта 2-байтового слова (шестой уровень приоритета).
Оператор с более высоким уровнем приоритета выполняется в первую очередь. Если в выражении присутствуют операторы с одинаковым уровнем приоритета, то вычисления производятся слева направо. Чтобы изменить указанный порядок выполнения расчетов допускается использовать скобки. В качестве примера приведем выражение <.NOT.13H+1, реализующее процедуру преобразования числа 13H в дополнительный код и эквивалентное числу 0EDH, которое будет получено при трансляции исходной МК-программы.
Поле метка не является обязательным, отделяется от поля команда/ директива пробелом и может содержать символическое имя непосредственных данных, одного из регистров R0-R7, прямого адреса, макрорасширения или адреса перехода в памяти программ. Если метка заканчивается двоеточием, то она может быть расположена в любом месте строки, в противном случае метка должна начинаться в начале строки.
Поле комментарий содержит пояснения различного характера - может объяснять применение той или иной команды или директивы, содержать описание алгоритма участка или МК-программы в целом и др. Это поле не является обязательным и при использовании должно начинаться символом ;.