- •Эрни Каспер Программирование на языке Ассемблера для микроконтроллеров семейства i8051
- •1.Что нужно знать программисту о микроконтроллерах семейства i8051
- •1.1.Общие сведения об архитектуре i8051
- •1.2.Правила записи команд микроконтроллера семейства i8051 на Ассемблере
- •1.3.Форматы и способы адресации данных
- •1.4.Форматы и способы адресации команд
- •1.5.Команды пересылки информации
- •1.6.Команды поразрядной обработки информации
- •1.7.Команды арифметических операций
- •1.8.Управляющие команды
- •2.Директивы ассемблера для микроконтроллеров семейства i8051
- •2.1.Общие понятия о процессах трансляции и компоновки
- •2.2.Обработка имен транслятором и компоновщиком
- •2.3.Директивы резервирования памяти и инициализации данных
- •2.4.Использование выражений в операндах
- •2.5.Директивы условной трансляции
- •2.6.Директивы подстановок
- •2.7.Директивы управления вводом и выводом
- •Глава 3.
- •3.Кросс-средства фирмы 2500 a.D. Software, Inc. Для семейства i8051
- •Глава 4
- •4.Программирование арифметических действий
- •4.1.Кодирование информации в микроконтроллере
- •4.2.Арифметические действия с большими числами
- •4.3.Арифметические действия с отрицательными числами
- •4.4.Контроль точности при программировании арифметических операций
- •Глава 5
- •5.Программирование вычисления функций
- •5.1.Возведение в квадрат и извлечение квадратного корня
- •5.2.Переход от десятичной системы счисления к двоичной и обратно
- •5.3.Вычисление функций при помощи таблиц
- •5.4.Вычисление обратной функции по таблице прямой функции
- •5.5.Компенсация систематических погрешностей при помощи таблиц
- •Глава 6
- •6.Программирование фильтрации сигналов
- •6.1.Особенности цифровой фильтрации сигналов
- •6.2.Программирование простейших фильтров нижних частот
- •6.3.Программирование фильтра для оценки параметров сигнала
- •6.4.Программирование медианного фильтра
- •Глава 7
- •7.Программирование взаимодействия с внешними устройствами
- •7.1.Общие вопросы взаимодействия
- •7.2.Порядок выполнения прерываний в микроконтроллерах семейства i8051.
- •7.3.Синхронизация работы программы внешним или внутренним сигналом
- •7.4.Программирование приема информации от датчиков
- •7.5.Программирование выдачи команд на исполнительные устройства
- •7.6.Программирование ввода и вывода информации для пользователя
- •8.Несколько рекомендаций о стиле программирования
- •8.1.Стиль программирования и использование ресурсов
- •8.2.Оформление исходного текста программы
- •8.3.Системы обозначений, выражения и простые подстановки
- •8.4.Применение подпрограмм и сложных текстовых подстановок
1.2.Правила записи команд микроконтроллера семейства i8051 на Ассемблере
В стародавние времена для начала работы по программированию после описания архитектуры достаточно было привести подробную информацию о машинных кодах команд. Тогда программы записывались только на машинном языке. Такой способ разработки программ называется программированием в кодах (в жаргоне американских программистов по-прежнему используется термин "coding"). Запись восьмеричных или шестнадцатеричных кодов производилась на бланках, разбитых вертикальными линиями на колонки (графы). Каждая команда записывалась в одной строке. Первая графа была предназначена для адреса команды или числа. При записи команды во второй графе помещался код операции, а в следующих графах — адреса или значения операндов. Запись числа производилась в соответствии с его форматом. В бланке также отводилась графа для комментариев.
Ныне программирование в кодах вытеснено программированием на языках. Для программирования микроконтроллеров семейства i8051 можно использовать языки Ассемблер и усеченные Си и Паскаль. Интересно отметить, что даже проект новомодного языка Java начинался применительно к микроконтроллерам. Алгоритмические языки программирования имеют явные преимущества перед программированием в кодах благодаря применению символических имен. При выборе языка для программирования микроконтроллеров следует учесть ограничения на языки высокого уровня, накладываемые малым объемом ОЗУ, а в некоторых случаях и ПЗУ. В отличие от Ассемблера, для которого используется трансляция команд, записанных в символическом виде, языки высокого уровня используют компиляцию более сложных операторов, вместо которых подставляются стандартные заготовки из нескольких (иногда десятков) команд. Полученная таким образом программа далеко не оптимальна по быстродействию и требуемому объему памяти. Последующая за компиляцией оптимизация программы не позволяет достичь такой экономии ресурсов, какая получается при программировании на Ассемблере.
Алфавит Ассемблера состоит из прописных и строчных латинских букв, из цифр, знаков препинания и некоторых других символов, которые перечислены ниже в порядке возрастания их ASCII кода:
!#"$%&>()*•+,-./
0123456789:
;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ
[ \ ] ^ _ '
abcdefghijklmno
pqrstuvwxyz{ | } ~
Кроме того, транслятор воспринимает символы, не имеющие отображения (пробел, табуляцию и пару символов - возврат каретки и перевод строки), но изменяющих положение следующих за ними символов текста. Транслятор производит грамматический разбор текста построчно. Каждая строка (аналог предложения) делится на лексемы (аналоги слов). В Ассемблере имеются лексемы 5 видов: специальные символы, имена (идентификаторы), числовые литералы, строковые литералы и комментарии. Специальные символы служат для обозначения операций в выражениях и в качестве разделителей других лексем.
Ассемблер не является языком свободной формы. Синтаксис Ассемблера в части записи операторов следует таким же правилам, какие применялись для программирования в кодах. Каждый оператор Ассемблера также занимает одну строку, состоящую из четырех полей:
поле_метки поле_мнемокода поле_операндов ; поле комментариев
В качестве разделителей между полями можно использовать пробелы (не меньше одного) или знаки табуляции. В качестве разделителей между операндами (если их два или больше) используется запятая. Поле метки заполняется только в том случае, если в программе нужно сделать ссылку на данную строку. Поле мнемокода должно быть заполнено обязательно, так как в нем записывается производимое оператором действие. Необходимость записи в поле операндов зависит от мнемокода. Поле комментариев транслятору не нужно, поэтому остаток строки после точки с запятой не обрабатывается. Эта часть исходного текста существенна только для программиста. Поэтому в поле комментария можно использовать любые символы с кодом ASCII не меньше 20h, в том числе и русские буквы. Строка должна заканчиваться парой символов - возврата каретки и перевода строки.
В данной главе все команды микроконтроллера описаны в терминах Ассемблера. Полный перечень машинных кодов команд с соответствующими им символическими записями на Ассемблере приведен в Приложении 1. Во избежание опечаток текст приложения был получен как листинг трансляции программы, не имеющей алгоритмического смысла, за исключением того, что команды размещены в порядке увеличения кодов операций машинных команд.
В Приложении 2 приведен список команд в алфавитном порядке, которую автор рекомендует программистам использовать в качестве шпаргалки при повседневной работе. Для уменьшения объема этого списка команды сначала были сгруппированы по адресу приемника. При этом для обозначения выбора адреса источника было использовано стандартное синтаксическое обозначение с фигурными скобками и разделителем в виде вертикальной черты. Затем текст был сжат за счет использования стандартного синтаксического обозначения необязательного элемента, заключенного в квадратные скобки. В поле комментариев каждой команды приводится ее назначение, а за списком команд следуют пояснения условных обозначений. При дальнейшем чтении этой главы рекомендуется в качестве упражнения ознакомиться с обоими приложениями.