На дискете с 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
подробно описаны эти
команды.