# COM (formato)

No sistema operacional DOS, os arquivos com extensão COM, são arquivos executáveis. Originalmente o termo COM vinha de "ficheiro de COMando", um ficheiro de texto contendo comandos interpretados pelo sistema operativo (similar aos ficheiros batch do DOS), em muitos dos sistemas operativos de computadores mainframe dos anos de 1970.
Com a introdução dos microcomputadores, o tipo de ficheiros associados à extensão .com mudaram; no CP/M de 8-bits, e mais tarde no MS-DOS e compatíveis sistemas DOS, passaram a designar convencionalmente os ficheiros binários executáveis. Os ficheiros executáveis de formato COM não necessitam necessariamente da extensão .COM nos CP/M e versões iniciais do MS-DOS.
Os ficheiros de extensão .COM não têm qualquer relação com os domínios de Internet .com (para "comercial"). Contudo, essa semelhança no nome é muitas vezes aproveitada por maliciosos programadores de vírus de computadores.

## Formato binário em MS-DOS

O formato COM é o formato binário original dos executáveis utilizados em CP/M e MS-DOS. É muito simples: não tem cabeçalho e nem metadados, apenas código e dados. Essa simplicidade vem com um preço: o código objeto tem um tamanho máximo de 65280 (0xFF00) bytes e armazena todo o código e dados em apenas um segmento.
Como não contém informação de relocação, o sistema operativo carrega-o num endereço pré-estabelecido, em offset 0x0100, onde é executado (daí a limitação do tamanho do executável). Tal não era problemático no tempo das máquinas de 8-bits pela forma como o modelo de segmentação da memória funcionava, mas é a razão principal pela qual o formato caiu em desuso pouco depois da introdução dos processadores de 16-bits e depois dos de 32-bits, com a sua maior segmentação de memória.
Na arquitetura de processadores Intel 8080, apenas 65536 bytes de memória podiam ser endereçadas (endereços de 0x0000 a 0xFFFF). No CP/M, os primeiros 256 bytes dessa memória (de 0x0000 a 0x00FF) estavam reservadas para o sistema, e qualquer outro programa teria de ser carregado no endereço 0x0100 para ser executado. Os ficheiros COM serviam na perfeição para esse modelo. Note-se que não seria possível executar mais que um programa ou comando de uma vez.
Apesar do formato de ficheiro ser o mesmo no MS-DOS e no CP/M, tal não significava que os programas para CP/M poderiam ser diretamente executados no MS-DOS (ou vice-versa); os ficheiros COM do MS-DOS continham instruções para a arquitetura x86, enquanto que os ficheiros COM para CP/M continham instruções 8080, 8085 ou Z80.
No CP/M 3, se o primeiro byte de um ficheiro COM fosse 0xC9, isso indicaria a presença de um cabeçalho de 256 bytes; como 0xC9 corresponde à instrução RET do 8080, tal significava que o ficheiro COM terminaria se executado em versões anteriores do CP/M que não suportavam essa extensão. (Como o conjunto de instruções do 8085 e Z80 contêm o conjunto de instruções do 8080, tal funciona em todos os três processadores.)
Qualquer ficheiro pode ter nomes terminando em .COM, mas podem não estar no formato descrito acima; tal é indicado por um "número mágico" no início do ficheiro. Por exemplo, o COMMAND.COM do DR-DOS 6 está na realidade em formato executável do DOS, pois tem essa indicação nos dois primeiros bytes: MZ (0x4D 0x5A), as iniciais de Mark Zbikowski.

## Programas de grande tamanho

Em MS-DOS e outros sistemas compatíveis DOS, o ambiente de execução não providencia qualquer gestão de memória para ficheiros COM. Toda a memória está disponível para esses ficheiros. Após execução, o COMMAND.COM é recarregado. Isso leva à possibilidade de que o ficheiro COM seja muito simples, utilizando um único segmento, ou arbitrariamente complexo, providenciando o seu próprio sistema de gestão de memória. Um exemplo de um programa complexo seria o COMMAND.COM, o shell do MS-DOS, que providencia um Carregador para carregar outros programas COM ou EXE. No sistema .COM, programas maiores (até ao tamanho da memória disponível) podem ser carregados e executados, mas o sistema assume que todo o código e dados estão no primeiro segmento, e é o próprio programa COM que tem de providenciar qualquer outra organização. Programas que necessitem mais do que a memória disponível, ou segmentos de dados de grande dimensões, podem fazer uso de ligações dinâmicas, se o código necessário a isso estiver incluido no programa COM. A vantagem na utilização do .COM ao invês do formato .EXE é que a imagem binária é normalmente mais pequena e mais fácil de programar utilizando a linguagem Assembly. Assim que compiladores e Linkers com poder suficiente se tornaram disponíveis, deixou de ser vantajoso utilizar o formato COM para programas complexos.

## Preferência na execução

Em MS-DOS, se um diretório contivesse um ficheiro COM e um ficheiro EXE com o mesmo nome (não incluindo a extensão), o ficheiro COM seria preferencialmente selecionado para execução. Por exemplo, se um diretório tivesse dois ficheiros denominados teste.com e teste.exe, o seguinte executaria teste.com:
Se o utilizador desejasse executar teste.exe, poderia explicitamente utilizar o nome completo do ficheiro:
Aproveitando esse comportamento, programadores maliciosos utilizaram nomes como notepad.com para as suas criações, na esperança que se fosse colocado no mesmo diretório que o correspondente ficheiro EXE, um comando ou ficheiro batch acidentalmente executasse o seu programa ao invês do editor de texto notepad.exe. No Windows NT e seus derivados (Windows 2000], Windows XP, Windows Vista, e Windows 7), a variável de sistema PATHEXT é utilizada para determinar a ordem de preferência (e extensões aceites) para a chamada de ficheiros sem especificar a extensão na linha de comando. O valor por defeito ainda mantém os ficheiros .com antes dos ficheiros .exe.

## Suporte

O formato ainda é executável em modernos sistemas Windows, mas é executado num subsistema que emula o MS-DOS, que não está presente nas variantes de 64-bits. Os ficheiros COM também podem ser executados em emuladores de DOS tais como DOSBox, ou em qualquer plataforma suportada por tais emuladores.