Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / Gl21

.doc
Скачиваний:
16
Добавлен:
20.05.2014
Размер:
29.7 Кб
Скачать

Исполняемые файлы формата 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.

Соседние файлы в папке Лекции