При этом с точки зрения структурного программирования использовать подпрограмму имеет смысл даже в том случае, когда действие будет выполняться только один раз! Выполняемое алгоритмическое действие отображается в названии подпрограммы, поэтому программу можно читать по названиям подпрограмм. Человеческий глаз может охватить большую часть алгоритма, а значит, программа будет более понятна, что приведет к более быстрому завершению ее отладки. Программы, понятные при чтении исходного текста программы, часто называют самодокументирующимися.
На момент написания алгоритма (и программы) верхнего уровня нас не интересует, как будут решаться задачи, зато очень интересуют взаимосвязи между ними. Поэтому первоначально вместо законченных подпрограмм можно (и нужно) использовать подпрограммы-заглушки. Использование подпрограмм-заглушек позволяет отработать взаимодействие между задачами, убедиться, что все они выполняются в нужной последовательности и именно тогда, когда возникает необходимость в решении данной конкретной задачи.
Для взаимодействия между задачами обычно используются глобальные переменные. Эти переменные и вводятся на верхнем уровне программы.
Если переменные отвечают за переключение между задачами, то изменение переменных производят вручную в отладчике программ. Затем при пошаговой отладке проверяют, вызывается ли подпрограмма, отвечающая за выполнение поставленной задачи, и не вызываются ли при этом лишние подпрограммы.
После завершения отладки верхнего уровня программы приступают к написанию и отладке каждой из подпрограмм-заглушек, т. е. к превращению подпрограмм-заглушек в законченные подпрограммы. При этом, т. к. программа верхнего уровня уже отлажена, то решается только задача, выполняемая отлаживаемой в данный момент подпрограммой. Особенно тщательно отслеживается взаимодействие с программой верхнего уровня для того, чтобы не нарушить логику ее работы. Одновременно отрабатывается взаимодействие с подпрограммами более нижнего, по сравнению с отлаживаемым, уровня.
Пример реализации линейной цепочки операторов на языке программирования ASM-51 приведен в листинге 8.19.
Вторая структурная конструкция управления — условное выполнение оператора. Как уже рассматривалось в предыдущей главе, эта конструкция может быть двух видов — с одной ветвью и с двумя ветвями.
Если реализуется конструкция условного выполнения оператора только с одной ветвью, то можно воспользоваться любой командой условного перехода, входящей в набор команд микроконтроллера. Соответствующий пример приведен в листинге 8.20. В приведенном примере переменная
Полная конструкция условного выполнения операторов реализуется на языке ассемблера более сложным образом. Для этого потребуются уже две команды перехода. Для проверки результата логического выражения используется команда условного перехода. Чтобы исключить выполнение второй ветви, потребуется команда безусловного перехода. Пример реализации полной конструкции условного выполнения операторов приведен в листинге 8.21.
Третья структурная конструкция — это цикл с проверкой условия после тела цикла. Такая конструкция легко реализуется на ассемблере при помощи одной команды условного или безусловного перехода. Отличие этой конструкции от условного выполнения операторов заключается в том, что передача управления осуществляется не вперед, а назад. Однако в системе команд микроконтроллера MCS-51 для реализации цикла предусмотрена специальная команда, выполняющая сразу два алгоритмических действия, необходимых для реализации цикла, — DJNZ. Пример использования этой команды для реализации цикла с проверкой условия после тела цикла приведен в листинге 8.22.
Четвертая структурная конструкция управления — это цикл с проверкой условия до тела цикла. В отличие от предыдущего варианта цикла, тело цикла в данном случае может ни разу не выполниться, если условие цикла сразу же выполнено. Этот цикл, как и конструкцию условного выполнения операторов, невозможно реализовать при помощи одной машинной команды. Дополнительно потребуется команда безусловного перехода.
Пример реализации цикла с проверкой условия до тела цикла приведен в листинге 8.23.
Как это обсуждалось в предыдущей главе, разбиение исходного текста программы на отдельные модули делает его более понятным для программиста или нескольких программистов, участвующих в создании программного продукта. Язык программирования ASM-51 позволяет писать многомодульные программы. Однако каждый модуль программы должен быть оформлен соответствующим образом.