.EXE

Archivo ejecutable DOS MZ
Extensión . exe
Firma MZ o ZM
Desarrollador microsoft
Tipo de formato binario , ejecutable , objeto , biblioteca dinámica
Expandido desde .COM
Desarrollado en Nuevo ejecutable Ejecutable
lineal Ejecutable
portátil

.EXE (abr. Inglés  ejecutable  - ejecutable) - extensión de archivos ejecutables utilizados en los sistemas operativos DOS , Windows , Symbian OS , OS / 2 y en algunos otros, correspondientes a una serie de formatos . Además del código objeto , puede contener varios metadatos ( recursos , firma digital [1] ).

Formatos .EXE

Estructura de archivos

El archivo EXE generado por el enlazador consta de dos partes:

La información para el cargador, que se describe a continuación, se encuentra al principio del archivo y forma el llamado encabezado . Le sigue inmediatamente el cuerpo del módulo de carga, que es una copia de la imagen de memoria de la tarea creada por el enlazador.

La parte del encabezado estándar tiene el siguiente formato [3] :

00-01 4D5A - Firma del archivo .EXE; 02-03 Longitud de la imagen de la tarea módulo 512 (es decir, el número de bytes útiles en el último bloque). Los enlazadores anteriores a 1.10 colocan 04 en este campo; si tiene tal valor, se recomienda ignorarlo); 04-05 Longitud del archivo en bloques; 06-07 Número de entradas en la tabla de configuración de direcciones; 08-09 Longitud del encabezado en párrafos de 16 bytes. Se utiliza para averiguar el inicio del cuerpo del módulo de carga; 0A-0B Cantidad mínima de memoria que se asignará después del final de la imagen de la tarea (en párrafos de 16 bytes); 0C-0D Cantidad máxima de memoria que se asignará después del final de la imagen de la tarea (en párrafos de 16 bytes); 0E-0F Dirección de segmento del inicio del segmento de la pila relativa al inicio de la imagen de la tarea; 10-11 Valor de SP al ingresar la tarea; 12-13 Checksum  - cero menos el resultado de la suma sin transferir todas las palabras del archivo; 14-15 Valor de IP (contador de comandos) al ingresar una tarea; 16-17 Dirección de segmento del inicio del segmento de código relativo al inicio de la imagen de la tarea; 18-19 Dirección del primer elemento de la tabla de configuración de direcciones, relativa al inicio del archivo; 1A-1B Número de segmento superpuesto (0 para el segmento raíz del programa).

La siguiente es la tabla de configuración de direcciones. La tabla consta de elementos, cuyo número está escrito en los bytes 06-07. La entrada de la tabla de configuración consta de dos campos, un desplazamiento de 2 bytes y un segmento de 2 bytes, y especifica una palabra en el módulo de carga que contiene la dirección que se establecerá en la ubicación de memoria donde se carga la tarea. El ajuste es el siguiente:

  1. Se construye un Prefijo de segmento de programa (PSP) en el área de memoria después de la parte residente del programa de carga ;
  2. La parte estándar del encabezado se lee en la memoria;
  3. Se determina la longitud del cuerpo del módulo de carga (la diferencia entre la longitud del archivo 04-07 y la longitud del encabezado 08-09 más el número de bytes en el último bloque 02-03). Dependiendo de la señal que indique cargar la tarea al final de la memoria o al principio, se determina la dirección del segmento para cargar. Este segmento se llama segmento inicial ;
  4. El módulo de carga se lee en el segmento inicial;
  5. La tabla de afinación se lee en la memoria de trabajo por lotes;
  6. Para cada entrada en la tabla de configuración, la dirección del segmento de inicio se agrega al campo del segmento. Como resultado, la entrada de la tabla apunta a una palabra en la memoria, a la que se agrega la dirección del segmento de inicio;
  7. Cuando se procesa la tabla de configuración de direcciones, los valores especificados en el encabezado se escriben en los registros SS y SP, y la dirección del segmento inicial se agrega al SS. La dirección del segmento del inicio de la PSP se escribe en el ES y el DS. El control se transfiere a la dirección especificada en el encabezado (bytes 14-17).

Estructura del segmento del programa

Al acceder a un comando no residente o llamar a un programa con la operación Exec, DOS determina la dirección mínima desde la cual se puede cargar el programa correspondiente. Esta área se denomina segmento de programa.

En el desplazamiento 0000 en el segmento de programa , DOS genera un prefijo de segmento de programa (PSP) . El programa en sí se carga en el desplazamiento 0100.

