Трансляция программы

Следующий шаг на пути создания исполняемого модуля — трансляция програм­мы. Для трансляции нужен подготовленный и записанный на диск исходный текст программы (см. листинг 6.1).

На этапе трансляции решается несколько задач:

- перевод команд ассемблера в соответствующие машинные команды;

- построение таблицы символов;

- расширение макросов;

- формирование файла листинга и объектного модуля.

Программа, которая реализует эти задачи, называется ассемблером. Итог рабо­ты ассемблера — два файла: файл объектного модуля и файл листинга.

 

Объектный модуль включает в себя представление исходной программы в ма­шинных кодах и некоторую другую информацию, необходимую для отладки и ком­поновки его с другими модулями. При использовании пакета TASM получение объектного модуля исходного файла производится программой (ассемблером) tasm.exe. Формат командной строки для запуска tasm.exe следующий:

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

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

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

В результате будут созданы файлы с одинаковыми именами и разными расши­рениями, как показано на рис. 6.1 для второго этапа.

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

tasm.exe рrg_6_1 . .prg_list,

В результате на диске будут созданы файлы prg_6_l.obj, prg_list.lst, prg_6_l.crf.

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

- tasm.exeprg_6_I . .nul,

В результате на диске будут созданы файлы prg_6_l.obj, prg_6_l.crf.

Необязательный аргумент [ключи] позволяет задавать режим работы транслятора TASM. Этих ключей достаточно много, и все они описаны в приложении В (http://www.piter.com/downbad).

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

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

2. Поместите в каталог ..\WORK файлы tasm.exe, tlink.exe и rtm.exe. Если в дальнейшем в каталоге ..\WORK не окажется каких-то рабочих файлов вашей программы, программы tasm.exe и tlink.exe выдадут соответствующее сообщение.

3. Поместите в каталог. .\WORK файл prg_6_l.asm.

 

После всех этих действий можно начинать работу. Для этого следует перейти в каталог ..\WORK и инициировать трансляцию программы prg_6_l.asm командной строкой вида tasm.exe/zi prg_6_l…

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

Для устранения ошибок нужно определить место их возникновения и проана- лизировать ситуацию. Местоположение ошибки легко определяется по значению в скобках в сообщении об ошибке. Это значение является номером ошибочной строки. Запомнив его, нужно перейти в файл с исходной программой и по номеру строки найти место ошибки. Этот способ локализации ошибок имеет недостатки. Во-первых, он не нагляден. Во-вторых, не всегда номера строк в сообщении соответствуют действительным номерам ошибочных строк в исходном файле. Такая ситуация будет наблюдаться, например, при использовании макрокоманд. В этом случае транслятор вставляет в файл дополнительные строки в соответствии с описанием применяемой макрокоманды, а в результате происходит сбой в нумерации. По этим соображениям для локализации ошибок лучше использовать информацию из специального создаваемого транслятором файла листинга. Этот файл имеет расширение .lst, а его имя определяется в соответствии с рассмотренными выше согла­шениями. В листинге 6.2 приведен полный формат файла листинга для программы содержащей некоторые ошибки. Файл листинга — это всегда очень важный доку­мент, и ему нужно уделить должное внимание.

return false">ссылка скрыта

 

 

 

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

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

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

Далее описано каждое из этих полей:

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

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

ПРИМЕЧАНИЕ

Как уже упоминалось, номера строк листинга могут не соответствовать номерам строк в исходном файле. В добавление к сказанному paнее нужно отметить, что в ассемблере имеется директива INCLUDE, которая позволяет включить в файл строки другого файла. Нумерация при этом, как и в случае макрокоманд, будет последовательная для строк обоих файлов. Факт вложенности кода одного файла в другой фиксируется увеличением значения поля «глубина_вложенности» на единицу. Это замечание касается и макрокоманд.

- смещение в байтах текущей команды относительно начала сегмента кода. Это смещение называют также счетчиком адреса. Величину смещения вычисляет транслятор для адресации в сегменте кода.

- машинный_код — машинное представление команды ассемблера, представленной далее в этой строке полем исходный_код.

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

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

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

Изучая внимательно файл листинга следует обратить внимание на то, что не все строки исходной программы имеют соответствующий машинный код (строки 9, 16.17.19...22,48...50). Это обстоятельство обусловлено тем, что исходный файл наассемблере в общем случае может содержать конструкции следующих типов:

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

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

- макрокоманды — конструкции, которые, будучи представлены одной строкой в исходном файле программы, после обработки транслятором генерируют в объектном модуле последовательность команд, директив или макрокоманд ассемблера. Формат файла листинга и его полнота не являются жестко регламентированными. Их можно изменить, задавая в исходном файле программы директивы управления листингом (приложение Г, http://www.piter.com/download).