Що таке файл 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,'$'