Подготовка программы к выполнению



Процесс подготовки и отладки программы на языке ассемблера включает этапы подготовки исходного текста, трансляции, компоновки и отладки.

Подготовка исходного текста программы выполняется с помощью любого текстового редактора. Файл с исходным текстом должен иметь расширение .asm. При выборе редактора для подготовки исходного текста программы следует иметь в виду, что многие текстовые процессоры (например, Microsoft Word) добавляют в выходной текст служебную информацию о формате (размер страниц, тип шрифта и др.). Поэтому следует воспользоваться редактором, выводящим в выходной файл «чистый текст», без каких-либо управляющих символов. К таким редакторам относятся, например, широко распространенные у нас Лексикон, Norton Editor, редактор edit.com, входящий в состав операционной системы MS-DOS и др. Поскольку при интенсивном программировании часто приходится переносить фрагменты текста из одной программы в другую, желательно, чтобы редактор имел средства деления экрана на независимые окна. Таким свойством обладают программы Лексикон (10 окон) и Norton Editor (2 окна, что в большинстве случаев вполне достаточно) но не обладает редактор edit.com. При работе в операционной среде какой-либо системы программирования, например, Borland C, можно воспользоваться редактором, встроенным в эту среду.

Трансляция исходного текста программы состоит в преобразовании строк исходного языка в коды машинных команд и выполняется с помощью транслятора с языка ассемблера (т.е. с помощью программы ассемблера). Можно воспользоваться макроассемблером корпорации IBM, пакетами TASM корпорации Borland или MASM корпорации Microsoft. Трансляторы различных разработчиков имеют некоторые различия, в основном, в части описания макросредств. Однако, входной язык (т.е. мнемоника машинных команд и других операторов и правила написания предложений ассемблера) для всех ассемблеров одинаков. В результате трансляции образуется объектный файл с расширением .obj.

Компоновка объектного файла выполняется с помощью программы компоновщика (редактора связей). Эта программа получила такое название потому, что ее основное назначение — подсоединение к файлу с основной программой файлов с подпрограммами и настройка связей между ними. Однако компоновать необходимо даже простейшие программы, не содержащие подпрограмм. Дело в том, что у компоновщика есть и вторая функция — изменение формата объектного файла и преобразование его в выполнимый файл, который может быть загружен в оперативную память и выполнен. Файл с программой компоновщика обычно имеет имя link.exe, хотя это может быть и не так. Например, компоновщик корпорации Borland назван tlink.exe. Компоновщик желательно брать из одного пакета с ассемблером. В результате компоновки образуется загрузочный, или выполнимый файл с расширением .exe.

Известно, что программы, выполняемые под управлением MS-DOS, могут принадлежать к одному из двух типов, которым соответствуют расширения имен выполнимых файлов .com и .exe. Основное различие этих программ заключается в том, что программы типа .com состоят из единственного сегмента, в котором размещаются программные коды, данные и стек, а в программах типа .exe для собственно программы, данных и стека предусматриваются отдельные сегменты. В результате размер программы типа .com не может превысить 64 Кбайт, а размер программы типа .exe практически не ограничен, так как в нее может входить любое число сегментов команд и данных. При разработке программных продуктов чаще используется формат .exe, как обладающий большей универсальностью. Однако некоторые специфические программы (обработчики аппаратных прерываний, резидентные программы) обычно пишутся в формате .com.

Если исходная программа написана в формате .com, то после трансляции и компоновки обычным образом ее надо преобразовать в файл типа .com, для чего используется внешняя команда DOS exe2bin. Позже этот вопрос будет рассмотрен подробнее.

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

При использовании пакета корпорации Borland следует взять «турбо-дебаггер» td.exe, при трансляции и компоновке программы с помощью пакета корпорации Microsoft — отладчик Codeview (файл cv.exe). Можно воспользоваться и отладчиком debug.exe, входящим в состав операционной системы MS-DOS, хотя с ним не очень удобно работать, так как эта программа не обеспечивает привычный для сегодняшнего пользователя полноэкранный интерфейс с системой меню. В настоящей книге будет предполагаться, что читатель выполняет предложенные примеры с помощью пакета корпорации Microsoft (транслятор masm.exe, компоновщик link.exe, отладчик cv.exe). Кстати, никакие другие программы, входящие в этот пакет, нам не понадобятся.

Если файл с исходным текстом программы назван p.asm, то строка вызова ассемблера может иметь следующий вид:

 masm /z /zi /n p,p,p;

(Еще раз напоминаем, что как в тексте программы на языке ассемблера, так и при вводе с клавиатуры командных строк можно с равным успехом использовать и прописные, и строчные буквы.)

Ключ /Z разрешает вывод на экран строк исходного текста программы, в которых ассемблер обнаружил ошибки (без этого ключа поиск ошибок пришлось бы проводить по листингу трансляции).

Ключ /ZI управляет включением в объектный файл номеров строк исходной программы и другой информации, не требуемой при выполнении программы, но используемой отладчиком CV.

Ключ /N подавляет вывод в листинг перечня символических обозначений в программе, от чего несколько уменьшается информативность листинга, но существенно сокращается его размер.

