# EXE (informática)

En el ámbito de la informática .exe (de la abreviación del inglés executable, que se traduce en ejecutable) es una extensión que se refiere a un archivo ejecutable de código reubicable, es decir, sus direcciones de memoria son relativas. Los sistemas operativos que utilizan de forma nativa este formato son DOS, Microsoft Windows, OS/2.
El formato de archivos EXE fue introducido en marzo de 1983, en la versión 2.0 de MS-DOS (la versión anterior solo podía ejecutar archivos COM, cuyas diferencias con los EXE se aclaran más adelante) y sigue siendo utilizado en la actualidad en las últimas versiones de Microsoft Windows, Windows 7, Windows 8, Windows 8.1, Windows 10 y Windows 11
A mediados de la década de 2010, surgió una tendencia entre los creadores de contenido pseudo terror e infantil que consistía en crear versiones malvadas de personajes agregando '.exe' al final de sus nombres. Esta práctica se inspiró en la Creepypasta Sonic.exe, una historia que ha recibido críticas dentro de su comunidad. Los personajes en estas versiones suelen tener características similares, como ser versiones malignas de personajes existentes y presentar ojos rojos ensangrentados. También existen juegos creados por aficionados con estos personajes, los cuales suelen incluir imágenes de los personajes con sangre añadida de manera básica mediante programas de edición como Paint. La calidad de estos juegos es generalmente considerada dudosa.

## Evolución

De este software y a las nuevas posibilidades que abrían los hardwares más recientes. A continuación se lista esta evolución en orden cronológico:
* Ejecutable de DOS: Fue introducido con DOS 2.0, y puede ser identificado con los caracteres ASCII "MZ" o en forma hexadecimal 4D 5A al comienzo del archivo (el llamado Número Mágico). Este ejecutable puede ser corrido tanto en DOS como en Windows. "MZ" son las iniciales de Mark Zbikowski, uno de los programadores de MS-DOS.
* Nuevo ejecutable de 16 bits: Fue introducido con Multitasking MS-DOS 4.0, y puede ser identificado con los caracteres ASCII "NE" o en forma hexadecimal 4E 45. Este ejecutable no puede ser corrido por ninguna otra versión de DOS pero si en cualquier versión de Windows y OS/2.
* Ejecutable mezclado de 16/32 bits: Fue introducido con OS/2 2.0, y puede ser identificado con los caracteres ASCII "LE" o en forma hexadecimal 4C 45. Este formato no es más usado en aplicaciones, pero si para los drivers tipo VxD bajo Windows 3.x y 9x.
* Ejecutable lineal de 32 bits: Fue introducido con OS/2 2.0, y puede ser identificado con los caracteres ASCII "LX" o en forma hexadecimal 4C 58. Puede ser corrido únicamente en OS/2 2.0 o superior. También fue usado en algunos DOS extenders.
* Ejecutable portable de 32 bits: Fue introducido con Windows NT, este es el más complejo de todos y puede ser identificado con los caracteres ASCII "PE" o en hexadecimal 50 45. Puede ser ejecutado por todas las versiones de Windows NT, y también Windows 95 y superior. También fue usado en BeOS RC3, igualmente violaba las especificaciones PE ya que no usaba un subsistema correcto.
* Ejecutable portable de 64 bits: Fue introducido en las versiones de 64 Bits de Windows, estos son archivos de tipo PE pero para una CPU de 64 Bits con un set de instrucciones x86-64 o IA-64. Puede ser usado únicamente en las ediciones de 64 Bits de Windows, como Windows XP 64 Bit Edition, Windows Server 2003 64 Bit Edition, Windows Vista x64, Windows Server 2008 x64, Windows Server 2008 R2 y Windows 7 x64, corriendo en máquinas propicias para esta clase de ejecutables.

## Formato

