Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭВМ ответы копия.docx
Скачиваний:
5
Добавлен:
20.09.2019
Размер:
100.61 Кб
Скачать

Инициализация программы

DOS имеет четыре требования для инициализации ассемблерной

EXE-программы: 1) указать ассемблеру, какие cегментные регистры должны

соответствовать сегментам, 2) сохранить в стеке адрес, находящийся в

регистре DS, когда программа начнет выполнение, 3) записать в стек нулевой

адрес и 4) загрузить в регистр DS адрес сегмента данных.

Выход из программы и возврат в DOS сводится к использованию команды

RET.

1. ASSUME – это ассемблерная директива, которая устанавливает

для ассемблера соответствие между конкретными сегментами и

сегментными регистрами

Ассоциируя сегменты с сегментными регистрами, ассемблер сможет

определить смещения к отдельным областям в каждом сегменте. Например,

каждая команда в сегменте кодов имеет определенную длину: первая

команда имеет смещение 0, и если это двухбайтовая команда, то вторая

команда будет иметь смещение 2 и т.д.

2. Загрузочному модулю в памяти непосредственно предшествует

256-байтовая (шест.100) область, называемая префиксом программного

сегмента PSP. Программа загрузчика использует регистр DS для

установки адреса начальной точки PSP. Пользовательская программа

должна сохранить этот адрес, поместив его в стек. Позже, команда RET

использует этот адрес для возврата в DOS.

3. В системе требуется, чтобы следующее значение в стеке

являлось нулевым адресом (точнее, смещением). Для этого команда SUB

очищает регистр AX, вычитая его из этого же регистра AX, а команда

PUSH заносит это значение в стек.

4. Загрузчик DOS устанавливает правильные адреса стека в

регистре SS и сегмента кодов в регистре CS. Поскольку программа

загрузчика использует регистр DS для других целей, необходимо

инициализировать регистр DS двумя командами MOV

5. Команда RET обеспечивает выход из пользовательской программы

и возврат в DOS, используя для этого адрес, записанный в стек в

начале программы командой PUSH DS. Другим обычно используемым выходом

является команда INT 20H.

Ассемблирование и выполнение программ

Шаг ассемблирования включает в себя трансляцию исходного кода в

машинный объектный код и генерацию 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]