Какво е COM файл?
COM файловете се използват просто за изпълнение на набор от команди или инструкции. COM файлът се състои от изпълнима програма, която може да се изпълнява от Windows или MS-DOS. Подобно на EXE файл, COM файлът също се записва в двоичен формат, но е различен от EXE файла, защото няма заглавка или метаданни и също така има максимален размер от приблизително 64 KB. Когато COM файлът се стартира за първи път на 32-битова система, той подканва да инсталирате компонента NT Virtual DOS Machine (NTVDM). COM файлът може да се изпълнява на 64-битовата версия на Microsoft Windows с виртуална машина, която поддържа MS-DOS среда.
COM файлов формат
Файловият формат COM е двоичен изпълним формат, използван в Microsoft Windows или MS-DOS. Структурата му се състои само от набор от инструкции; няма заглавка и не съдържа стандартни метаданни. Той съхранява всичките си данни и код само в един сегмент и неговият двоичен файл има максимален размер 64 KB. Този файлов формат не се премества при опит за повторно стартиране. Така че операционната система го зарежда на предварително зададен адрес. Освен това е възможно да се направи COM файл, който да се изпълнява и под двете операционни системи под формата на fat binary. Няма реална съвместимост на ниво инструкция. Инструкциите във входната точка са избрани така, че да са еднакви по функционалност, но различни в двете операционни системи, и карат програмата да работи, прескача до раздела на използваната операционна система. По същество това са две различни програми с една и съща процедура в един файл, предшествани от код, който избира тази, която да се използва.
Пример за 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,'$'