Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція № 3 МЗКІТ (рус, дороб) (10 ТП).docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Создание объектного модуля (трансляция программы)

Итак, исходный текст программы на ассемблере подготовлен и записан на диск. Следующий шаг — трансляция программы. На этом шаге формируется объектный модуль, который включает в себя представление исходной программы в машинных кодах и некоторую другую информацию, необходимую для отладки и компоновки его с другими модулями. Для получения объектного модуля исходный файл необходимо подвергнуть трансляции при помощи программы tasm.exe из пакета TASM.

Формат командной строки для запуска tasm.exe следующий:

TASM [опции] имя_исходного_файла [,имя_объектного_файла]

[,имя_файла_листинга] [,имя_файла_перекрестных_ссылок]

На первый взгляд, все очень сложно. Не пугайтесь — если вы вдруг забыли формат командной строки и возможные значения параметров, то получить быструю справку на экране монитора можно, просто запустив tasm.exe без задания каких-либо аргументов. Обратите внимание, что большинство параметров заключено в квадратные скобки. Это общепринятое соглашение по обозначению параметров, которые могут отсутствовать. Таким образом, обязательным аргументом командной строки является лишь имя_исходного_файла. Этот файл должен находиться на диске и обязательно иметь расширение .asm. За именем исходного файла через запятую могут следовать необязательные аргументы, обозначающие имена объектного файла, файла листинга и файла перекрестных ссылок. Если не задать их, то соответствующие файлы попросту не будут созданы. Если же их нужно создать, то необходимо учитывать следующее:

  • Если имена объектного файла, файла листинга и файла перекрестных ссылок должны совпадать с именем исходного файла (наиболее типичный случай), то нужно просто поставить запятые вместо имен этих файлов:

tasm.exe prg_3_1 , , , ,

В результате будут созданы файлы, как показано на рис. 4.1 для шага 2.

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

tasm.exe prg_3_1 , ,prg_list , ,

В результате на диске будут созданы файлы

prg_3_1.obj

prg_list.lst

prg_3_1.crf

  • Если требуется выборочное создание файлов, то вместо ненужных файлов необходимо подставить параметр nul. Например:

tasm.exe prg_3_1 , ,nul, ,

В результате на диске будут созданы файлы

prg_3_1.obj

prg_3_1.crf

Необязательный аргумент опции позволяет задавать режим работы транслятора TASM. Этих опций достаточно много. Для того чтобы получить представление о них, просмотрите приложение. Некоторые из опций понадобятся нам в ближайшее время, а большинство из них, скорее всего, никогда не будут вами востребованы.

Давайте немного поэкспериментируем с программой tasm.exe. Попутно выясним еще несколько важных моментов. Прежде всего проведем некоторые организационные мероприятия. После инсталляции пакета TASM в каталоге \TASM\BIN, где находится файл tasm.exe, можно увидеть большое количество файлов. Можно запустить программу tasm.exe прямо отсюда, но тогда созданные ею файлы объектного кода, листинга и перекрестных ссылок тоже окажутся в этом каталоге. Если вы пишете одну программу, то неудобство не столь заметно, но при работе с несколькими программами очень скоро этот каталог станет похож на свалку.

Чтобы избежать подобной ситуации, рекомендуется выполнить следующие действия:

  • Создать в каталоге \TASM подкаталоги \TASM\WORK и \TASM\ PROGRAM. Каталог PROGRAM будем использовать для хранения отлаженных кодов программ и их исполняемых модулей (файлы с расширением .ехе). Каталог WORK будем использовать как рабочий; в нем будут находиться необходимые для получения исполняемого модуля файлы из пакета транслятора TASM и файл исходного модуля, с которым мы в данный момент работаем. После того как ошибки в исходном модуле устранены, он вместе со своим исполняемым модулем переписывается в каталог PROGRAM. Из каталога WORK удаляются все ненужные файлы — и он готов для работы со следующим исходным модулем на ассемблере. Таким образом, в каталоге WORK всегда находится рабочая версия программы, а в каталоге PROGRAM — отлаженная версия.

  • Поместить в каталог WORK файлы tasm.exe, tlink.exe и rtm.exe. Если вы что-то забудете туда поместить, программы tasm.exe и tlink.exe выдадут вам сообщение об этом.

  • Поместить файл prg_3_1.asm в каталог WORK.