Стоящие далее параметры определяют имена файлов: исходного (p.asm), объектного (p.obj) и листинга (p.lst). Точка с запятой подавляет формирование файла p.crf с перекрестными ссылками, который нам не нужен.

Строка вызова компоновщика может иметь следующий вид:

 link /co p,p;

Ключ /CO передает в загрузочный файл символьную информацию, позволяющую отладчику CV выводить на экран полный текст исходной программы, включая метки, комментарии и проч. Стоящие далее параметры обозначают имена модулей: объектного (p.obj) и загрузочного (p.exe). Символ точки с запятой подавляет формирование файла с листингом компоновки (p.map) и использование библиотечного файла с объектными модулями подпрограмм.

Как уже отмечалось, компоновщик создает загрузочный, готовый к выполнению, модуль в формате .exe. Запуск подготовленной программы p.exe осуществляется командой

 p.exe

или просто

 p

Если программа не работает должным образом, необходимо прибегнуть к помощи интерактивного отладчика. Отладчик CodeView запускается командой

 cv p

где p — имя файла с отлаживаемой программой. По умолчанию отладчик загружает файл с расширением .exe. В процессе работы отладчик использует также файл с исходным модулем p.asm, поэтому перед отладкой не следует переименовывать ни исходный, ни выполнимый файлы. Правила работы с отладчиком CodeView Microsoft и его основные команды будут описаны в одной из следующих статей.

Поскольку по мере изучения этой книги вам придется написать и отладить несколько десятков программ, целесообразно создать командный файл, автоматизирующий выполнение однотипных операций трансляции и компоновки. Текст командного файла (для подготовки программ с помощью транслятора и компоновщика корпорации Microsoft) может быть таким:

 @ echo off
 masm /z /zi /n p,p,p;
 if errorlevel 1 goto err
 link /co p,p;
 goto end
:err
 echo Ошибка трансляции !
 goto fin
:end
 echo Конец сеанса
:fin
 echo .

Если трансляция прошла успешно, на экран выводится сообщение «Конец сеанса» и создаются файлы p.obj, p.exe и p.lst; при наличии ошибок в программе на экран будут выведены строки листинга с ошибками, а за ними сообщение «Ошибка трансляции!». Поскольку в приведенном командном файле имя программы указано в явной форме, текущий вариант программы всегда должен иметь одно и то же имя (в приведенном примере — p.asm). Конечно, можно составить командный файл, воспринимающий текущее имя программы в качестве параметра при его запуске, однако практика показывает, что такая методика замедляет работу и иногда приводит к драматическим ошибкам. Удобнее отлаживать программу всегда под одним и тем же именем, а после отладки записывать в специально созданный каталог архива под уникальным именем (например, под именем, соответствующим номеру примера в книге: 01-01.asm).

Создайте файл с программой из примера 1.1. Подготовьте программу к выполнению. Не смущайтесь, увидев на экране сообщение

 LINK : warning L4021: no stack segment

Это компоновщик сообщает, что не обнаружил в программе сегмент стека. Его там действительно нет, и это не очень хорошо, однако работать программа будет. Позже мы усовершенствуем программу, дополнив ее стеком.

Изучите листинг трансляции (файл p.lst). На рис. 2.1 приведен несколько сокращенный текст листинга трансляции примера 1.1, из которого были удалены комментарии. Обратите внимание на следующие моменты.

Рис. 2.1. Листинг трансляции примера 1.1

Рис. 2.1. Листинг трансляции примера 1.1

Команды программы имеют различную длину и располагаются в памяти вплотную друг к другу. Так, первая команда mov AX,text, начинающаяся с байта 0000 сегмента, занимает 3 байта. Соответственно, вторая команда начинается с байта 0003. Вторая команда имеет длину 2 байта, поэтому третья команда начинается с байта 0005 и т.д.

Предложения программы с операторами segment, assume, end не транслируются в какие-либо машинные коды и не находят отражения в памяти. Они нужны лишь для передачи транслятору служебной информации.

Транслятор не мог полностью определить код команды mov AX,text. В этой команде в регистр AX засылается адрес сегмента text. Однако этот адрес станет известен лишь в процессе загрузки выполнимого файла программы в память. поэтому в листинге на месте этого адреса стоит прочерк.

Данные, введенные нами в программу, также оттранслировались: вместо символов текста в загрузочный файл попадут коды ASCII этих символов. Подробнее о кодах ASCII будет рассказано в статье 7.

Из листинга трансляции легко определить размер отдельных составляющих программы и всей программы в целом. В нашем случае длина сегмента команд (в который вошли и данные) равна всего 2Ah = 42 байт (символ «h» обозначает, что число записано в шестнадцатиричной системе счисления).

Выполните пробный прогон программы и убедитесь, что она работает, как ожидалось: на экран выводится текст «Наука умеет много гитик». Если этого не произойдет, значит, в программе присутствует какая-то скрытая ошибка, и программу придется отлаживать с помощью отладчика. Работа с интерактивным отладчиком требует некоторых навыков; статья 4 поможет вам освоить это интересное и полезное инструментальное средство.




Источник: http://darkoff.ru/2011/02/%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0
Категория: Coding | Добавил: Aules (01.08.2011)
Просмотров: 507 | Теги: ASM, Coding | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
close