Los ficheros EXE constan de una cabecera seguida de los segmentos definidos en el código fuente. Los datos de la cabecera son utilizados por el sistema operativo para realizar las inicializaciones necesarias para el correcto funcionamiento del programa, aunque dicha estructura no forma parte de la imagen final del programa en memoria. El contenido de la cabecera de un fichero EXE es el siguiente:
* Posición 0 (2 bytes): caracteres “MZ” o “ZM” identificativos del formato EXE.
* Posición 2 (2 palabras): tamaño del fichero. La primera palabra es el número de bytes del último sector. La segunda palabra es el número de sectores que ocupa el fichero (cada sector ocupa 512 bytes). De esta forma, el tamaño del fichero en bytes se calcula como (nsectores-1)*512+nbytes.
* Posición 6 (1 palabra): número de reubicaciones a realizar. Esto es, número de referencias a segmentos reales que hay que modificar cuando el programa se cargue en memoria. Este es el caso del segundo operando de la instrucción MOV AX, DATOS. Las direcciones de dichas referencias se encuentran disponibles en la denominada tabla de reubicaciones, incluida en la cabecera de un fichero EXE.
* Posición 8 (1 palabra): tamaño de la cabecera en párrafos (1 párrafo = 16 bytes).
* Posición 10 (1 palabra): mínima cantidad de memoria en párrafos requerida por el programa en adición a lo que ocupa en disco.
* Posición 12 (1 palabra): máxima cantidad de memoria requerida en párrafos.
* Posición 14 (2 palabras): valores iniciales de SS (primera palabra) y SP (segunda palabra).
* Posición 18 (1 palabra): palabra de comprobación. El DOS no suele utilizarla, de hecho la herramienta TLINK no la genera.
* Posición 20 (2 palabras): valores iniciales de CS (segunda palabra) e IP (primera palabra).
* Posición 24 (1 palabra): posición donde comienza la tabla de reubicación. Cada entrada de la tabla ocupa 4 bytes (desplazamiento y segmento) y contiene la dirección de las palabras a reubicar (a cada una hay que sumarle el valor de segmento en el que se cargue el programa).
* Posición 26 (1 palabra): número de overlay. Es 0 cuando se trata de un programa principal.
* Posición 28-61: valores desconocidos (dependientes del compilador).
Ejecutable portable de 69 bits

## Programación

Existen dos formas de crear un archivo de tipo EXE. Una es usando un compilador que pueda crear este tipo de archivos (lo cual no significa específicamente que tiene que ser para la plataforma donde se ejecutará, véase Compilador cruzado). La otra forma es ensamblando un código fuente del lenguaje Assembler y luego enlazando el código objeto resultante de la tarea anterior.
Fuera del ámbito de la programación también existen programas que generan ejecutables EXE para tareas específicas. Ejemplos de estos son el compresor WinZip, el Microsoft Powerpoint y el Adobe Flash.
Para revisar el funcionamiento de un programa se realiza la tarea llamada depuración (en inglés: debugging).
A continuación se detallan la realización estas tareas para programas de tipo EXE.

### Compilado, Ensamblado y enlazado

Compilación es el proceso por el cual se traduce un conjunto de llamado código fuente a código objeto. Normalmente se utiliza el término compilado para referirse a la tarea de compilación en conjunto al proceso de enlazado, ya que la mayoría (por no decir todos) de los compiladores realizan por defecto ambas tareas en conjunto, al menos que se especifique que se desea únicamente obtener el código objeto.
A continuación se expone un ejemplo de como se compila un programa escrito en el Lenguaje de programación C usando el compilador GCC del proyecto MinGW desde la línea de comandos:
| Archivo: ejemplo.c | En la línea de comandos |
| #include <stdio.h> int main(void){ printf("¡Hola, mundo!\n"); return 0; } | C:\>gcc ejemplo.c -o ejemplo.exe C:\>ejemplo.exe ¡Hola, mundo! C:\> |
El término ensamblado refiere al proceso de compilación (sin enlazado) de un código fuente específicamente escrito en Assembler. En este caso para poder obtener un ejecutable es necesario realizar el enlazado en forma separada (algunos de los compiladores más modernos del lenguaje Assembler realizan en ensamblado y enlazado en conjunto).
Él terminó enlazado refiere al proceso en el que se convierte el código objeto en un archivo ejecutable. A continuación se expone un ejemplo de como se compila un programa escrito en el lenguaje Assembler usando el ensamblador TASM y enlazador TLINK desde la línea de comandos:
| Archivo: ejemplo.asm | En la línea de comandos |
| .model small .stack 64 .data msg db 0ADh,'¡Hola, mundo!',0Dh,0Ah,24h .code mov ax,@data mov ds,ax mov ah,9 lea dx,msg int 21h mov ax,4C00h int 21h end | C:\>tasm ejemplo.asm Turbo Assembler Version 4.0 Copyright (c) 1988, 1993 Borland International Assembling file: ejemplo.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 408k C:\>tlink ejemplo.obj Turbo Link Version 6.00 Copyright (c) 1992, 1993 Borland International C:\>ejemplo.exe ¡Hola, mundo! C:\> |

