6.Программы в COM-файлах
Ц е л ь: Объяснить назначение и
использование COM-файлов и перевод
ассемблерных программ в формат
COM-файлов.
ВВЕДЕНИЕ
________________________________________________________________
До сих пор вы писали, ассемблировали
и выполняли програм мы в
EXE-формате. Компановщик LINK
автоматически генерирует особый
формат для
EXE-файлов, в котором присутствует
специальный начальный блок
(заголовок)
pазмером не менее 512 байт. (В гл.22
рассматривается содержимое начальных
блоков).
Для выполнения можно также создавать
COM-файлы. Примером часто
используемого COM-файла является
COMMAND.COM. Программа EXE2BIN.COM в
оперативной системе DOS преобразует
EXE-файлы в COM-файлы. Фактически
эта
программа создает BIN (двоичный)
файл, поэтому она и называется
"преобразователь EXE в Вin (EXE-to-BIN)".
Выходной Вin-файл можно
переименовать в COM-файл.
РАЗЛИЧИЯ МЕЖДУ ПРОГРАММАМИ В EXE и
COM-файлах
________________________________________________________________
Несмотря на то, что EXE2BIN
преобразует EXE-файл в COM-файл,
cуществуют определенные различия
между программой, выполняемой как
EXE-файл и программой, выполняемой
как COM-файл.
Р а з м е р п р о г р а м м ы.
EXE-программа может иметь любой
размер, в то время как COM-файл
ограничен размером одного сегмента и
не
превышает 64К. COM-файл всегда
меньше, чем соответствующий
EXE-файл; одна
из причин этого - отсутствие в
COM-файле 512-байтового начального
блока
EXE-файла.
С е г м е н т с т е к а. В
EXE-программе определяется сегмент
стека,
в то время как COM-программа
генерирует стек автоматически. Таким
образом
при создании ассемблерной программы,
которая будет преобразована в
COM-файл, стек должен быть опущен.
С е г м е н т д а н н ы х. В EXE
программе обычно определяется
сегмент данных, а регистр DS
инициализируется адресом этого
сегмента. В
COM-программе все данные должны быть
определены в сегменте кода. Ниже
будет показан простой способ решения
этого вопроса.
И н и ц и а л и з а ц и я.
EXE-программа записывает нулевое
слово в
стек и инициализирует регистр DS.
Так как COM-программа не имеет ни
стека,
ни сегмента данных, то эти шаги
отсутствуют. Когда COM-программа
начинает
работать, все сегментные регистры
содержат адрес префикса программного
сегмента (PSP), - 256-байтового
(шест. 100) блока, который
резервируется
операционной системой DOS
непосредственно перед COM или EXE
программой в
памяти. Так как адресация начинается
с шест. смещения 100 от начала PSP,
то в программе после оператора
SEGMENT кодируется директива ORG
100H.
О б р а б о т к а. Для программ в
EXE и COM форматах выполняется
ассемблирование для получения
OBJ-файла, и компановка для
получения
EXE-файла. Если программа создается
для выполнения как EXE-файл, то ее
уже
можно выполнить. Если же программа
создается для выполнения как
COM-файл,
то компановщиком будет выдано
сообщение:
Warning: No STACK Segment
(Предупреждение: сегмент стека не
определен)
Это сообщение можно игнорировать,
так как определение стека в
программе не предполагалось. Для
преобразования EXE-файла в COM-файл
используется программа EXE2BIN.
Предположим, что EXE2BIN имеется на
дисководе A, а скомпонованный файл
по имени CALC.EXE - на дисководе B.
Введите
EXE2BIN B:CALC,B:CALC.COM
Так как первый операнд всегда
предполагает EXE файл, то можно не
кодировать тип EXE. Второй операнд
может иметь другое имя (не CALC.COM).
Если не указывать тип COM, то
EXE2BIN примет по умолчанию тип BIN,
который
впоследствии можно переименовать в
COM. После того как преобразование
будет выполнено можно удалить OBJ- и
EXE-файлы.
Если исходная программа написана для
EXE-формата, то можно, используя
редактор, заменить команды в
исходном тексте для COM файла.
ПРИМЕР COM-ПРОГРАММЫ
________________________________________________________________
Программа EXCOM1, приведенная на
рис.6.1, аналогична программе на
рис.4.3, но изменена согласно
требований COM-формата. Обратите
внимание на
следующие изменения в этой
COM-программе:
- Стек и сегмент данных отсутствует.
- Оператор ASSUME указывает
ассемблеру установить относительные
адреса с начала сегмента кодов.
Регистр CS также содержит этот
адрес,
являющийся к тому же адресом
префикса программного сегмента (PSP).
Директива ORG служит для
резервирования 100 (шест.) байт от
начального адреса под PSP.
- Директива ORG 100H устанавливает
относительный адрес для
начала выполнения программы.
Программный загрузчик использует
этот
адрес для командного указателя.
- Команда JMP используется для
обхода данных, определенных в
программе.
Ниже показаны шаги для обработки и
выполнения этой программы:
MASM [ответы на запросы обычные]
LINK [ответы на запросы обычные]
EXE2BIN B:EXCOM1,B:EXCOM1.COM
DEL B:EXCOM1.OBJ,B:EXCOM1.EXE
(удаление OBJ и EXE-файлов)
Размеры EXE- и COM-программ - 788 и
20 байт соответственно. Учитывая
такую эффективность COM-файлов,
рекомендуется все небольшие
программы
создавать для COM-формата. Для
трассировки выполнения программы от
начала
(но не включая) команды RET введите
DEBUG B:EXCOM1.COM.
Некоторые программисты кодируют
элементы данных после команд так,
что
первая команда JMP не требуется.
Кодирование элементов данных перед
командами позволяет ускорить процесс
ассемблирования и является
методикой,
рекомендуемой в руководстве по
ассемблеру.
__________________________________________________________________________
page 60,132
TITLE XCOM1 COM-программа для
пересылки и сложения
CODESG SEGMENT PARA 'Code'
ASSUME
CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP MAIN ;Обход через данные
;
---------------------------------------------------
FLDA DW 250 ;Определение данных
FLDB DW 125
FLDC DW ?
;
---------------------------------------------------
MAIN PROC NEAR
MOV AX,FLDA ;Переслать 0250 в AX
ADD AX,FLDB ;Прибавить 0125 к AX
MOV FLDC,AX ;Записать сумму в FLDC
RET ;Вернуться в DOS
MAIN ENDP
CODESG ENDS
END BEGIN
__________________________________________________________________________
Рис.6.1. Пример COM-программы.
СТЕК ДЛЯ COM-ПРОГРАММЫ
________________________________________________________________
Для COM-файла DOS автоматически
определяет стек и устанавливает
oдинаковый общий сегментный адрес во
всех четырех сегментных pегистрах.
Если для программы размер сегмента в
64К является достаточным, то DOS
устанавливает в регистре SP адрес
конца cегмента - шест.FFFE. Это
будет
верх стека. Если 64К байтовый
сегмент не имеет достаточно места
для стека,
то DOS устанавливает стек в конце
памяти. В обоих случаях DOS
записывает
затем в стек нулевое слово.
Возможность использования стека
зависит от размера программы и
ограниченности памяти. С помощью
команды DIR можно определить pазмер
файла
и вычислить необходимое пространство
для стека.
Все небольшие программы в этой книге
в основном расчитаны на
COM-формат.
ОСОБЕННОСТЬ ОТЛАДКИ
________________________________________________________________
Несоблюдение хотя бы одного
требования COM-формата может
послужить
причиной неправильной работы
программы. Если EXE2BIN обнаруживает
oшибку,
то выдается сообщение о
невозможности преобразования файла
без указания
конкретной причины. Необходимо
проверить в этом случае директивы
SEGMENT,
ASSUME и END. Если опущен ORG 100H,
то на данные в префиксе программного
сегмента будут установлены
неправильные ссылки с
непредсказуемым
результатом при выполнении.
При выполнении COM-программы под
управлением отладчика DEBUG
необходимо использовать команду D
CS:100 для просмотра данных и
команд. Не
следует выполнять в отладчике
команду RET; предпочтительнее
использовать
команду Q отладчика. Некоторые
программисты используют INT 20H
вместо
команды RET.
Попытка выполнить EXE-модуль
программы, написанной для
COM-формата,
не имеет успеха.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Объем COM-файла ограничен 64К.
- COM-файл меньше, чем
соответствующий EXE-файл.
- Программа, написанная для
выполнения в COM-формате не содержит
стека и сегмента данных и не требует
инициализации регистра DS.
- Программа, написанная для
выполнения в COM-формате использует
директиву ORG 100H после директивы
SEGMENT для выполнения с адреса
после
префикса программного сегмента.
- Программа EXE2BIN преобразует
EXE-файл в COM-файл, обусловленный
указанием типа COM во втором
операнде.
- Операционная система DOS
определяет стек для COM-программы
или в
конце программы, если позволяет
размер, или в конце памяти.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________
6.1. Каков максимальный размер
COM-файла?
6.2. Какие сегменты можно определить
в программе, которая будет
преобразована в COM-файл?
6.3. Как обходится COM-файл при
выполнении с фактом отсутствия
определения стека?
6.4. Программа в результате
компановки получала имя SAMPLE.EXE.
Напишите команду DOS для
преобразования ее в COM-файл.
6.5. Измените программу из вопроса
4.6 для COM-формата, обработайте
ее и выполните под управлением
отладчика DEBUG. |