Структурное программирование на языке Assembler
Применение структурного программирования позволяет увеличить скорость написания программ и облегчить отладку написанной программы. Языки программирования C, PASCAL, PL/M разрабатывались на основе принципов структурного программирования, поэтому в состав этих языков программирования входят структурные операторы. Тем не менее структурное программирование возможно и на языках программирования низкого уровня в том числе и на языке программирования ASM-51, где не предусмотрено структурных операторов.
При написании программы с использование методов структурного программирования эта программа может быть оттранслирована и выполнена на любом этапе написания программы, при этом можно отследить все алгоритмические действия программы, написанные к этому времени. При использовании методов структурного программирования процесс написания программы не отличается от процесса создания алгоритма. Более того, эти этапы создания программы можно объединить.
Для реализации методов структурного программирования огромное значение имеет использование "говорящих меток", когда метки обозначаются не просто M0, M1 и т.д., а в названии метки отображается действие, выполняемое программой. Для людей, не владеющих иностранным языком ограничение в использовании для назначения меток букв только латинского алфавита создаёт определённые трудности. Тем не менее и латинскими буквами можно писать русские слова! При этом для обозначения действия может потребоваться несколько слов, использование же пробелов внутри метки недопустимо! Выйти из такой ситуации можно двумя способами:
использование специальных символов-разделителей;
начинать каждое новое слово внутри метки с буквы верхнего регистра
В качестве символов-разделителей можно использовать символы подчёркивания '_' и вопроса '?' Примеры назначения говорящих меток:
Надо сказать, что в языке программирования ассемблер роль метки исключительно важна. Метка используется для обозначения переменных и констант, а также имён подпрограмм и программных модулей.
Основная идея структурного программирования заключаются в том, что существует только четыре структурных оператора. Используя эти структурные операторы можно построить сколь угодно сложную программу.
Наиболее распространённый структурный оператор называется линейная цепочка операторов. Любая задача может быть разбита на несколько подзадач. Выполнение подзадач лучше оформить как подпрограмму, в названии которой можно (и нужно) отразить подзадачу, которую должна решать эта подпрограмма. Например:
При этом с точки зрения структурного программирования использовать подпрограмму имеет смысл даже тогда, когда действие будет выполняться только один раз! Выполняемое алгоритмическое действие отображается в названии подпрограммы, поэтому программу можно читать по названиям подпрограмм. Человеческий глаз может охватить большую часть алгоритма, а значит программа будет более понятна, что приведёт к более быстрому завершению отладки программы. Программы, понятные при чтении исходного текста программы, часто называют самодокументирующимися.
На момент написания алгоритма (и программы) верхнего уровня нас не интересует, как будет решаться эта задача, поэтому вместо настоящей подпрограммы поставим подпрограмму-заглушку. Пример подобной программы приведён на рисунке 1.
Рисунок V.2.1. Пример использования подпрограмм для структурирования программы, написанной на языке программирования ASM-51.
Второй структурный оператор - условный оператор. Если условный оператор реализуется только с одним плечом, то для его реализации можно воспользоваться любой командой условного перехода. Пример использования команд условного перехода для реализации условного оператора с одним плечом приведён на рисунке V.2.2.
Рисунок V.2.2. Пример использования команд условного перехода для реализации условного оператора с одним плечом.
Полная схема условного оператора реализуется на языке ассемблер более сложным образом. Для реализации такого оператора потребуется уже две команды микроконтроллера. Для исключения выполнения второго плеча условного оператора потребуется команда безусловного перехода. Пример реализации условного оператора приведён на рисунке V.2.3.
Рисунок V.2.3. Пример реализации условного оператора на языке программирования ASM-51.
Третий структурный оператор - это оператор цикла с проверкой условия после тела цикла Такой оператор легко реализуется на языке программирования ассемблер при помощи команды условного или безусловного перехода. Отличие от условного оператора заключается в том, что передача управления осуществляется не вперёд, а назад. На языках программирования высокого уровня такой оператор входит в состав языка (оператор do..while в языке программирования C или оператор repeat..until в языке программирования PASCAL). На языке программирования ассемблер для реализации этого оператора можно воспользоваться любой условной операцией. Однако для реализации оператора цикла в системе команд микроконтроллера MCS-51 предусмотрена специальная команда, выполняющая сразу два алгоритмических действия - DJNZ. Пример использования этой команды для реализации оператора цикла приведён на рисунке Рисунок V.2.4.
Рисунок V.2.4. Пример оператор цикла с проверкой условия после тела цикла на языке программирования ASM-51.
Четвёртый структурный оператор - это оператор цикла с проверкой условия до тела цикла. В отличие от предыдущего оператора тело цикла в этом операторе может ни разу не выполниться, если условие цикла сразу же выполнено. Этот оператор как и условный оператор невозможно реализовать на одной машинной команде. Для реализации этого оператора тоже потребуется команда безусловного перехода:
Рисунок V.2.5. Пример оператор цикла с проверкой условия до тела цикла на языке программирования ASM-51.