Czym jest plik COM?
Pliki COM sÄ po prostu używane do wykonywania zestawu poleceÅ lub instrukcji. Plik COM skÅada siÄ z programu wykonywalnego, który można uruchomiÄ z systemu Windows lub MS-DOS. Podobnie jak plik EXE, plik COM jest również zapisywany w formacie binarnym, ale różni siÄ od pliku EXE, ponieważ nie ma nagÅówka ani metadanych, a także ma maksymalny rozmiar okoÅo 64 KB. Gdy plik COM jest uruchamiany po raz pierwszy w systemie 32-bitowym, pojawia siÄ monit o zainstalowanie skÅadnika NT Virtual DOS Machine (NTVDM). Plik COM można uruchomiÄ w 64-bitowej wersji systemu Microsoft Windows z maszynÄ wirtualnÄ obsÅugujÄ cÄ Årodowisko MS-DOS.
Format pliku COM
Format pliku COM to binarny format pliku wykonywalnego używany w systemie Microsoft Windows lub MS-DOS. Jego struktura skÅada siÄ tylko z zestawu instrukcji; nie ma nagÅówka i nie zawiera standardowych metadanych. Przechowuje wszystkie swoje dane i kod tylko w jednym segmencie, a jego plik binarny ma maksymalny rozmiar 64 KB. Ten format pliku nie zmienia lokalizacji przy próbie ponownego uruchomienia. Tak wiÄc system operacyjny Åaduje go pod wstÄpnie ustawionym adresem. Ponadto możliwe jest wykonanie pliku COM w obu systemach operacyjnych w postaci fat binarnego. Nie ma żadnej faktycznej kompatybilnoÅci na poziomie instrukcji. Instrukcje w punkcie wejÅcia sÄ wybierane tak, aby miaÅy takÄ samÄ funkcjonalnoÅÄ, ale różne w obu systemach operacyjnych, i powodujÄ , że uruchomiony program przeskakuje do sekcji używanego systemu operacyjnego. Zasadniczo sÄ to dwa różne programy z tÄ samÄ procedurÄ w jednym pliku, poprzedzone kodem wybierajÄ cym ten, którego należy użyÄ.
PrzykÅad pliku COM
Podczas wykonywania pliku COM instrukcje sÄ odczytywane od pierwszego bajtu i sÄ wykonywane kolejno, aż do znalezienia ostatniej instrukcji. Oto przykÅad kodu 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,'$'