El programa finaliza saltando a la dirección 0000 en el segmento de programa ejecutando INT 20, o ejecutando INT 21 con AH=0 o AH=4C, o llamando a la subrutina en la dirección 0050 en el segmento de programa con AH=0 o AH =4C.

Nota: cuando finaliza de otra forma que no sea la operación 4C, el programa primero debe enviar a CS la dirección del comienzo de su segmento de programa.

Los cuatro métodos devuelven el control a la parte residente de COMMAND.COM (en este caso, la operación 4C envía un código de salida). Los cuatro métodos hacen que el programa que llamó a la operación Exec (4B) continúe con la ejecución. En este caso, los vectores de interrupción 22, 23 y 24 (terminación, Ctrl-Break, error de intercambio fatal) se restauran desde el Prefijo de segmento de programa de la tarea reanudable. Luego, el control se transfiere a la dirección de terminación. Si el programa vuelve a COMMAND.COM, el control se transfiere a la parte no residente. Si esto sucede mientras se ejecuta el archivo por lotes, continúa; de lo contrario, COMMAND solicita la terminal y espera a que se ingrese el siguiente comando.

Cuando un programa cargado toma el control, se aplican las siguientes condiciones:

Para todos los programas:

  1. La dirección de medios se transmite en el prefijo del segmento de programa en el desplazamiento 2C. El entorno es una secuencia de cadenas ASCIIZ , de la forma parámetro=valor. La longitud total de las cadenas de entorno no supera los 32 KB; El miércoles comienza en un límite de párrafo. La última línea va seguida de un byte nulo. El entorno pasado a la tarea por COMMAND contiene al menos el parámetro COMSPEC= (el valor de este parámetro es el nombre completo del archivo que contiene el COMMAND.COM a usar ). También contiene los valores establecidos por los comandos PATH, PROMPT y SET. El entorno que se pasa es una copia del entorno del proceso padre. Si una tarea permanece residente, los comandos PATH, PROMPT y SET subsiguientes no afectarán su entorno.
  2. En el desplazamiento 0050, el prefijo del segmento del programa contiene el programa para llamar a las operaciones de DOS. Así, al poner el número de operación en AH, el programa puede llamar a procedimientos (LCALL) en PSP + 50 y no acceder a la interrupción 21.
  3. La dirección del búfer DTA se establece en PSP +80.
  4. Los bloques de control de archivos ubicados en los desplazamientos 5C y 6C en el prefijo del segmento de programa se completan de acuerdo con los parámetros de la línea de comando . En este caso, si el parámetro correspondiente incluye el nombre del directorio, solo se ingresa el código del dispositivo en el FCB, el nombre del archivo se forma incorrectamente.
  5. La parte sin formato, que comienza en el desplazamiento 81, contiene los caracteres de la línea de comando después del nombre del comando, incluidos todos los espacios y delimitadores. La longitud de esta cadena se coloca en el desplazamiento 80. Si la línea de comandos incluye opciones de redirección (se indican con los símbolos > y <), no se incluyen aquí, ya que la redirección es transparente para los programas.
  6. La palabra en el desplazamiento 6 contiene el número de bytes en este segmento.
  7. El registro AX indica si los nombres de los dispositivos en los parámetros son correctos:

Para programas .EXE:

  1. DS y ES indican el comienzo del prefijo del segmento de programa.
  2. Los registros CS, IP, SS y SP obtienen los valores especificados por el enlazador .

Para programas .COM:

  1. Los cuatro registros de segmento apuntan al prefijo de segmento de programa.
  2. Toda la memoria libre se asigna al programa. Si el programa inicia otros programas con la operación Exec, entonces debe liberar algo de memoria con la operación Setblock (4A)
  3. El contador de comandos IP se establece en 0100H.
  4. El registro SP indica el final de un segmento de programa. La longitud del segmento en la ubicación del prefijo 6 se reduce en 0100H para dejar espacio para ese tamaño de pila.
  5. La palabra nula se coloca en la parte superior de la pila.

Notas

  1. Formato de firma ejecutable portátil de Windows Authenticode  (inglés)  (enlace inaccesible) . Consultado el 11 de diciembre de 2009. Archivado desde el original el 1 de marzo de 2012.
  2. Cómo abrir un archivo .DLL o .EXE en el Editor de recursos  (inglés)  (enlace descendente) . Consultado el 11 de diciembre de 2009. Archivado desde el original el 1 de marzo de 2012.
  3. Cargar programas de Windows desde el indicador de DOS con WINSTART // PC Mag. - N° 30 de junio de 1992 .

Enlaces