После всех этих действий можно начинать работу. Перейдем в каталог WORK и запустим на трансляцию программу prgJM.asm командной строкой вида

tasm.exe /zi prg_3_1 , , , ,

В результате на экране вы получите последовательность строк. Самая первая из них будет информировать вас о номере версии пакета TASM, который использовался для трансляции данной программы. Далее идет строка, содержащая имя транслируемого файла. Если ваша программа содержит ошибки, то транслятор выдаст на экран строки сообщений, начинающиеся словами «Error» и «Warning». Программа предыдущей лекции (листинг 3.1) синтаксически правильная, но в учебных целях вы можете внести туда какую-нибудь бессмыслицу и посмотреть, что получится. Наличие строки с «Error» говорит о том, что у вас в программе есть недопустимые с точки зрения синтаксиса комбинации символов. Логика работы программы для транслятора не имеет никакого значения. Вы можете написать абсолютную чушь, но если она будет синтаксически правильна, транслятор поспешит вас обрадовать, сообщив, что все хорошо.

Наличие строки «Warning» означает, что конструкция синтаксически правильна, но не соответствует некоторым соглашениям языка и это может послужить источником последующих ошибок. Для устранения ошибок нужно определить место их возникновения и проанализировать ситуацию. Место ошибки легко определяется по значению в скобках в сообщении об ошибке. Это значение является номером ошибочной строки. Запомнив его, вы переходите в файл с исходной программой и по номеру строки находите место ошибки.

Этот способ локализации ошибок имеет недостатки. Во-первых, он не нагляден. Во-вторых, не всегда номера строк в сообщении соответствуют действительным номерам ошибочных строк в исходном файле. Такая ситуация будет наблюдаться, например, в том случае, если вы используете макрокоманды. При их использовании транслятор вставляет в файл дополнительные строки в соответствии с описанием применяемой макрокоманды, в результате чего получается отличие в нумерации. Исходя из этих соображений, для локализации ошибок лучше использовать информацию из специального, создаваемого транслятором файла листинга. Этот файл имеет расширение . 1st; его имя определяется в соответствии с теми соглашениями, которые мы разобрали выше. Ниже приведен полный формат листинга для программы, содержащей некоторые ошибки. Листинг — очень важный документ, и ему нужно уделить должное внимание.

Листинг 4.1. Пример листинга асемблера

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

Строки в файле листинга имеют следующий формат:

<глубина_вложенности> <номер_строки> <смещение> <машинный_код> <исходный_код>

Здесь:

  • <глубина_вложенности> — уровень вложенности включаемых файлов или макрокоманд в файле;

  • <номер_строки> - номер строки в файле листинга. Эти номера используются для локализации ошибок и формирования таблицы перекрестных ссылок.

Помните, что эти номера могут не соответствовать номерам строк в исходном файле. В добавление к вышесказанному нужно отметить, что ассемблер имеет директиву INCLUDE, которая позволяет включить в данный файл строки другого файла. Нумерация при этом, как и в случае макрокоманд, будет последовательная для строк обоих файлов. Факт вложенности кода одного файла в другой фиксируется увеличением значения <глубина_ вложенности> на единицу. Это замечание касается и использования макрокоманд;

  • <смещение> — смещение в байтах текущей команды относительно начала сегмента кода. Это смещение называют также счетчиком адреса. Смещение вычисляет транслятор для адресации в сегменте кода;

  • <машинный_код> - машинное представление команды ассемблера, представленной далее в этой строке полем <исходный_код>;

  • <исходный_код> — строка кода из исходного файла.

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

  • нормальном окончании процесса трансляции можно судить по сообщению TASM, в котором отсутствуют строки с сообщениями об ошибках и предупреждениях.

Изучая внимательно файл листинга, вы, наверное, заметили, что не все строки исходной программы имеют соответствующий <машинный_код>. Это обстоятельство обусловлено тем, что исходный файл на ассемблере в общем случае может содержать конструкции следующих типов:

  • команды ассемблера — конструкции, которым соответствуют машинные команды;

  • директивы ассемблера — конструкции, которые не генерируют машинных команд, а являются указаниями транслятору на выполнение некоторых действий или служат для задания режима его работы;

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

Формат листинга и его полнота не являются жестко регламентированными. Их можно изменить, задавая в исходном файле программы директивы управления листингом. Для знакомства с ними обратитесь к приложению.