На этом шаге мы рассмотрим структуру COM-файлов.
Компоновщик LINK автоматически генерирует особый формат EXE-файлов, в котором присутствует специальный начальный блок (заголовок) размером не менее 512 байт. Программа EXE2BIN преобразует EXE-файлы в COM-файлы.
Перечислим основные различия между EXE и COM-программами:
Когда COM-программа начинает работать, то все сегментные регистры содержат адрес префикса программного сегмента (PSP) размером 256 байт (100h). Он содержит различную служебную информацию, в том числе команду выхода в DOS и стек. Префикс программного сегмента организуется как при выполнении COM-файла, так и при выполнении EXE-файла. Разница заключается в том, что PSP в COM-файле расположен в кодовом сегменте, в то время как для EXE-файла он создается вне кодового сегмента. Таким образом, адресация в сегменте кодов для COM-файла должна начинаться со смещения 100h от начала PSP, и, следовательно, после директивы SEGMENT в программе должна стоять директива ORG 100H для пропуска PSP:
Рис.1. Размещение в памяти COM- и EXE-программ
Напомним, что если программа создается как COM-файл, то компоновщиком будет выдано сообщение: Warning: No STACK Segment. Это сообщение можно игнорировать, так как определение стека в программе не предполагалось. Для преобразования EXE-файла в COM-файл используется программа EXE2BIN, общий вид использования которой следующий:
EXE2BIN <EXE-файл> <COM-файл> .
Например, команда:
EXE2BIN CALC.EXE CALC.COM
образует из файла CALC.EXE файл CALC.COM. Таким образом, на диске будут находиться два файла с одинаковыми именами, но различными расширениями.
С дополнительной информацией по получению COM-файлов можно познакомиться на 26 шаге.
Со следующего шага мы начнем рассматривать обработку символьной информации.