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 y ReactOS.
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 la última versión de Microsoft Windows, Windows Vista.
Evolución
del 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
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 algo 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 o Windows Server 2003 64 Bit Edition, corriendo en máquinas propicias para esta clase de ejecutables.
Formato
Los sistemas operativos que utilizan de forma nativa este formato son DOS, Microsoft Windows, OS/2 y ReactOS.
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 la última versión de Microsoft Windows, Windows Vista.
Evolución
del 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
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 algo 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 o Windows Server 2003 64 Bit Edition, 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. Éste 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).
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á, vea 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 especificas. 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 (o 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 una conjunto de instrucciones llamado código fuente a código objeto. Normalmente se utiliza el termino 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
int main(void){
printf("¡Hola, mundo!\n");
return 0;
}
C:\>gcc ejemplo.c -o ejemplo.exe
C:\>ejemplo.exe
¡Hola, mundo!
C:\>
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. Éste 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).
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á, vea 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 especificas. 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 (o 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 una conjunto de instrucciones llamado código fuente a código objeto. Normalmente se utiliza el termino 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
int main(void){
printf("¡Hola, mundo!\n");
return 0;
}
C:\>gcc ejemplo.c -o ejemplo.exe
C:\>ejemplo.exe
¡Hola, mundo!
C:\>
No hay comentarios:
Publicar un comentario