
Un archivo COM es un tipo de archivo ejecutable simple . En los sistemas operativos VAX de Digital Equipment Corporation (DEC) de la década de 1970, se utilizaba como extensión de archivo para archivos de texto que contenían comandos para ser enviados al sistema operativo (similar a un archivo por lotes ). [ 1 ] Con la introducción de CP/M de Digital Research (un sistema operativo para microcomputadoras modelado a partir de TOPS-10 para el PDP-10 ), el tipo de archivos comúnmente asociados con la extensión COM cambió al de archivos ejecutables. Esta convención se trasladó posteriormente a DOS . Incluso cuando se complementó con el formato de archivo EXE más general para ejecutables, los archivos COM compactos siguieron siendo viables y de uso frecuente en DOS..COM
La .COMextensión del archivo no guarda relación con el dominio de nivel superior de Internet .com (de "comercial"). Sin embargo, esta similitud en el nombre ha sido aprovechada por los creadores de malware .
formato binario DOS
El formato COM es el formato ejecutable binario original utilizado en CP/M (incluidos SCP y MSX-DOS ) así como en DOS . Es muy simple; no tiene encabezado (con la excepción de los archivos de CP/M 3), [ 2 ] y no contiene metadatos estándar , solo código y datos. Esta simplicidad tiene un precio: el binario fue diseñado para tener un tamaño máximo de 65,280 (FF00 h ) bytes (256 bytes menos de 64 KiB) y almacenar todo su código y datos en un segmento de memoria 8086 .
Aunque los archivos COM se escriben como si todos comenzaran en el mismo punto de entrada fijo (0100 h )), [ nb 1 ] MS-DOS elige en qué segmento de memoria de 64K cargarlo y por lo tanto no hay problema en tener varios archivos COM en la memoria al mismo tiempo. [ 3 ] Los bytes se colocan comenzando en el desplazamiento 0100 h (256 decimal) porque los bytes anteriores están reservados para uso del sistema (es decir, el prefijo del segmento del programa DOS ).
Antes de MS-DOS y el procesador 8086, en la arquitectura de la CPU Intel 8080 , solo se podían direccionar 65.536 bytes de memoria (rango de direcciones de 0000h a FFFFh). En CP/M, los primeros 256 bytes de esta memoria, de 0000h a 00FFh, estaban reservados para el uso del sistema por la página cero , y cualquier programa de usuario debía cargarse exactamente en 0100h para poder ejecutarse. [ nb 1 ] Los archivos COM de MS-DOS se diseñaron para imitar esa configuración y facilitar la portabilidad de programas desde CP/M. [ 4 ]
Aunque el formato de archivo es el mismo en DOS y CP/M, los archivos COM de ambos sistemas operativos no son compatibles; los archivos COM de DOS contienen instrucciones x86 y posiblemente llamadas al sistema DOS , mientras que los archivos COM de CP/M contienen instrucciones 8080 y llamadas al sistema CP/M (los programas restringidos a ciertas máquinas también podrían contener instrucciones adicionales para 8085 o Z80 ).
MS-DOS fue diseñado para ejecutarse en el procesador Intel 8086 , que podía direccionar dieciséis "segmentos" de memoria diferentes, cada uno de los cuales contenía 65.536 bytes de memoria. Dado que los archivos COM nunca fueron concebidos para abarcar múltiples segmentos, Microsoft creó un formato de archivo sucesor que permitía programas más grandes: .EXE . [ 5 ]
Los archivos COM en DOS establecen todos los registros de segmento x86 al mismo valor y el registro SP (puntero de pila) al desplazamiento de la última palabra disponible en el primer segmento de 64 KiB (normalmente FFFEh) o al tamaño máximo de memoria disponible en el bloque en el que se carga el programa, tanto para el programa como para al menos 256 bytes de pila, lo que sea menor; por lo tanto, la pila comienza en la parte superior del segmento de memoria correspondiente y continúa hacia abajo desde allí. [ 6 ] [ 7 ]
En la API original de DOS 1.x , derivada de la API de CP/M, la finalización de un programa en un archivo COM se realizaba mediante la llamada a la función INT 20h (Terminar programa) o bien a la función INT 21h (Función 0), que cumplía la misma función. El programador también debía asegurarse de que los registros de segmento de código y datos tuvieran el mismo valor al finalizar el programa para evitar un posible fallo del sistema. Aunque esto podía utilizarse en cualquier versión de DOS, Microsoft recomendó el uso de la función INT 21h (Función 4Ch) para la finalización de programas a partir de DOS 2.x, que no requería que los segmentos de datos y código tuvieran el mismo valor.
En CP/M 3, si el primer byte de un archivo COM es C9h, hay un encabezado de 256 bytes; [ 2 ] dado que C9h corresponde a la instrucción 8080RET , esto significa que el archivo COM terminará inmediatamente si se ejecuta en una versión anterior de CP/M que no admite esta extensión. (Debido a que los conjuntos de instrucciones del 8085 y Z80 son superconjuntos del conjunto de instrucciones del 8080, esto funciona en los tres procesadores). C9h es un opcode inválido en el 8088/8086, sin embargo es el opcode para LEAVE desde el 80188/80186 . Aunque posible, es improbable que LEAVE se utilice como la primera instrucción en un programa válido. Por lo tanto , el cargador de ejecutables en algunas versiones de DOS rechaza los archivos COM que comienzan con C9h , evitando un fallo.
Los archivos pueden tener nombres que terminan en .COM, pero no estar en el formato simple descrito anteriormente; esto se indica mediante un número mágico al comienzo del archivo. Por ejemplo, el archivo COMMAND.COM en DR DOS 6.0 está en realidad en formato ejecutable de DOS , indicado por los dos primeros bytes que son 4D 5A( MZen ASCII), las iniciales de Mark Zbikowski .
Grandes programas
En DOS, el cargador o el entorno de ejecución no proporcionan gestión de memoria para los archivos COM . Toda la memoria está disponible para el archivo COM. Tras la ejecución, se recarga el intérprete de comandos del sistema operativo, COMMAND.COM . Esto permite que el archivo COM sea muy simple, utilizando un único segmento , o arbitrariamente complejo, proporcionando su propio sistema de gestión de memoria. Un ejemplo de programa complejo es COMMAND.COM, el intérprete de comandos de DOS, que proporcionaba un cargador para cargar otros programas COM o EXE . En el sistema COM, se pueden cargar y ejecutar programas grandes (hasta el tamaño de memoria disponible), pero el cargador del sistema asume que todo el código y los datos están en el primer segmento, y es responsabilidad del programa COM proporcionar cualquier organización adicional. Los programas que superan la memoria disponible, o los segmentos de datos grandes , se pueden gestionar mediante enlace dinámico , si el código necesario está incluido en el programa COM. La ventaja de usar el formato COM en lugar del EXE es que la imagen binaria suele ser más pequeña y más fácil de programar con un ensamblador . [ 8 ] Una vez que se dispuso de compiladores y enlazadores con suficiente potencia, ya no era ventajoso utilizar el formato COM para programas complejos.
Soporte de plataforma
El formato aún se puede ejecutar en muchas plataformas modernas basadas en Windows NT , pero se ejecuta en un subsistema que emula MS-DOS , NTVDM , que no está presente en las variantes de 64 bits . Los archivos COM también se pueden ejecutar en emuladores de DOS como DOSBox , en cualquier plataforma compatible con estos emuladores.
Utilizar por motivos de compatibilidad
Los sistemas operativos basados en Windows NT utilizan la extensión .com para un pequeño número de comandos heredados de la época de MS-DOS, aunque en realidad se implementan como archivos .exe . El sistema operativo reconocerá el encabezado del archivo .exe y los ejecutará correctamente a pesar de su extensión .com técnicamente incorrecta. (De hecho, cualquier archivo .exe puede renombrarse a .com y seguir ejecutándose correctamente). El uso de las extensiones .com originales para estos comandos garantiza la compatibilidad con archivos por lotes de DOS más antiguos que pueden referirse a ellos con sus nombres de archivo originales completos. Estos comandos son CHCP, DISKCOMP, DISKCOPY, FORMAT, MODE, MOREy TREE. [ 9 ]
Preferencia de ejecución
En DOS, si un directorio contiene un archivo COM y un archivo EXE con el mismo nombre, cuando no se especifica ninguna extensión, se selecciona preferentemente el archivo COM para su ejecución. Por ejemplo, si un directorio en la ruta del sistema contiene dos archivos llamados foo.comy foo.exe, se ejecutaría lo siguiente foo.com:
C:\>foo
Un usuario que desee ejecutar el programa foo.exepuede usar explícitamente el nombre de archivo completo:
C:\>foo.exe
Aprovechando este comportamiento predeterminado, los creadores de virus y otros programadores maliciosos han utilizado nombres como notepad.compara sus creaciones, con la esperanza de que, si se colocan en el mismo directorio que el archivo EXE correspondiente, un comando o archivo por lotes pueda ejecutar accidentalmente su programa en lugar del editor de texto notepad.exe. Cabe mencionar que estos archivos .com pueden contener, de hecho, un ejecutable en formato .exe.
En Windows NT y sus derivados ( Windows 2000 , Windows XP , Windows Vista y Windows 7 ), la variable de entorno PATHEXT se utiliza para anular el orden de preferencia (y las extensiones aceptables) para llamar a archivos sin especificar la extensión desde la línea de comandos. El valor predeterminado aún coloca los archivos antes que los demás. Esto se asemeja mucho a una característica que se encontraba anteriormente en la línea de procesadores de línea de comandos extendida de JP Software: 4DOS , 4OS2 y 4NT ..com.exe
Uso malicioso de la extensión .com
Algunos creadores de virus informáticos han intentado aprovecharse del probable desconocimiento de los usuarios modernos de la extensión de archivo .com y su formato binario asociado, así como de su mayor familiaridad con el dominio de Internet .com . Se han enviado correos electrónicos con nombres de archivos adjuntos similares a "www.example.com". Los usuarios desprevenidos de Microsoft Windows que hagan clic en un archivo adjunto de este tipo esperarían comenzar a navegar por un sitio web llamado , pero en su lugar ejecutarían el archivo binario adjunto llamado , otorgándole permiso completo para hacer con su máquina lo que su autor tuviera en mente.http://www.example.com/www.example
No hay nada malicioso en el formato de archivo COM en sí; se trata de una explotación de la coincidencia de nombres entre los archivos .com y los sitios web comerciales .com .
Véase también
Notas
- 1 2 En la mayoría de las versiones de CP/M , el inicio del TPA estaba en el desplazamiento +100h, solo precedido en memoria por la página cero en el desplazamiento +0h. Algunas versiones diferían por razones de hardware, incluyendo CP/M para el Heath H89 , donde comenzaba en el desplazamiento +4300h (para compatibilidad, existía una modificación de hardware de Magnolia Microsystems para mapear las ROM en +100h después del arranque), o CP/M para el TRS-80 Modelo I y TRS-80 Modelo III , donde los programas se cargaban en el desplazamiento +0h.
Referencias
- ↑ Christian, Brian; Markson, Tom; Skrenta, Rich (eds.). "Sección 5.3". El libro de instrucciones del PDP-11 (ed. Revisión 1 ). Archivado del original el 1 de agosto de 2018. Recuperado el 1 de agosto de 2018 .(Nota: Incluye una referencia al sistema operativo RT-11 que se ejecuta en el miniordenador PDP-11 , donde se muestra en la sección 5.3 que .COM se utiliza para referirse a un archivo de comandos).
- 1 2 Elliott, John C.; Lopushinsky, Jim (2002) [1998-04-11]. "CP/M 3 COM file header" . Seasip.info . Archivado del original el 2018-08-01.
- ↑ Rollins, Dan (1985). "Inicio y salida del programa" . Referencia de ayuda técnica . Flambeaux Software . Recuperado el 1 de junio de 2026 .
- ↑ Necasek, Michal (13 de septiembre de 2011). "¿Quién necesita el desbordamiento de direcciones?" . Museo OS/2 . Consultado el 1 de junio de 2026.
Este formato se proporciona para simplificar la traducción de programas 8080/Z80 a código 8086 y no se recomienda para programas nuevos.
- ↑ Summers, Jason. "MS-DOS EXE" . Simplemente resuelve el problema del formato de archivo . Consultado el 1 de junio de 2026. MS
-DOS EXE (o DOS EXE), también conocido como formato MZ, es un formato de archivo ejecutable utilizado principalmente por MS-DOS. Es el sucesor de COM.
- ↑ Paul, Matthias R. (2002-10-07) [2000]. "Re: Ejecutar un archivo COM" . Grupo de noticias : alt.msdos.programmer . Recuperado el 2017-09-03 .
{{cite newsgroup}}: CS1 maint: servicio de archivado obsoleto ( enlace )(Nota: Incluye detalles sobre las convenciones de llamada a programas COM de DOS). - ↑ Lunt, Benjamin "Ben" D. (2020). "Registros de inicio de DOS .COM" . Forever Young Software . Archivado del original el 12 de noviembre de 2020. Recuperado el 14 de diciembre de 2021 .
- ↑ Scanlon, Leo J. (1991). «Capítulo 2». Subrutinas en lenguaje ensamblador para MS-DOS (2.ª ed.). Windcrest Books. pág. 16. ISBN 0-8306-7649-X.
- ↑ "Comandos de Windows" . Microsoft. 26 de abril de 2023.
Enlaces externos
- COM 101: un tutorial paso a paso para ejecutables de DOS
- archivos DOS
- Tecnología DOS
- Archivos CP/M
- Tecnología CP/M
- Formatos de archivos ejecutables
- extensiones de nombre de archivo