U4 Automatas
U4 Automatas
U4 Automatas
Lenguajes y Autómatas ll
1
Generación de código objeto
El generador de código objeto transforma el código Intermedio optimizado en código
objeto de bajo nivel. Toma código intermedio y genera Código objeto para la máquina
considerada Es la parte más próxima a la arquitectura de la Máquina. Habitualmente, se
escriben ``a mano´´ desarrollo a medida´ para cada máquina Específica.
La fase final de un compilador es la generación de código objeto, que por lo general
consiste en código de máquina relocalizable o código ensamblador. Las posiciones de
memoria se seleccionan para cada una de las variables usadas por el programa. Después,
cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de
máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a
registros.
4.1 REGISTROS
¿Qué son?
Los registros son la memoria principal de la computadora. Existen diversos registros de
propósito general y otros de uso exclusivo. Algunos registros de propósito general son
utilizados para cierto tipo de funciones. Existen registros acumuladores, puntero de
instrucción, de pila, etc.
Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits
hasta 64 bits dependiendo del microprocesador que se emplee.
¿Quiénes lo utilizan?
Antes de nada, para el desarrollo de esta parte hablaremos indistintamente de registros
de activación o de marcos de pila. Esto se debe a que en la documentación encontrada
sobre el manejo de los registros ebp y esp se hace mención a dicho concepto de marco de
pila. Puesto que el lenguaje permite recursividad, los registros de activación
se asignan dinámica mente.
2
Distribución
La UCP o CPU tiene 14 registros internos, cada uno de ellos de 16 bits (una palabra). Los
bits están enumerados de derecha a izquierda, de tal modo que el bit menos significativo
es el bit 0.
Los registros se pueden clasificar de la siguiente forma:
Registros de datos:
AX: Registro acumulador. Es el principal empleado en las operaciones aritméticas.
BX: Registro base. Se usa para indicar un desplazamiento.
CX: Registro contador. Se usa como contador en los bucles.
DX: Registro de datos.
Estos registros son de uso general y también pueden ser utilizados como registros de 8
bits, para utilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y AL,
que son los bytes alto (high) y bajo (low) del registro AX. Esta nomenclatura es aplicable
también a los registros BX, CX y DX.
Registros de segmentos:
CS: Registro de segmento de código. Contiene la dirección de las instrucciones del
programa.
DS: Registro segmento de datos. Contiene la dirección del área de memoria donde se
encuentran los datos del programa.
SS: Registro segmento de pila. Contiene la dirección del segmento de pila. La pila es un
espacio de memoria temporal que se usa para almacenar valores de 16 bits (palabras).
ES: Registro segmento extra. Contiene la dirección del segmento extra. Se trata de un
segmento de datos adicional que se utiliza para superar la limitación de los 64Kb del
segmento de datos y para hacer transferencias de datos entre segmentos.
3
Registros índices:
SI: Índice fuente.
DI: Índice destino.
Asignación de registros
Las instrucciones que implican operandos en registros son generalmente más rápidas que
las de los operandos en memoria. Por lo tanto, utilizar eficientemente los registros es
fundamental para generar un buen código. El uso de registros se divide en dos
subproblemas:
4.2Lenguaje ensamblador
¿Qué es?
El lenguaje Assembly (Urbina, 2011) (a veces mal llamado "Ensamblador" por su
traducción literal al español) es un tipo de lenguaje de bajo nivel utilizado para escribir
programas informáticos, y constituye la representación más directa del código máquina
específico para cada arquitectura de computadora
4
Segunda generación de lenguajes
Versión simbólica de los lenguajes máquina (Urbina, 2011) (MOV, ADD).La comunicación
en lenguaje de máquina es particular de cada procesador que se usa, y programar en este
lenguaje es muy difícil y tedioso, por lo que se empezó a buscar mejores medios de
comunicación con ésta. Los lenguajes ensambladores tienen ventajas sobre los lenguajes
de máquina.
Este lenguaje fue usado ampliamente en el pasado para el desarrollo de software,
pero actualmente sólo se utiliza encontradas ocasiones, especialmente cuando se
requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de
los equipos
Características:
El programa lee un archivo escrito en lenguaje ensamblador y sustituye cada uno de los
códigos mnemotécnicos por su equivalente código máquina. Los programas se hacen
fácilmente portables de máquina a máquina y el cálculo de bifurcaciones se hace de
manera fácil.
Clasificación:
Ensambladores básicos: Son de muy bajo nivel, y su tarea consiste básicamente,
en ofrecer nombres simbólicos a las distintas instrucciones, parámetros y cosas tales como
los modos de direccionamiento
Ensambladores modulares, o macro ensambladores: Descendientes de los
ensambladores básicos, fueron muy populares en las décadas de los 50 y los 60, fueron
antes de la generalización de los lenguajes de alto nivel. Una macroinstrucción es el
equivalente a una función en un lenguaje de alto nivel.
Operaciones básicas
Las operaciones básicas en un lenguaje ensamblador son la suma la resta la multiplicación
y la división y Necesitara un poco más de información sobre la arquitectura y SO para el
cual programas.
Pero la idea básica es:
--definir que parámetros tendrá la función.
5
--hacer el programa, propiamente dicho, en assembler.
Características:
El lenguaje máquina realiza un conjunto de operaciones predeterminadas llamadas micro
operaciones. Las micro operaciones sólo realizan operaciones del tipo aritmética (+,- ,*,/),
lógicas (AND, OR, NOT) y de control (secuencial, de control y repetitiva). El lenguaje
maquina es dependiente del tipo de arquitectura. Así un programa máquina para una
arquitectura Intel x86 no sé ejecutara en una arquitectura Power PC de IBM (al menos de
manera nativa).
6
Algunos microprocesadores implementan mas funcionalidades llamado CISC, pero son
más lentos que los RISC ya que estos tienen registros más grandes.
Ventajas
Desventajas
7
Se distinguen los siguientes propósitos del sistema de administración de memoria:
Protección.
Si varios programas comparten la memoria principal, se debería asegurar que
el programa no sea capaz de cambiar las ubicaciones no pertenecientica él. Aunque una
acción de escritura puede tener efectos más graves que una de lectura, esta última
tampoco debería estar permitida, para proporcionar algo de privacidad al programa.
Compartimiento.
Este objetivo parece contradecir al anterior, sin embargo, a veces es necesario para los
usuarios poder compartir y actualizar información (por ejemplo, en una base de datos) y,
si se organiza la tarea de entrada a la misma, se puede evitar el tener varias copias de la
rutina.
Reubicación.
La técnica de multiprogramación requiere que varios programas ocupen la memoria al
mismo tiempo. Sin embargo, no se sabe con anticipación donde será cargado
cada programa por lo que no es práctico usar direccionamiento absoluto de memoria.
Organización física.
Debido al costo de una memoria principal rápida, éste se usa en conjunto con una
memoria secundaria mucho más lenta (y por consiguiente, barata) a fines de extender su
capacidad.
Organización lógica.
Aunque la mayor parte de las memorias son organizadas linealmente con un
direccionamiento secuencial, esto difícilmente concuerde con el camino seguido por el
programa, debido al uso de procedimientos, funciones, subrutinas, arreglos, etc
8
9