.COM вариант №
Файлы COM просто используются для выполнения набора команд или инструкций. COM-файл состоит из исполняемой программы, которую можно запускать из Windows или MS-DOS. Подобно файлу EXE, файл COM также сохраняется в двоичном формате, но отличается от файла EXE тем, что не имеет заголовка или метаданных, а также имеет максимальный размер примерно 64 КБ. При первом запуске COM-файла в 32-разрядной системе предлагается установить компонент NT Virtual DOS Machine (NTVDM). COM-файл можно запустить в 64-разрядной версии Microsoft Windows с виртуальной машиной, поддерживающей среду MS-DOS.
Формат COM-файла
Формат файла COM — это двоичный исполняемый формат, используемый в Microsoft Windows или MS-DOS. Его структура состоит всего лишь из набора инструкций; он не имеет заголовка и не содержит стандартных метаданных. Он хранит все свои данные и код только в одном сегменте, а его двоичный файл имеет максимальный размер 64 КБ. Этот формат файла не перемещается при попытке повторного запуска. Таким образом, операционная система загружает его по заранее заданному адресу. Более того, можно сделать COM-файл для выполнения под обеими операционными системами в виде толстого двоичного файла. Никакой фактической совместимости на уровне инструкций нет. Инструкции в точке входа выбираются одинаковыми по функциональности, но разными в обеих операционных системах, и заставляют программу работать, переходить к разделу используемой операционной системы. По сути, это две разные программы с одной и той же процедурой в одном файле, которым предшествует код, выбирающий ту, которую следует использовать.
Пример COM-файла
При выполнении COM-файла инструкции считываются с первого байта и выполняются последовательно, пока не будут найдены последние инструкции. Вот пример кода ASM:
[BITS 16] ;Set code generation to 16 bit mode
[ORG 0x0100] ;Set code start address to 0100h
[SEGMENT .text] ;Main code segment
mov ah, 9 ; DOS print string function
mov dx, hello
int 21h
;Exit to DOS
mov ah, 4ch
int 21h
[SEGMENT .data] ;Initialised data segment
hello: db 'Hello, .COM programmer!',13,10,'$'