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

На Фиг. 5.18 приведена программа, которую мы будем  преобразовывать. Эта программа выполняет точно такие же функции,  что и программа предыдущего примера, а именно - выводит на дисплей  фразу : "Это тест". Однако в данной программе эта строка выводится  на дисплей по прерыванию INT 21H с помощью функции 9 DOS.
           Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:02:33

           Фиг. 5.18 Пример преобразования файла типа .EXE в тип .COM  Page     1-1

 

                                          PAGE   ,132

                                          TITLE  Фиг. 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, то мы можем сэкономить дисковую

                  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 

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

                  >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 (продолжение)

память, задав в регистре CX правильное значение для программы. 

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

        Команда        Описание

      -------------------------------------------------

           D     Вывод содержимого памяти

            E     Изменить содержимое памяти

           F     Заполнить блок памяти

           G     Выполнять программу

           H     Шестнадцатеричное сложение и вычитание

           I     Считать и показать значение из порта

           L     Загрузить с диска

           M     Переслать блок памяти

           N     Назначить имя файла

           O     Вывести значение в порт

           Q     Выход из отладчика

           R     Вывести значения регистров

           S     Поиск строки байт

           T     Выполнить одну команду

           U     Дизассемблировать блок кода

           W     Записать данные на диск

      --------------------------------------------------

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

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

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