Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Эрни Каспер Программирование на языке Ассемблер...doc
Скачиваний:
120
Добавлен:
09.11.2019
Размер:
954.88 Кб
Скачать

8.4.Применение подпрограмм и сложных текстовых подстановок

Одним из способов снижения трудоемкости программирования является заимствование структурных единиц из отработанной программы для вновь создаваемых. Такого рода стилистический прием можно считать не плагиатом, а цитированием. Заимствование самой крупной структурной единицы (объектного модуля) производится на этапе компоновки. На этапе создания исходного текста можно, уподобившись нерадивому школьнику, списать из одной программы в другую некоторую последовательность команд, но это плохой стиль. Хорошим стилем является заимствование на уровне подпрограмм и сложных текстовых подстановок. Для заимствования на уровне подпрограмм удобно использовать библиотеки, а для заимствования на уровне сложных текстовых подстановок — макроопределения во включаемых в исходный текст файлах.

При разработке программ на Ассемблере большое количество синтаксических ошибок связано с метками. Поэтому при разработке языков программирования высокого уровня были предприняты усилия для изгнания меток как средства управления потоком команд. Программирование без меток было названо структурным и оказалось очень удобным. Хотя Ассемблер не позволяет обойтись без меток, использование таких структурных единиц как модули, подпрограммы и сложные текстовые уменьшают вероятность синтаксических ошибок. Использование в программе разного рода структурных единиц также является стилистическим приемом, применение которого определяется как объективными обстоятельствами, так и "вкусом" программиста.

Удобство применения подпрограммы как способа структурирования программы настолько привлекательно, что некоторые программисты оформляют набор команд как подпрограмму даже в случае его однократного использования программой. Применение подпрограмм становится тем более оправданным, когда они используются программой многократно. Стандартизация подпрограмм, например, для вычислений при представлении чисел несколькими байтами или для использовании драйверов разнообразных устройств ввода/вывода позволяет существенно сэкономить время разработки и отладки программ. Применение библиотечных подпрограмм целесообразно с точки зрения экономии времени разработки и отладки программы. В этом случае подпрограммы хранятся в библиотеке и включаются в исполняемую программу на этапе компоновки. Большинство приведенных в книге примеров может быть оформлено как подпрограммы. Для этого необходимо в начале соответствующего блока записать метку, а в конце — команду возврата из подпрограммы. Но этого недостаточно, так как при разработке подпрограмм нужно соблюдать простые правила, обеспечивающие отсутствие помех работе вызывающей программы.

Выполняя полезную работу, подпрограмма не должна вредить, то есть портить содержимое ячеек ОЗУ, используемых вызывающей программой. Программисту нужно использовать одни и те же правила обмена информацией между подпрограммой и вызывающей программой. Эти правила должны учитывать как особенности архитектуры микроконтроллера, так и функциональное назначение подпрограмм. В связи с ограничениями на адресное пространство стека в качестве рабочих ячеек подпрограммы удобнее всего использовать регистры общего назначения. Если подпрограмма должна работать с другими ячейками ОЗУ, то целесообразнее всего использовать косвенную адресацию, записывая адреса в регистры RO и R1. В этом случае подпрограмма может работать только с двумя группами ячеек ОЗУ. При использовании остальных функциональных регистров их содержимое должно сохраняться в стеке на время выполнения подпрограммы и восстанавливаться перед выходом из подпрограммы. Исключения из этого правила должны оговариваться в описании подпрограммы. Для удобства использования подпрограмм в заголовке каждой из них следует записать комментарии с описанием назначения, форматами и адресами входных и выходных данных и с информацией об использовании функциональных регистров.

Рассмотрев очевидные достоинства применения подпрограмм, перейдем к их недостаткам. Обращение к подпрограмме приводит к затратам адресного пространства стека для запоминания адреса возврата и сохранения содержимого функциональных регистров. В связи с ограниченным объемом ОЗУ это затрудняет широкое использование подпрограмм в микроконтроллерах. Для перехода к подпрограмме и возврата из нее, а также для записи операндов в стандартные ячейки подпрограммы и чтения результатов работы из них расходуется время, поэтому использование подпрограмм для реализации слишком простых вычислений нецелесообразно. Применение подпрограмм удобно тогда, когда ограничения на объем ПЗУ более существенны, чем ограничения на быстродействие программы и/или на объем ОЗУ. Они также более удобны тем, что их можно наладить и оттранслировать заранее.

В отличие от подпрограмм сложные текстовые подстановки (макросы) работают без передачи управления и могут использовать не только косвенную, но и непосредственную адресацию к любым ячейкам ОЗУ. Их применение удобно тогда, когда ограничения на объем ПЗУ менее существенны, чем ограничения на быстродействие программы и/или на объем ОЗУ. При прочих равных условиях замена подпрограмм на сложные текстовые подстановки приводит к увеличению объема исполняемой программы. Выбор между использованием подпрограмм и сложных текстовых подстановок чаще всего (при отсутствии строгих ограничений по ресурсам) является делом вкуса программиста. Но в некоторых случаях выбор бывает предопределен ограничением ресурсов или спецификой программируемого алгоритма.

Применение сложных текстовых подстановок требует хорошего знания синтаксических правил и выражений для подстановок, чтобы при подстановке фактических параметров получились такие команды, которые нужны программисту. Использование конструкций такого рода в языках высокого уровня часто приводит к побочным эффектам, обусловленным непониманием формализма синтаксических правил. Соответствующие примеры приводятся в учебниках по языку Си, и именно по этой причине не рекомендуется использовать макросы. Впрочем, в Ассемблере ситуация облегчается возможностью полной проверки результата подстановки по листингу.