
Лекции / Gl21
.docИсполняемые файлы формата com
Мы уже создавали com-файлы с помощью отладчиков. Посредством tasm и tlink мы создавали только exe-файлы. Теперь с их помощью научимся получать и .com-файлы. Расширение файла com расшифровывается так: COre iMage. Вольный перевод: образ в оперативной памяти. Мы видели, что exe-файлы содержат блок управляющей и настроечной информации, в листинге отмечалось специальными флажками, где коды объектного и загрузочного файлов будут различными. Содержимое com-файла — в точности те же коды, которые будут расположены после загрузки в оперативной памяти. Эти файлы занимают меньше дисковой памяти, быстрее загружаются в ОЗУ, но при их создании надо придерживаться некоторых ограничений.
Различия между exe- и com-файлами сведем в таблицу (табл. *.1)
Таблица *.1
Свойство |
exe-файл |
com-файл |
Размер программы |
Любой |
Не превышает 64 Кбайта |
Стек |
Определяется сегмент стека. |
Стек определяется при загрузке. SP = FFFE. |
Данные |
Обычно определяется сегмент данных. |
Данные размещаются в кодовом сегменте. |
Содержимое сегментных регистров |
CS — указывает на сегмент кода, SS — указывает на сегмент стека, DS, ES — указывают на PSP |
CS, SS, DS, ES — указывают на PSP |
Итак, из первой строки таблицы ясно, что размер com-файла не превышает 64K. Но в Windows 95 размер файла command.com составляет 92870 байтов! На самом деле это exe-файл (нетрудно убедиться, что его первые два байта образуют сигнатуру 'MZ') и расширение .com ему присваивают по традиции.
Прежде чем приводить пример .com-программы, познакомимся с новой для нас директивой Ассемблера.
ORG выражение — вычисляет выражение и присваивает полученное значение счетчику адреса. (Напомню, что счетчик адреса хранится во встроенной переменной $.)
Пример программы повторяет нашу первую программу, но в новом формате:
pc.asm
INCLUDE macro.inc
.MODEL tiny
.CODE
ORG 100h ; Выделить пространство для PSP
start: jmp short begin ; "Обойти" данные
msg DB "Hello!",0Dh,0Ah,'$'
begin: message msg
exit
END start
Директива ORG 100h выделяет 256 байтов для префикса программного сегмента. (Можно было вместо этой директивы написать $ = $ + 100h или DB 100h DUP(?).) При написании программ в exe-формате заботиться об этом не было необходимости.
Данные рекомендуется помещать перед кодом, чтобы ассемблеру было легче сгенерировать нужные коды команд. Но по смещению 100h обязательно должна находиться команда, а не данные. Поэтому инструкция безусловного перехода передает управление на первую "настоящую" команду кода. Сегментный регистр DS теперь загружать не нужно. Программу можно было завершить не вызовом функции 4Ch, а прерыванием int 20h, специально предназначенным для завершения com-программ. (Для int 20h регистр CS должен указывать на PSP. Но для com-программ это и так выполнено.)
Последовательность действий для получения com-файла. Нужно выполнить команды:
tasm pc.asm
tlink/t pc.obj
Ключ /t указывает tlink, что нужно создавать pc.com, а не pc.exe. (t — сокращение от tiny.)
Упражнение. Какое сообщение об ошибке выдаст tlink, если вы опустите директиву ORG 100h? если вы включите директиву .STACK 100h?
Упражнение. Сравните размеры файлов p.exe (гл. ) и p.com.
С помощью MASM файл pc.com можно получить так:
ml/AT pc.asm
В ранних версиях MASM сначала нужно было получить exe-файл, а затем преобразовать его в com-файл с помощью утилиты exe2bin.
Отладка com-файлов. Если, как раньше, добавить к tasm и tlink ключи /zi и /v, то, к нашему разочарованию, td сообщит нам "Program has no symbol table". Действуем по-другому: сначала получим pc.exe, а затем преобразуем его в pc.com, размещая отладочную информацию в отдельном файле.
tasm/zi pc.asm
tlink/v pc.obj (создает pc.exe, выдает предупреждение: No stack — игнорируем его)
tdstrip –s –c pc.exe
td pc.com
Утилита tdstrip переносит отладочную информацию из pc.exe в файл pc.tds (ключ –s), и преобразует pc.exe в pc.com (ключ –c). Отладчик, не найдя в исполняемом файле отладочной информации, ищет ее в файле с расширением tds.