Структурное программирование на языке ASM-51
Применение структурного программирования позволяет увеличить скорость написания программ и облегчить их отладку. Языки программирования С, PASCAL, PL/M разрабатывались на основе принципов структурного программирования, поэтому в состав этих языков входят структурные операторы. Ассемблер не относится к структурированным языкам программирования. Тем не менее, структурное программирование возможно и на языках программирования низкого уровня, в том числе и на языке программирования ASM-51, где не предусмотрено структурных операторов.
При разработке программы с использованием методов структурного программирования она может быть оттранслирована и выполнена на любом этапе написания, при этом можно отследить все алгоритмические действия программы, реализованные к этому времени. При использовании методов структурного программирования процесс написания программы не отличается от процесса создания алгоритма. Более того! Эти этапы создания программы можно объединить!
Для реализации методов структурного программирования огромное значение имеет использование "говорящих" меток, обозначаемых не просто M0, M1 и т. д., а в названии которых отображается действие, выполняемое программой. Для людей, не владеющих иностранным языком, ограничение в использовании для назначения меток букв только латинского алфавита создает определенные трудности. Однако, используя транслитерацию, и латинскими буквами можно писать русские слова.
При этом для обозначения действия может потребоваться несколько слов, использование же пробелов внутри метки недопустимо! Выйти из такой ситуации можно двумя способами:
- применять специальные символы-разделители;
- начинать каждое новое слово внутри метки с буквы верхнего регистра.
В качестве разделителей внутри метки можно использовать символы подчеркивания (_) и вопроса (?). Примеры назначения "говорящих" меток:
Priem_Comandy ;Использование символов-разделителей
ProveritBitGotovnosti ;Использование букв верхнего регистра
Надо сказать, что в языке программирования ассемблер роль метки исключительно важна. Метка используется для обозначения переменных и констант, а также имен подпрограмм и программных модулей.
Одна из основных идей структурного программирования заключаются в том, чтобы использовать только четыре структурных конструкции управления. При помощи этих структурных конструкций управления можно построить сколь угодно сложную программу.
Наиболее распространенная структурная конструкция управления - линейная цепочка операторов. Любая задача может быть разбита на несколько более простых подзадач. Выполнение подзадач лучше оформить как вызов подпрограмм, в названии которых можно (и нужно) отразить подзадачу, которую решает эта подпрограмма. Например:
ProchitatPort ;Прочитать порт
Vklychitlndikator ;Включить индикатор
При этом с точки зрения структурного программирования использовать подпрограмму имеет смысл даже в том случае, когда действие будет выполняться только один раз! Выполняемое алгоритмическое действие отображается в названии подпрограммы, поэтому программу можно читать по названиям подпрограмм. Человеческий глаз может охватить большую часть алгоритма, а значит, программа будет более понятна, что приведет к более быстрому завершению ее отладки. Программы, понятные при чтении исходного текста программы, часто называют самодокументирующимися.
На момент написания алгоритма (и программы) верхнего уровня нас не интересует, как будут решаться задачи, зато очень интересуют взаимосвязи между ними. Поэтому первоначально вместо законченных подпрограмм можно (и нужно) использовать подпрограммы-заглушки. Использование подпрограмм-заглушек позволяет отработать взаимодействие между задачами, убедиться, что все они выполняются в нужной последовательности и именно тогда, когда возникает необходимость в решении данной конкретной задачи.
Для взаимодействия между задачами обычно используются глобальные переменные. Эти переменные и вводятся на верхнем уровне программы.
Если переменные отвечают за переключение между задачами, то изменение переменных производят вручную в отладчике программ. Затем при пошаговой отладке проверяют, вызывается ли подпрограмма, отвечающая за выполнение поставленной задачи, и не вызываются ли при этом лишние подпрограммы.
После завершения отладки верхнего уровня программы приступают к написанию и отладке каждой из подпрограмм-заглушек, т. е. к превращению подпрограмм-заглушек в законченные подпрограммы. При этом, т. к. программа верхнего уровня уже отлажена, то решается только задача, выполняемая отлаживаемой в данный момент подпрограммой. Особенно тщательно отслеживается взаимодействие с программой верхнего уровня для того, чтобы не нарушить логику ее работы. Одновременно отрабатывается взаимодействие с подпрограммами более нижнего, по сравнению с отлаживаемым, уровня.
Пример реализации линейной цепочки операторов на языке программирования ASM-51 приведен в листинге 8.19.

Вторая структурная конструкция управления - условное выполнение оператора. Как уже рассматривалось в предыдущей главе, эта конструкция может быть двух видов - с одной ветвью и с двумя ветвями.
Если реализуется конструкция условного выполнения оператора только с одной ветвью, то можно воспользоваться любой командой условного перехода, входящей в набор команд микроконтроллера. Соответствующий пример приведен в листинге 8.20. В приведенном примере переменная SV1 и константа NajKnZvezd должны быть объявлены ранее (например, при помощи директивы equ).

Полная конструкция условного выполнения операторов реализуется на языке ассемблера более сложным образом. Для этого потребуются уже две команды перехода. Для проверки результата логического выражения используется команда условного перехода. Чтобы исключить выполнение второй ветви, потребуется команда безусловного перехода. Пример реализации полной конструкции условного выполнения операторов приведен в листинге 8.21.

Третья структурная конструкция - это цикл с проверкой условия после тела цикла. Такая конструкция легко реализуется на ассемблере при помощи одной команды условного или безусловного перехода. Отличие этой конструкции от условного выполнения операторов заключается в том, что передача управления осуществляется не вперед, а назад. Однако в системе команд микроконтроллера MCS-51 для реализации цикла предусмотрена специальная команда, выполняющая сразу два алгоритмических действия, необходимых для реализации цикла, - DJNZ. Пример использования этой команды для реализации цикла с проверкой условия после тела цикла приведен в листинге 8.22.

Четвертая структурная конструкция управления - это цикл с проверкой условия до тела цикла. В отличие от предыдущего варианта цикла, тело цикла в данном случае может ни разу не выполниться, если условие цикла сразу же выполнено. Этот цикл, как и конструкцию условного выполнения операторов, невозможно реализовать при помощи одной машинной команды. Дополнительно потребуется команда безусловного перехода.
Пример реализации цикла с проверкой условия до тела цикла приведен в листинге 8.23.
