Programas de servicios o de procesos: lo constituyen los programas o utilidades que permiten la construcción de programas
Compilador, Enlace, Carga.
Estas son las tres fases básicas
que hay que seguir para que un ordenador ejecute la interpretación de un texto
escrito mediante la utilización de un lenguaje de alto nivel.
El compilador no produce directamente
un fichero ejecutable, sino que el código generado se ejecuta en módulos que se
almacenan en un fichero objetivo
Los ficheros objeto poseen
información relativa tanto al código máquina como a una tabla de símbolos que
almacena la estructura de las variables y tipos utilizados por el programa
fuente
Durante la fase de enlace, el
enlazador o linker resuelve las referencias cruzadas, (así se llama a la
utilización de objetos externos), que pueden estar declarados en otros ficheros
objeto, o en librerías (ficheros con extensión “lib” o “dll”), engloba en un
único bloque los distintos registros que almacenan código máquina, estructura el
bloque de memoria destinado a almacenar las variables en tiempo de ejecución y genera
el ejecutable final incorporando algunas rutinas adicionales procedentes de librerías,
como por ejemplo las que implementan funciones matemáticas o de e/s básicas.
De esta manera, el bloque de
código máquina contenido en el fichero ejecutable es un código reciclable, es
decir, un código que en su momento se podrá ejecutar en diferentes posiciones
de memoria, según la situación de la misma en el momento de la ejecución. Según
el modelo de estructuración de la memoria del microprocesador, este código se
estructura de diferentes formas. Lo más usual es que el fichero ejecutable esté
dividido en segmentos: de código, de datos, de pila de datos, etc.
Cuando el enlazador construye
el fichero ejecutable, asume que cada segmento va a ser colocado en la
dirección 0 de la memoria. Como el programa va a estar dividido en segmentos,
las direcciones a que hacen referencia las instrucciones dentro de cada segmento
(instrucciones de cambio de control de flujo, de acceso a datos, etc.), no se tratan
como absolutas, sino que son direcciones relativas a partir de la dirección
base en que sea colocado cada segmento en el momento de la ejecución.
El cargador carga el fichero
.exe, coloca sus diferentes segmentos en memoria (donde el sistema operativo le
diga que hay memoria libre para ello) y asigna los registros base a sus
posiciones correctas, de manera que las direcciones relativas funcionen
correctamente.
Cada vez que una instrucción
máquina hace referencia a una dirección de memoria (partiendo de la dirección
0), el microprocesador se encarga automáticamente de sumar a dicha dirección la
dirección absoluta de inicio de su segmento. Por ejemplo para acceder a la
variable x almacenada en la dirección 1Fh, que se encuentra en el segmento de
datos ubicado en la dirección 8A34h, la instrucción máquina hará referencia a
1Fh, pero el microprocesador la traducirá por 8A34h+1Fh dando lugar a un acceso
a la dirección 8A53h: dir absoluta del segmento en memoria + dir relativa de x
en el segmento = dir absoluta de x en memoria.
No hay comentarios:
Publicar un comentario