Меню сайта

Урок 88. Файлы .com и .exe

В предыдущем примере рассматривался файлтипа .COM. — Однако
— — — результатом процессаассемблирования-редактирования связей является
— — — обычно файл типа .EXE. — Зачем нужен файл типа .COM, если проще
— — — получить файл типа .COM?

— — — — — У каждого из обоих типов файлов есть своипреимущества. И чтобы
— — — принять обоснованное решение о том, какойиз них предпочесть в
— — — каждом конкретном случае, нужнопредставлять их отличия.

— — — — — Главное различие между файлами типа .COM итипа .EXE связано с
— — — форматом записи соответствующегообъектного файла на дискете. Оба
— — — типа файлов являются программами,записанными на машинном языке.
— — — Программа, записанная в файле типа .COMможет сразу выполняться.
— — — DOS может непосредственно загрузить его впамять машины с дискеты.
— — — После этого DOS передает управление всегмент памяти, отведенный
— — — для команд, в точку со смещением 100H.Файл типа .EXE
— — — непосредственно выполнен быть не может. Усоответствующего
— — — объектного файла, хранящегося на дискете,имеется заголовок. В нем
— — — содержится информация, сгенерированнаяредактором связей. Наиболее
— — — важная ее часть относится к информации,связанной с перемещением. В
— — — то время, как у файла типа .COM перемещаемодин сегмент команд, у
— — — файла типа .EXE могут быть перемещенымногие различные сегменты.
— — — Это ограничивает максимальный размер файла.COM 64 кбайтами, если
— — — только программа не подгружает еще идругие сегменты. Файл типа
— — — .EXE может содержать ряд сегментов,которые динамически
— — — перемещаются в пределах программнойобласти.

— — — — — В чем состоит перемещаемость? Во времяассемблирования
— — — программа расположена в каком-тоопределенном месте памяти. Как
— — — было ранее установлено, ассемблеравтоматически начинает каждый
— — — сегмент со смещением 0. В ассемблерныхлистингах рядом с некоторыми
— — — адресами стоят символы R. Это означает,что данный адрес является
— — — перемещаемым. Если программа сдвигаетсятак, что ее начало будет
— — — иметь смещение, отличное от 0, тоупомянутый адрес должен быть
— — — изменен. Обычно перемещением занимаетсяредактор связей. Однако
— — — пересчет значений некоторых адресов неможет быть выполнен до
— — — загрузки программы. В каждом файле типа.EXE имеется информация о
— — — таких адресах.

— — — — — Файл типа .COM не является перемещаемым. Утакого файла
— — — отсутствует информация, необходимая дляперемещения. Вместо этого у
— — — программы, составляющей файл типа .COM,должен быть перемещаем
— — — сегмент команд. Это означает, что хотя самсегмент команд можно
— — — модифицировать, начальное смещение всегдадолжно быть одним и тем
— — — же. В такой программе все смещения должныоставаться неизмененными.
— — — Кроме того, от программиста требуетсяпредусмотреть, чтобы при
— — — любой операции с сегментными регистрами(например, запись в
— — — сегментный регистр полученного значения)всегда производилось
— — — обращение к регистру текущего сегментакоманд. Примером правильной
— — — программной последовательностью для записив регистр DS текущего
— — — значения сегмента команд будет:

— — — — — PUSH — CS
— — — — — POP DS

— — — — — Иногда может показаться заманчивым реализоватьту же операцию с
— — — помощью следующей последовательностикоманд (предположим, что как и
— — — в приведенной на Фиг. 5.6 программе имясегмента команд — «CODE»)

— — — — — MOV — — — -AX,CODE
— — — — — MOV — — — -DS,AX

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

— — — — — Между описываемыми типами файлов имеютсяразличия в отношении
— — — установки значений сегметных регистров ирасположения стека. Для
— — —
файла типа .COM значения регистров CS, DS,ES и SS устанавливаются
— — — DOS, равными такими, что они указывают натот сегмент, в который
— — — они загружают программу. Значение регистраSP устанавливается так,
— — — чтобы он указывал на последнюю доступную всегменте ячейку памяти.
— — — Таким образом программа занимает начало, астек — конец сегмента.

