Τι είναι ένα αρχείο COM;
Τα αρχεία COM χρησιμοποιούνται απλώς για την εκτέλεση ενός συνόλου εντολών ή εντολών. Ένα αρχείο COM αποτελείται από ένα εκτελέσιμο πρόγραμμα που μπορεί να εκτελεστεί από Windows ή MS-DOS. Ομοίως, ένα αρχείο EXE, το αρχείο COM αποθηκεύεται επίσης σε δυαδική μορφή, αλλά είναι διαφορετικό από το αρχείο EXE επειδή δεν έχει κεφαλίδα ή μεταδεδομένα και επίσης έχει μέγιστο μέγεθος 64 KB περίπου. Όταν το αρχείο COM εκτελείται για πρώτη φορά σε ένα σύστημα 32-bit, ζητά να εγκαταστήσετε το στοιχείο NT Virtual DOS Machine (NTVDM). Το αρχείο COM μπορεί να εκτελεστεί στην έκδοση 64-bit των Microsoft Windows με μια εικονική μηχανή που υποστηρίζει το περιβάλλον MS-DOS.
Μορφή αρχείου COM
Η μορφή αρχείου COM είναι μια δυαδική εκτελέσιμη μορφή που χρησιμοποιείται στα Microsoft Windows ή στο MS-DOS. Η δομή του αποτελείται μόνο από ένα σύνολο οδηγιών. δεν έχει κεφαλίδα και δεν περιέχει τυπικά μεταδεδομένα. Αποθηκεύει όλα τα δεδομένα και τον κώδικά του σε ένα μόνο τμήμα και το δυαδικό του έχει μέγιστο μέγεθος 64 KB. Αυτή η μορφή αρχείου δεν μετατοπίζεται από μόνη της κατά την προσπάθεια επανεκτέλεσης. Έτσι το λειτουργικό σύστημα το φορτώνει σε μια προκαθορισμένη διεύθυνση. Επιπλέον, είναι δυνατό να δημιουργηθεί ένα αρχείο COM για εκτέλεση και στα δύο λειτουργικά συστήματα με τη μορφή fat binary. Δεν υπάρχει καμία πραγματική συμβατότητα σε επίπεδο εντολών. Οι οδηγίες στο σημείο εισόδου επιλέγονται ώστε να είναι ίσες σε λειτουργικότητα αλλά διαφορετικές και στα δύο λειτουργικά συστήματα, και κάνουν το πρόγραμμα να τρέχει, να μεταβεί στην ενότητα του λειτουργικού συστήματος που χρησιμοποιείται. Είναι βασικά δύο διαφορετικά προγράμματα με την ίδια διαδικασία σε ένα μόνο αρχείο, πριν από τον κώδικα επιλέγοντας αυτό που θα χρησιμοποιηθεί.
Παράδειγμα αρχείου COM
Κατά την εκτέλεση ενός αρχείου COM, οι οδηγίες διαβάζονται από το πρώτο byte και ακολουθούνται διαδοχικά μέχρι να βρεθούν οι τελευταίες οδηγίες. Ακολουθεί ένα παράδειγμα κώδικα 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,'$'