## Diferencias entre .COM y .EXE

La principal diferencia es que el formato EXE no restringe el tamaño del ejecutable, en cambio el COM está restringido como máximo a ocupar un solo segmento de memoria (un espacio de memoria de 64 kB); además hay que incluir los 256 bytes que ocupa el PSP. Este límite fue dado en una época en la que esta cantidad de espacio era más que suficiente para poder realizar cualquier clase de tarea, pero con el paso del tiempo este límite terminó siendo absurdo (hoy en día gran parte de los programas de computadoras ocupan miles de veces más espacio). De todas formas es posible hacer que un programa COM pueda extender este límite usando el enunciado SEGMENT AT.
Un programa COM es prácticamente una imagen en memoria del archivo en disco, menos por el PSP que es creado durante el proceso de inicialización, y es por esta razón que el programa se inicia a partir del offset 0x100 (en assembler se utiliza el operador ORG). En cambio el formato EXE reorganiza sus segmentos en la memoria dando un tamaño adecuado (que es posible y necesario que el programador lo determine, dependiendo del lenguaje en el cual fue escrito), es por esta razón que dentro de la cabecera de un archivo EXE hay cierto código que realiza esta tarea.
El utilitario EXE2COM cambiaba de un formato a otro.

## Emulación

Las razones por la cual se utiliza un programa de emulación para correr una aplicación con formato EXE es variada, dependiendo en mayor medida desde que plataforma se intenta emular.

### En Windows

Desde el surgimiento, en el mercado de usuarios domésticos, de Windows XP fue común el uso de emuladores para DOS en el ámbito de los juegos de vídeo, debido a que Windows XP no utilizaba MS-DOS (como los sistemas basados en Windows NT) lo que trajo problemas de compatibilidad de los viejos juegos con el nuevo sistema. Otra de las causas para el uso de esto es que algunos juegos antiguos usaban temporizadores haciendo cierta cantidad de ciclos de operaciones NOP y con la aparición de procesadores más rápidos esto se hizo inútil ya que la velocidad en que terminaba el ciclo era mucho más rápido de lo que se tenía planeado. Uno de los emuladores para Windows de DOS más importante es DOSBox.
El Service Pack 2 de Windows XP incluyó un emulador para aplicación antiguas, pero este no funciona del todo bien. En Windows 7 se incluye un modo de compatibilidad para versiones anteriores del sistema que usaban NT o DOS.

### En Mac OS

La emulación de un ejecutable EXE en Mac OS puede requerir la emulación de la arquitectura de PC debido a que las antiguas computadoras Macintosh usaban procesadores RISC de Motorola y PowerPC de IBM, Motorola y Apple con un conjunto de instrucciones distinto. Uno de los emuladores más importantes en este campo es el QEMU, un software gratuito, de código abierto y multiplataforma.
Además de tener un emulador de PC es necesario que alguna aplicación pueda interpretar, cargar en memoria y ejecutar el programa EXE que se desea correr; en la mayoría de los casos el programa EXE realizará alguna llamada al sistema durante su ejecución. Todas estas tareas pueden realizarse de dos formas: teniendo una partición virtual con algún sistema Windows e iniciarlo desde Mac OS usando algún software como el QEMU o el Virtual PC for Mac; la segunda forma es usando el software llamado Darwine (compatible con los Macintosh con procesadores Motorola y los Intel) que permite realizar todas estas tareas sin necesidad de tener algún sistema Windows.

### En Linux

Linux no soporta el formato EXE, por lo que se necesita alguna aplicación en espacio de usuario para poder correr un programa de este tipo. Uno de los más populares es WINE, un software que permite correr un ejecutable EXE Win32 sin necesidad de virtualizar. También es posible usar emulador de DOS como DOSBox o DOSEMU.