— — — — — В головной метке файла типа .EXE задаютсязначения регистров
— — — CS, IP, SS и SP. Значения регистров DS иES DOS устанавливает таким
— — — образом, чтобы они указывали на тотсегмент, в который загружается
— — — программа. Регистр CS указывает насегмент, который был
— — — идентифицирован как сегмент содержащийстартовый адрес программы.
— — — Если в файле типа .COM программа должнаиметь начальное смещение в
— — — сегменте команд равным 100H, то впрограммном файле типа .EXE
— — — начальный адрес может иметь другоезначение. Как показано ниже,
— — — значение этого адреса может содержаться воператоре END:

— — — — — END START_LOCATION

— — — — — Это является указаниемассемблеру-редактору связей, что после
— — — загрузки программы управление следуетпередать на метку
— — — START_LOCATION.

— — — — — В обоих типах файлов используетсяпрограммный префикс PSP,
— — — который образуют первые 100H байтов тогосегмента, куда загружается
— — — программа. В этой области памяти хранитсяспециальная информация, о
— — — которой говорилось при рассмотрениипрограммы, приведенной на
— — — Фиг. 5.6. В случае файла типа .EXEрегистры DS и ES указывают на
— — — эту область данных, тогда как значениярегистров CS и SS
— — — устанавливаются на соответствующих этапах
— — — ассемблирования-редактирования связей. Вслучае файла типа .COM все
— — — регистры указывают на PSP. Этообеспечивает обоим типам файлов
— — — непосредственный доступ к информации,хранящейся в порядке
— — — программного сегмента.

— — — — — Преимущества файла типа .COM состоит втом, что в этом случае
— — — регистр CS указывает на PSP, а в файлетипа .EXE — нет. Прерывания
— — — 20H и 27H, связанные с завершениемвыполнения программы и передачей
— — — управления DOS, требуют, чтобы во времяпрерывания регистр указывал
— — — на PSP. В случае файла типа .EXE этоосуществить сложно. К
— — — счастью, следующая последовательностькоманд позволяет в
— — — программном файле типа .EXE передатьуправление обратно DOS.

— — — — — PROGRAM PROG FAR
— — — — — — -PUSH DS — — — — — — — — — — запись — — -сегмента — — с — — -PSP
— — — — — — -MOV — — — — — AX,0
— — — — — — -PUSH AX — — — — — — — — — запись — — в — -стек — — смещения — — — 0
— — — — — — -…
— — — — — — -RET
— — — — — PROGRAM ENDP

— — — — — В относящейся к PSP ячейке со смещением 0содержится команда
— — — INT 20H. Запись в стек состояния регистраDS и нуля устанавливает
— — — значение адреса длинного возврата, равноеадресу PSP со смещением
— — — 0. Выполнив команду возврата, программаперейдет к команде INT 20H.
— — — Но к этому моменту в регистре CS уже будетхраниться значение PSP,
— — — и команда прерывания INT 20H возвратитуправление DOS.

— — — — — Для прерывания 27H, при которомзавершается работа программы и
— — — управление передается DOS с сохранениемпрограммы в памяти,
— — — аналогичного способа реализации нет. Хотяимеются методы записи в
— — — регистр CS правильного значения передпрерыванием 27H, обычно более
— — — простым является организация программы ввиде файла типа .COM.
— — — — — И наконец, файл типа .COM занимает надиске меньше места, чес
— — — файл типа .EXE с такой же как в файле типа.COM программой. Так как
— — — у файла типа .COM отсутствует заголовок,то и места для него на
— — — диске не требуется. При рассмотрении вследующем разделе программы
— — — DEBUG будет изложен метод, позволяющийпреобразовывать файл типа
— — — .EXE в файл типа .COM.

Категория: Программирование на Ассемблере | Дата: 29.01.13

Меню раздела
Блок