assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 72
Текст из файла (страница 72)
В тексте программы их можно применять произвольноеколичество раз, при этом очередная директива отменяет действие предыдущей.м Директивы %CTLS и %NOCTLS управляют выводом в файл листинга самих директив управления листингом, в то время как директивы %LIST и %NOLIST (.LISTи .XLIST) влияют на полноту представления исходного кода в целом.« Директивы %SYMS и %NOSYMS определяют включение (%SYMS) или не включение (%NOSYMS) таблицы идентификаторов в файл листинга.Директивы вывода текста включаемых файлов %INCL и %NOINCL регулируютвключение в файл листинга текста включаемых файлов (по директиве INCLUDE).По умолчанию включаемые файлы записываются в файл листинга. Директива%NOINCL запрещает вывод в файл листинга всех последующих включаемых файлов, пока вывод снова не будет разрешен директивой %INCL.Директивы вывода блоков условного ассемблирования регулируют включениеблоков условной компиляции в листинг программы.ii Директива %CONDS (.LFCOND) заставляет ассемблер выводить в файл листингавсе операторы условных блоков (в том числе с условием false).
Директива%NOCONDS (.SFCONDS) запрещает вывод в файл листинга блоков условного ассемблирования с условием false.11 Зак. 256322Глава 14. Макросредства языка ассемблера» Директива .TFCOND переключает режимы вывода %CONDS (.LFCOND) и %NOCONDS(.SFCONDS). Эту директиву можно использовать как отдельно, так и совместнос директивами .LFCOND и .SFCONDS. Первая директива .TFCOND, которую обнаруживает TASM, разрешает вывод в файл листинга всех блоков условного ассемблирования. Следующая директива .TFCOND запретит вывод этих блоков. С директивой .TFCOND можно использовать ключ /х командной строки транслятораTASM — в этом случае блоки условного ассемблирования будут сначала выводиться в файл листинга, но первая же директива .TFCOND запретит их вывод.Директивы вывода макрорасширений, как явствует из названия, управляют выводом макрорасширений:Директива %MACS (.LALL) разрешает вывод в файл листинга всех макрорасширений.-' Директива %NOMACS (.SAIL) запрещает вывод всех операторов макрорасширения в файл листинга.8 В трансляторе MASM можно использовать директиву .XALL, позволяющую выводить в листинг только те макрорасширения, которые генерируют код или данные.Итоги9 Преимущества языка ассемблера связаны, в частности, с макросредствами.
Какговорят, если бы макросредств в нем не было, то их нужно было бы придумать.л Макросредства — это основные инструменты модификации текста программына этапе ее трансляции. Принцип работы макросредств основан на препроцессорной обработке, которая заключается в том, что текст, поступающий на входтранслятора, перед собственно компиляцией подвергается преобразованиюи может значительно отличаться от синтаксически правильного текста, воспринимаемого компилятором. Роль препроцессора в трансляторе TASM выполняет макрогенератор.Для того чтобы макрогенератор мог выполнить свою работу, текст программыдолжен удовлетворять определенным требованиям.
Макрогенератору необходимо сообщить, на какие элементы исходного текста он должен реагироватьи какие действия должны быть произведены. Можно выделить несколько типов таких элементов.ш Псевдооператоры EQU и = предназначены для присвоения некоторому выражению символического имени или идентификатора. Эти действия выполняет макрогенератор, заменяя в последующем тексте программы символические именаиз правой части этих операторов строками из левой.Макрокоманда — строка в исходной программе, которой соответствует специальный блок — макроопределение. Макрокоманда может иметь аргументы, с помощью которых можно изменять текст макроопределения.
Макрогенератор,встречая макрокоманду в тексте программы, корректирует текст соответствующего макроопределения, исходя из аргументов этой макрокоманды, и вставля-Итоги323ет его в текст программы вместо данной макрокоманды. Процесс такого замещения называется макрогенерацией.Условные директивы компиляции позволяют не просто модифицировать отдельные строки программы, но и, исходя из определенных условий, управлятьвключением в загрузочный модуль отдельных фрагментов программы. Эти директивы наиболее эффективны для работы с аргументами, передаваемыми примакрогенерации в макроопределения из макрокоманд, хотя отдельные директивы есть смысл применять и вне макроопределений в любом месте программы.Директивы генерации ошибок, подобно условным директивам, позволяют анализировать определенные условия в процессе трансляции программы и генерировать ошибку по результатам анализа.Для удобства формирования файла листинга компиляторы ассемблера предоставляют в распоряжение программиста ряд директив.
С помощью этих директив можно довольно гибко изменять формат и полноту информации, выводимой ассемблером в файл листинга.Глава 15МодульноепрограммированиеОсновы структурного программированияСредства ассемблера для поддержки структурногопрограммирования'Процедуры и организация связей между процедурамина языке ассемблераДиректива INVOKE (MASM)Связь между программами на языках высокого уровняи программами на ассемблереМы неоднократно подчеркивали один из существенных недостатков программ наязыке ассемблера, а значит, и самого языка, — недостаточную наглядность.
По прошествии даже небольшого времени программисту порой бывает трудно разобратьсяв деталях им же написанной программы. А о чужой программе и говорить не приходится. Если в ней нет хотя бы минимальных комментариев, то разобраться с тем,что она делает, довольно трудно. Причины этого тоже понятны — при написаниипрограммы на языке ассемблера человек должен запрограммировать самые элементарные действия или операции. При этом он должен учитывать и контролировать состояние большого количества данных. Из-за элементарности программируемых операций реализация одного и того же алгоритма может быть произведенапо крайней мере несколькими способами.
Эта неоднозначность влечет за собойнепредсказуемость, что и затрудняет процесс обратного восстановления исходного алгоритма по ассемблерному коду.По мере накопления опыта эти проблемы частично снимаются. Но одного опыта мало. Ситуация усугубляется, если работает коллектив разработчиков. Тут ужеСтруктурное программирование325нужны специальные средства. Далее перечислены организационные и программные (предоставляемые ассемблером) мероприятия, позволяющие хотя бы частично снять остроту этой проблемы.t' Документирование программистом своей работы и ее результатов.
Делается этов первую очередь путем комментирования строк исходного текста программы.При этом комментарии должны коротко, но точно выражать то, что делает данная программа в целом, выделять ее наиболее важные фрагменты и особенностиприменения отдельных команд. В конечном итоге, комментирование облегчает понимание сути программы, но все-таки полностью не снимает проблему.II Упрощение кода программы путем замены сложных фрагментов более понятным кодом. Для этого, в частности, можно использовать рассмотренные намимакрокоманды.II Использование при разработке программных проектов достижений современных технологий программирования.К настоящему моменту наиболее популярными и жизнеспособными оказались две технологии программирования: структурная и объектно-ориентированная.Последние версии пакетов TASM и MASM языка ассемблера поддерживаютобъектно-ориентированное программирование, но реализация его довольно сложна и требует отдельного рассмотрения.
Типичному процессу написания программы на ассемблере больше всего удовлетворяют концепции структурного программирования. Можно даже сказать, что для процессорной архитектуры IA-32 этиконцепции поддерживаются на аппаратном уровне с помощью таких архитектурных механизмов, как сегментация памяти и аппаратная реализация команд передачи управления. На программном уровне поддержка заключается, в основном,в соответствующих средствах конкретного компилятора, в частности, такие средства имеют компиляторы TASM и MASM. Данная глава посвящен этим программно-аппаратным средствам.СтруктурноепрограммированиеСтруктурное программирование — методология программирования, базирующаясяна системном подходе к анализу, проектированию и реализации программногообеспечения.
Эта методология зародилась в начале 70-х гг. и оказалась настолькожизнеспособной, что и до сих пор является основной в большом количестве проектов. Ее основу составляет концепция модульного программирования.Концепцию модульного программирования можно сформулировать в виде нескольких понятий и положений. Основа концепции модульного программирования — модуль, который является продуктом процесса разбиения большой задачина ряд более мелких функционально самостоятельных подзадач.
Этот процесс называется функциональной декомпозицией задачи. Каждый модуль в функциональной декомпозиции представляет собой «черный ящик» с одним входом и однимвыходом. Модули связаны между собой только входными и выходными данными.326Глава 15. Модульное программированиеМодульный подход позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации и облегчает ее сопровождение.
Дополнительно модульный подход позволяет разрабатывать части программ одного проекта наразных языках программирования, после чего с помощью компоновочных средствобъединять их в единый загрузочный модуль.Основная цель модульного подхода — простота и ясность реализуемых решений. Если вы затрудняетесь четко сформулировать назначение модуля, это говорит о том, что один из предыдущих этапов декомпозиции задачи был проведеннедостаточно качественно.
В этом случае необходимо вернуться на один или более шаг назад и еще раз проанализировать задачу этапа, вызвавшего проблему. Это,возможно, приведет к появлению дополнительных модулей в процессе функциональной декомпозиции.При наличии в проекте сложных мест их нужно подробно документироватьс помощью продуманной системы комментариев. Комментарии должны быть ясными в смысле отражения реализуемых идей и подчиняться некоторой системе —частной, если разработчик — частное лицо, или корпоративной, действующей внутри некоторого организованного коллектива разработчиков. По поводу системыкомментирования можно еще раз напомнить несколько широко известных идей.Во-первых, желательно назначение всех переменных модуля описывать комментариями по мере их определения.
Во-вторых, исходный текст модуля должен иметьзаголовок, отражающий назначение модуля и его внешние связи. Этот заголовокможно назвать интерфейсной частью модуля. В интерфейсной части с использованием комментариев нужно поместить информацию о назначении модуля, об особенностях функционирования, о входных и выходных аргументах, об использовании внешних модулей и переменных, а также о разработчике — для защитыавторских прав.В ходе разработки программы следует предусматривать специальные блокиопераций, учитывающие реакцию на возможные ошибки в данных или в действиях пользователя. Это очень важный момент, означающий, что в алгоритме программы не должно быть тупиковых ветвей, в результате работы которых программа«виснет» и перестает отвечать на запросы пользователя.