5.12. Преодразование файла типа .exe в файл типа .com.

На дискете с DOS имеется сервисная программа под именем EXE2BIN. Эта программа преобразует файл типа .EXE в файл типа .COM. Однако программа EXE2BIN работает не со всеми файлами. Далее излагается метод использования программы DEBUG, с помощью которого любая программа преобразуется в файл типа .COM.

На Фиг. 5.18 приведена программа, которую мы будем преобразовывать. Эта программа выполняет точно такие же функции, что и программа предыдущего примера, а именно - выводит на дисплей фразу : "Это тест". Однако в данной программе эта строка выводится на дисплей по прерыванию INT 21H с помощью функции 9 DOS.


Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:00:28
Фиг. 5.18 Пример преобразования файла типа .EXE в тип .COM      Page  1-1
PAGE ,132

Фиг. 5.18 Пример преобразования файла типа .EXE в тип .COM
0000                     CODE     SEGMENT
                         ASSUME   CS:CODE,DS:CODE
0100                              ORG       100H
0100    8D 16 010A R              LEA       DX, MESSAGE
0104    B4 09                     MOV       AH, 9H       ; Функция вывода строки ДОС
0106    CD 21                     INT       21H          ; Вывод строки на экран
0108    CD 20                     INT       20H          ; Возврат в ДОС

010A    9D E2 A0 20 AF E0 AE      MESSAGE   DB  'Эта программа - тест', 10, 13, '$'
        A3 E0 A0 AC AC A0 20
        2D 20 E2 A5 E1 E2 0A
        0D 24
0121                     CODE     ENDS
                         END

                                  Фиг. 5.18 Пример перевода .EXE в .COM

Обратите внимание, что данная программа записана как файл типа .COM. На это указывает оператор ORG 100H, предшествующий первой команде. Остальная часть программы должна быть перемещаемым сегментом команд, и об этом не нужно забывать при написании программы, которая будет преобразовываться в файл типа .COM.

Ассемблирование и редактирование связей этой программы осуществляется обычным способом. Однако до запуска программы DEBUG нужно изменить в имени файла тип .EXE на тип .COM. Это необходимо сделать, так как программа DEBUG не позволяет записывать файл типа .EXE. На Фиг. 5.19 показана последовательность шагов, которую нужно выполнить. В данном примере вводится команда программы DEBUG без имени файла. В качестве имени можно было бы в данной строке указать FIG5=18.COM, зато его отсутствие позволило продемонстрировать некоторые другие функции программы DEBUG. Команда N отладчика позволяет задать имя файла. После этого команда L выполняет загрузку файла в память. Если указать имя файла в команде DEBUG, то последняя выполнит все то же самое, что и команды N и L. Теперь, когда файл загружен, вы обнаружите, что в дествительности программа загрузилась, начиная со смещения 400H. Команда M сдвигает содержимое области памяти с 400H на 100H. Длина области, равная 1000H, была выбрана для гарантии того, что там поместится вся программа. Теперь программа соответствует формату файла типа .COM и может быть опять записана на дискету. Однако прежде, чем это сделать, вы изменяете содержимое регистра CX, чтобы он указал фактическую длину программы. При любом считывании и записи файлов на дискету, осуществляемых программой DEBUG, длина файла хранится в регистре CX. Так как файл типа .COM теперь намного короче, чем был файл типа .EXE, то мы можем сэкономить дисковую память, задав в регистре CX правильное значение для программы.


B>A:ASM FIG5_18,,,;

The IBM Personal Computer Assembler
Version 1.00 (c)Copyright IBM Corp 1981

Warnings       Severe
Errors         Errors
0              0

B>A:LINK FIG5_18,,,;

Ibm Personal Computer Linker
Version 1.10 (C)Copyright IBM Corp 1982

Warning: No STACK segment
There was 1 error detected.

B>RENAME FIGS5_18.EXE FIGS5_18.COM

B>A:DEBUG
-NFIGS_18.COM
-L
-M 400 1000 100

-U100 10F
06D7:0100 BA091        MOV    DX,0109
06D7:0103 B409         MOV    AH,09
06D7:0105 CD21         INT    21
06D7:0107 CD20         INT    20
06D7:0109 54           PUSH   SP
06D7:010A 68           DB     68
06D7:010B 69           DB     69
06D7:010C 7320         JNC    012E
06D7:010E 69           DB     69
06D7:010F 7320         JNC    0131

-D100
06D7:0100    BA 09 01 B4 09 CD 21 CD-20 54 68 69 73 20 69 73     :..4.M!M' This is
06D7:0110    20 61 20 74 65 73 74 DA-0D 24 00 00 00 00 00 00      a test..$.......
06D7:0120    00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00      ................
06D7:0130    00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00      ................
06D7:0140    00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00      ................
06D7:0150    00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00      ................
06D7:0160    00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00      ................
06D7:0170    00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00      ................

-RCX
CX 0380
:120

-W

Writing 0120 bytes
-Q

>BDEBUG FIG5_18.COM

-R

AX=0000  BX=0000  CX=0120  DX=0000  SP=FFF0  BP=0000  SI=0000  DI=0000
DS=04B5  ES=04B5  SS=04B5  CS=04B5  IP=0100  NV UP DI NZ NA PO NC

-Q

B>FIG5_18

Эта программа - тест

        Фиг. 5.19 Пример преобразования из.EXE в .COM 

Команда W записывает файл обратно на дискету. Кстати, это еще одно преимущество использования файлов типа .COM. Программа DEBUG не будет записывать файл типа .EXE на дискету, потому что в памяти отсутствует информация головной метки. В то же время файл типа .COM может быть записан на дискету программой DEBUG. Если вы отлаживаете программу и вам нужно изменить в ней один или два байта без ее повторного ассемблирования (это называется "латанием" программы), то это можно сделать. Просто внесите в программу изменения, убедитесь, что регистр CX установлен правильно, и с помощью команды W запишите программу на дискету.

В результате работы отладчика получился новый вариант программы FIG5=18.COM. Обращая внимание на состояние регистров, мы видим, как они устанавливаются в случае файла типа .COM. Сравните это с показанным на Фиг. 5.17 состоянием регистров для файла типа .EXE. Разница между ними поможет уяснить некоторые различия между файлами типа .COM и типа .EXE.

КомандаОписание
DВывод содержимого памяти
EИзменить содержимое памяти
FЗаполнить блок памяти
GВыполнять программу
HШестнадцатеричное сложение и вычитание
IСчитать и показать значение из порта
JЗагрузить с диска
MПереслать блок памяти
NНазначить имя файла
OВывести значение в порт
QВыход из отладчика
RВывести значения регистров
SПоиск строки байт
TВыполнить одну команду
UДизассемблировать блок кода
WЗаписать данные на диск

Фиг. 5.20 Команды DEBUG

Имеются и другие команды, используемые при работе с отладчиком DEBUG. На Фиг. 5.20 приведен полный набор команд для работы с программой DEBUG. В руководстве по DOS подробно описаны эти команды.