Ассемблирование и выполнение программ
Шаг ассемблирования включает в себя трансляцию исходного кода в
машинный объектный код и генерацию OBJ-модуля. Вы уже встречали примеры
машинного кода в гл.2 и примеры исxодного текста в этой главе.
OBJ-модуль уже более приближен к исполнительной форме, но еще не
готов к выполнению. Шаг компановки включает преобразование OBJ-модуля в
EXE (исполнимый) модуль, содержащий машинный код. Программа LINK,
находящаяся на диске DOS, выполняет следующее:
1. Завершает формирование в OBJ-модуле адресов, которые остались
неопределенными после ассемблирования. Во многих следующих программах
такие адреса ассемблер отмечает как ----R.
2. Компонует, если необходимо, более одного отдельно
ассемблированного модуля в одну загрузочную (выполнимую) программу;
возможно две или более ассемблерных программ или ассемблерную
программу с программами, написанными на языках высокого уровня, таких
как Паскаль или Бейсик.
3. Инициализирует EXE-модуль командами загрузки для выполнения.
После компановки OBJ-модуля (одного или более) в EXE-модуль, можно
выполнить EXE-модуль любое число раз. Но, если необходимо внести некоторые
изменения в EXE-модуль, следует скорректировать исходную программу,
ассемблировать ее в другой OBJ-модуль и выполнить компоновку OBJ-модуля в
новый EXE-модуль. Даже, если эти шаги пока остаются непонятными, вы
обнаружите, что, получив немного навыка, весь процесс подготовки
EXE-модуля будет доведен до автоматизма. Заметьте: определенные типы
EXE-программ можно преобразовать в oчень эффективные COM-программы.
Предыдущие примеры, однако, не cовсем подходят для этой цели. Данный
вопрос рассматривается в главе 6.
АССЕМБЛИРОВАНИЕ ПРОГРАММЫ
________________________________________________________________
Для того, чтобы выполнить исходную ассемблерную программу, необходимо
прежде провести ее ассемблирование и затем компоновку. На дискете с
ассемблерным пакетом имеются две версии aссемблера. ASM.EXE - сокращенная
версия с отсутствием некоторых незначительных возможностей и MASM.EXE -
полная версия. Если размеры памяти позволяют, то используйте версию MASM
(подробности см. в соответствующем руководстве по ассемблеру).
Для ассемблирования, вставьте ассемблерную дискету в дисковод A, а
дискету с исходной программой в дисковод B. Кто имеет винчестер могут
использовать в следующих примеpах C вместо A и B. Простейший вариант
вызова программы это ввод команды MASM (или ASM), что приведет к загрузке
программы ассемблера с диска в память. На экране появится:
source filename [.ASM]:
object filename [filename.OBJ]:
source listing [NUL.LST]:
cross-reference [NUL.CRF]:
Курсор при этом расположится в конце первой строки, где необходимо
указать имя файла. Введите номер дисковода (если он не определен
умолчанием) и имя файла в следующем виде: B:EXASM1. Не следует набирать
тип файла ASM, так как ассемблер подразумевает это.
Во-втором запросе предполагается аналогичное имя файла (но можно его
заменить). Если необходимо, введите номер дисковода B:.
Третий запрос предполагает, что листинг ассемблирования программы не
требуется. Для получения листинга на дисководе B наберите B: и нажмите
Return.
Последний запрос предполагает, что листинг перекрестных cсылок не
требуется. Для получения листинга на дисководе B, наберите B: и нажмите
Return.
Если вы хотите оставить значения по умолчанию, то в трех последних
запросах просто нажмите Return. Ниже приведен пример запросов и ответов, в
результате которых ассемблер должен cоздать OBJ, LST и CRF-файлы. Введите
ответы так, как показано, за исключением того, что номер дисковода может
быть иной.
source filename [.ASM]:B:EXASM1 [Return]
object filename [filename.OBJ]:B: [Return]
source listing [NUL.LST]:B: [Return]
cross-reference [NUL.CRF]:B: [Return]
Всегда необходимо вводить имя исходного файла и, обычно, запрашивать
OBJ-файл - это требуется для компановки программы в загрузочный файл.
Возможно потребуется указание LST-файла, особенно, если необходимо
проверить сгенерированный машинный код. CRF-файл полезен для очень больших
программ, где необходимо видеть, какие команды ссылаются на какие поля
данных. Кроме того, ассемблер генерирует в LST-файле номера строк, которые
используются в CRF-файле.
В прил.4 "Режимы ассемблирования и редактирования" перечислены режимы
(опции) для ассемблера версий 1.0 и 2.0.
Ассемблер преобразует исходные команды в машинный код и выдает на
экран сообщения о возможных ошибках. Типичными ошибками являются нарушения
ассемблерных соглашений по именам, неправильное написание команд
(например, MOVE вместо MOV), а также наличие в опеpандах неопределенных
имен. Программа ASM выдает только коды ошибок, которые объяснены в
руководстве по ассемблеру, в то время как программа МASM выдает и коды
ошибок, и пояснения к ним. Всего имеется около 100 сообщений об ошибках.
Ассемблер делает попытки скорректировать некоторые ошибки, но в любом
случае следует перезагрузить текстовый редактор, исправить исходную
программу (EXASM1.ASM) и повторить ассемблирование.
Двухпроходный ассемблер
-------------------------
В процессе трансляции исходной программы ассемблер делает два
просмотра исходного текста, или два прохода. Одной из основных причин
этого являются ссылки вперед, что происходит в том случае, когда в
некоторой команде кодируется метка, значение которой еще не определено
ассемблером.
В первом проходе ассемблер просматривает всю исходную прогpамму и
строит таблицу идентификаторов, используемых в программе, т.е. имен полей
данных и меток программы и их относительных aдресов в программе. В первом
проходе подчитывается объем объектного кода, но сам объектный код не
генерируется.
Во втором проходе ассемблер использует таблицу идентификаторов,
построенную в первом проходе. Так как теперь уже известны длины и
относительные адреса всех полей данных и команд, то ассемблер может
сгенерировать объектный код для каждой команды. Ассемблер создает, если
требуется, файлы: OBJ, LST и CRF.
Поиск по сайту:
|