assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 33
Текст из файла (страница 33)
Еслипроект состоит из большого количества файлов, необходимость помнить всю этуинформацию довольно утомительна. Для решения этой проблемы можно посоветовать использовать специальную программу — менеджер проекта. В пакете TASMтакой программой является утилита make.exe, а в пакете MASM — утилитаnmake.exe. Эти утилиты работают со специально оформленными файлами, называемыми файлами описания, или make-файлами. В make-файлах задаются отношения между файлами проекта и действия над этими файлами, которые выполняются в зависимости от возникновения тех или иных условий. Главный принцип,положенный в основу работы утилиты make.exe, заключается в анализе времениизменения или создания файлов. Подробное описание утилиты можно найти среди файлов к книге1.Итогив Структура программы на ассемблере отражает особенности архитектуры процессора.
Для процессоров Intel типичная программа состоит из трех сегментов:кода, стека и данных. Но это не обязательное условие; например, если программа не использует стек и для ее работы не требуется определения данных, то онаможет состоять всего лишь из одного сегмента кода.is Программа на ассемблере работает на уровне аппаратных средств, входящихв программную модель процессора, которая описана в главе 2.™ При разработке алгоритма работы программы и его реализации на ассемблерепрограммист сам должен беспокоиться о размещении данных в памяти, об эффективном использовании ограниченного количества регистров, об организации связи с операционной системой и другими программами.• Специфика разработки программы на ассемблере состоит в том, что программист должен уделять внимание не только и не столько особенностям моделирования предметной области, сколько тому, как при этом наиболее эффективно и корректно использовать ресурсы процессора.Все прилагаемые к книге файлы можно найти по адресу http://www.piter.com/download.
—Примеч. ред.Итоги145В результате работы транслятора создаются файл объектного модуля и файллистинга программы, содержащий разнообразную информацию о программе:объектный код, сообщения о синтаксических ошибках, таблицу символов и т. д.Имея небольшой опыт, из файла листинга можно извлечь массу полезной информации.После получения корректного объектного модуля программу необходимо скомпоновать.
Для этого применяется утилита-компоновщик, одним из основныхназначений которой является разрешение внешних ссылок. Если целевая программа состоит из нескольких отдельно оттранслированных модулей и в нихесть взаимные ссылки на переменные или модули, то компоновщик разрешаетих, формируя тем самым правильные перемещаемые адреса.Результатом работы компоновщика является исполняемый (загрузочный) модуль, имеющий расширение .ехе. Его уже можно запускать в надежде, что онправильно выполнит задуманные программистом действия.
Но чаще всего припервых запусках программы этого не случается, что говорит о наличии в программе логических ошибок, поиск которых без специальных средств может бытьдолгим. Для поиска и устранения логических ошибок предназначен специальный вид программного обеспечения — отладчики. С их помощью в большинстве случаев довольно быстро удается снять большинство программных проблем подобного рода.Глава 7Команды обмена даннымиЛинейные алгоритмыКоманды пересылки данныхВвод из порта и вывод в портКоманды работы с адресами памятиКоманды работы со стекомНаверняка вы уже знакомы с понятием алгоритма, представляющего собой формализованное описание логики работы программы.
Способы такой формализациивесьма разнятся: от текстового описания последовательности действий до алгоритма развитых case-систем. Последовательность действий, описываемых алгоритмом, может быть:И линейной — все действия выполняются поочередно, друг за другом;ш нелинейной — в алгоритме есть точки ветвления, в которых должно приниматься решение о месте, с которого программа продолжит свое выполнение, причемрешение может носить условный или безусловный характер.Линейные участки алгоритма обычно содержат команды манипуляции данными, вычисления значений выражений, преобразования данных.
В точках ветвления размещают команды сравнения, различных видов перехода, вызова подпрограмм и некоторые другие.Еще раз обратимся к функциональной классификации целочисленных машинных команд процессора (см. рис. 3.3). Из всей совокупности этих команд на линейных участках работают следующие группы:И команды пересылки данных;ж арифметические команды;Пересылка данных147логические команды;команды управления состоянием процессора.В этой главе мы рассмотрим только группу команд пересылки данных.
Эти команды осуществляют пересылку данных из одного места в другое, запись и чтениеинформации из портов ввода-вывода, преобразование информации, манипуляциис адресами и указателями, обращение к стеку. Для некоторых из этих команд операция пересылки является только частью алгоритма. Другая его часть выполняетнекоторые дополнительные операции над пересылаемой информацией. Поэтомудля удобства практического применения и отражения их специфики данные команды будут рассмотрены в соответствии с их функциональным назначением, согласно которому они делятся на команды:собственно пересылки данных;.ввода из порта и вывода в порт;-•работы с адресами и указателями;преобразования данных;''работы со стеком.Пересылка данныхК группе команд пересылки данных относятся следующие команды:mov <операнд назначения>,<операнд-источник>xchg <операнд!>,<операнд2>MOV — это основная команда пересылки данных.
Она реализует самые разнообразные варианты пересылки. Отметим особенности применения этой команды.« Командой MOV нельзя осуществить пересылку из одной области памяти в другую. Если такая необходимость возникает, то нужно использовать в качествепромежуточного буфера любой доступный в данный момент регистр общегоназначения. К примеру, рассмотрим фрагмент программы для пересылки байта из ячейки fls в ячейку fid:masmmodelsmall.datafls db 5fid db 1.codestart:mov al.flsmov fld.alend s t a r tНельзя- загрузить в сегментный регистр значение непосредственно из памяти.Для такой загрузки требуется промежуточный объект. Это может быть регистробщего назначения или стек. Если вы посмотрите на листинг 5.1, то увидитев начале сегмента кода две команды MOV, выполняющие настройку сегментногорегистра DS.
При этом из-за невозможности напрямую загрузить в сегментный148Глава 7. Команды обмена даннымирегистр значение адреса сегмента, содержащееся в предопределенной переменной @data, приходится использовать регистр общего назначения АХ.II Нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр.
Это объясняется тем, что в системе команд нет соответствующегокода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных все те жерегистры общего назначения. Вот пример инициализации регистра ES значением из регистра DS:mov ax.dsmov es.axНо есть и другой, более «красивый» способ выполнения данной операции —использование стека и команд PUSH и POP:pushpop esds ;поместить значение регистра ds в стек;записать в es число из стека• Нельзя использовать сегментный регистр CS в качестве операнда назначения.Причина здесь простая.
Дело в том, что в архитектуре процессора IA-32 параCS:IP содержит адрес команды, которая должна выполняться следующей. Изменение командой MOV содержимого регистра CS фактически означало бы операцию перехода, а не пересылки, что недопустимо.В связи с командой MOV отметим один тонкий момент. Пусть в регистре ВХ содержится адрес некоторого поля (то есть мы используем косвенную базовую адресацию).
Его содержимое нужно переслать в регистр АХ. Очевидно, что нужно применить команду MOV в формеmov a x , [ Ь х ]Транслятор задает себе вопрос: что адресует регистр ВХ в памяти — слово илибайт? Обычно в этом случае он принимает решение сам, по размеру большего операнда, но может и выдать предупреждающее сообщение о возможном несовпадении типов операндов.Или другой случай — возможно, более показательный. Рассмотрим командыинкремента INC (увеличения операнда на 1) и декремента DEC (уменьшения операнда на 1):inc [Ьх]dec [bx]Что адресуется регистром ВХ в памяти — байт, слово или двойное слово?Допустим также, что требуется инициализировать поле, адресуемое регистромВХ, значением 0. Очевидно, что одно из решений — применение команды MOV:mov [bx] ,0И опять у транслятора вопрос: какую машинную команду ему конструировать?Для инициализации байта? Для инициализации слова? Для инициализации двойного слова?Во всех этих случаях необходимо уточнять тип используемых операндов.
Дляэтого существует специальный оператор ассемблера PTR (см. приложение). Правильно записать приведенные ранее команды можно следующим образом:mov a x , w o r d ptr[bx] ;если [bx] адресует слово в памятиinc byte ptr[bx];если [bx] адресует байт в памятиВвод из порта и вывод в портdec dword ptr[bx]mov word p t r [ b x ] , 0149;если [Ьх] адресует двойное слово в памяти;если [Ьх] адресует слово в памятиМожно рекомендовать использовать оператор PTR во всех сомнительных относительно согласования размеров операндов случаях. Также этот оператор нужноприменять, когда требуется принудительно поменять размерность операндов.К примеру, требуется переслать значение Offh во второй байт поля flp:masmmodel.datatip dwsmall0.codestart:mov byte ptr (flp+l),0ffhend startНесмотря на то что поле flp имеет тип WORD, мы сообщаем ассемблеру, что поленужно трактовать как байтовое, и заставляем вычислить значение эффективногоадреса второго операнда как смещение flp плюс единица.