Unidad 4 Lenguaje y automatas II

4.1 Registros

4.2 Lenguaje ensamblador.

4.3 Lenguaje máquina.

4.4 Administración de memoria.

La 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

Registros de segmentos

Registros punteros de pila

Registros índices

Puntero de instrucciones

Registro de banderas (flags)

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. También se usa en las operaciones aritméticas.

REGISTROS INTERNOS DE LA UNIDAD CENTRAL
DE PROCESAMIENTO (CPU)

Estos registros son de uso general y también pueden ser utilizados como registros de 8 bits

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.

Registros punteros de pila:

SP: Puntero de la pila. Contiene la dirección relativa al segmento de la pila.

BP: Puntero base. Se utiliza para fijar el puntero de pila y así poder acceder a los elementos de la pila

Registros índices:

SI: Índice fuente de 16 bits. Es requerido por algunas operaciones con
cadenas. Está asociado con el registro DS

DI: Índice destino. Similar al SI. Asociado con el registro ES.

El lenguaje ensamblador es el sistema alfanumérico
para escribir código máquina mediante expresiones abreviadas (mnemotécnicos).

Es usado principalmente porque hay aplicaciones o programas que deben tratar directamente con los registros de la máquina,la memoria, dispositivos de E/S.

Procesos para la creación de un programa

Diseño del algoritmo

Codificación del mismo

Traducción a lenguaje máquina

Prueba del programa

Depuración

SOFTWARE NECESARIO:

Primero un editor

Segundo un compilador

tercero un enlazador

El editor puede ser cualquier editor de textos que se tenga a
la mano, como compilador utilizaremos el programa Turbo Assembler (TASM)

La extensión usada para que el TASM reconozca los
programas fuente en ensamblador es .ASM

El enlazador genera, a partir de un archivo .OBJ o la combinación de varios de estos archivos, un programa ejecutable, cuya extensión es .EXE.

LA ESTRUCTURA DEL ENSAMBLADOR:

En el lenguaje ensamblador las líneas de código constan de dos
partes

la primera es el nombre de la instrucción que se va a
ejecutar

la segunda son
los parámetros de comando u operandos.

El nombre de las instrucciones en este lenguaje puede estar
formado de 2 a 6 letras

En ensamblador los bucles, condicionales, subrutinas y demás elementos se codifican de forma distinta de cómo se hace en otros lenguajes de alto nivel.

BUCLES

Etiqueta

Inicialización de un registro (a modo de contador) al nº de vueltas del bucle.

Primera instrucción del bucle <resto de instrucciones dentro del bucle>
decrementar el contador saltar a la etiqueta si el contador >0 <instrucciones fuera del bucle>

SALTOS CONDICIONALES:

Instrucción de comparación Evaluar condición y si se cumple saltar a la etiqueta prefijada <instrucciones para el caso de no cumplirse la condición> saltar fuera del condicional

INTERRUPCIONES:

Una interrupción es una instrucción que detiene la ejecución de un programa para permitir el uso de la UCP a un proceso prioritario.

Una vez concluido este último proceso se devuelve
el control a la aplicación anterior.

Las interrupciones ocurren muy seguido, sencillamente la
interrupción que actualiza la hora del día ocurre aproximadamente 18 veces por segundo.

A continuación describiremos los 3 tipos de interrupciones:

1) INTERRUPCIONES INTERNAS DE HARDWARE:

Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecución de un programa. Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas.

2) INTERRUPCIONES EXTERNAS DE HARDWARE

Las interrupciones externas las generan los dispositivos
periféricos, como pueden ser:

teclado, impresoras, tarjetas de
comunicaciones, etc.

También son generadas por los
coprocesadores.

3) INTERRUPCIONES DE SOFTWARE:

Las interrupciones de software pueden ser activadas
directamente por el ensamblador invocando al número de interrupción deseada con la instrucción INT.

El uso de las interrupciones nos ayuda en la creación de programas, utilizándolas nuestros programas son más cortos, es más fácil entenderlos y usualmente tienen un mejor desempeño

MOVIMIENTO DE LOS DATOS

En todo programa es necesario mover datos en la memoria y
en los registros de la UCP

Este movimiento de datos está sujeto a reglas y restricciones.
Algunas de ellas son las que se citan a continuación

No es posible mover datos de una localidad de memoria a
otra directamente

No se puede mover una constante directamente a un
registro de segmentos, primero se debe mover a un registro de la UCP

Es posible mover bloques de datos por medio de las
instrucciones movs, que copia una cadena de bytes o palabras

En una pila el primer dato introducido es el último que
podemos sacar, esto es, si en nuestro programa utilizamos

las instrucciones:

PUSH CX

PUSH AX

PUSH BX

Para devolver los valores correctos a cada registro al
momento de sacarlos de la pila es necesario hacerlo en el siguiente orden:

POP AX

POP CX

POP BX

Para la comunicación con dispositivos externos se utilizan el
comando out para mandar información a un puerto y el comando in para leer información recibida desde algún puerto.

La sintaxis del comando out es:

La sintaxis del comando in es:

OUT DX,AX
Donde DX contiene el valor del puerto que se utilizará para la comunicación y AX contiene la información que se mandará.

IN AX,DX Donde AX es el registro donde se guardará la información que llegue y DX contiene la dirección del puerto por donde llegará la información.

INSTRUCCIÓN MOV:

Propósito: Transferencia de datos entre celdas de memoria,
registros y acumulador.

Los diferentes movimientos de datos permitidos para esta
instrucción son:

Destino: memoria. Fuente: dato inmediato

Destino: memoria. Fuente: registro

Destino: memoria. Fuente: acumulador

Destino: acumulador. Fuente: memoria

Destino: registro de segmento. Fuente: memoria/registro

Destino: memoria/registro. Fuente: registro de segmento

Destino: registro. Fuente: registro

Destino: registro. Fuente: memoria

Destino: registro. Fuente: dato inmediato

Organización de la memoria durante la ejecución

para que un
programa se ejecute sobre un sistema operativo

es necesaria la existencia de un cargador que suministra al programa un bloque contiguo de memoria sobre el cual ha de ejecutarse.

el compilador debe incorporar al programa objeto todo
el código necesario para ello

La gestión de la memoria en otro tipo de lenguajes
(funcionales, lógicos, etc.) es, en general, diferente de la organización que aquí se plantea

Para lenguajes imperativos, los compiladores generan
programas que tendrán en tiempo de ejecución

una organización de la memoria similar (a grandes rasgos) a la que aparece en la siguiente figura.

En este esquema se distinguen claramente las secciones de:

el Montículo o heap

la Pila o stack

el Código

la Zona de Datos de Tamaño Fijo

  1. Zona de código

Es la zona donde se almacenan las instrucciones del
programa ejecutable en código máquina

y también el código correspondiente a los procedimientos y funciones que utiliza.

Su tamaño y su contenido se establecen en tiempo de compilación y por ello se dice que su tamaño es fijo en tiempo de ejecución.

De esta forma, el compilador, a medida que va generando código, lo va situando secuencialmente en esta zona

delimitando convenientemente el inicio de cada función, procedimiento y programa principal

El programa ejecutable final estará constituido por esta zona junto con información relativa a las necesidades de memoria para datos en tiempo de ejecución

  1. Overlays, solapamientos o encimamientos.

Algunos compiladores fragmentan el código del programa objeto usando overlays o “solapas”

cuando la memoria principal disponible es inferior al tamaño del programa completo

Estos overlays son secciones de código objeto que se almacenan en ficheros independientes y que se cargan en la memoria central dinámicamente

Se les llama “solapas” porque dos overlays pueden ocupar el mismo trozo de memoria en momentos de tiempo diferentes

Para hacer más eficiente el uso de la memoria,
los overlays de un programa se agrupan en zonas y módulos

click to edit

Durante el tiempo de ejecución sólo uno de los overlays de cada una de las zonas de overlay puede estar almacenado

La técnica de overlays no sólo se utiliza cuando el programa
a compilar es muy grande en relación con la disponibilidad de memoria

sino también cuando se desea obtener
programas de menor tamaño que deben coexistir con otros

El compilador reserva en la sección de
código una zona contigua de memoria para cada conjunto de overlays.

El tamaño de esta zona debe ser igual al del mayor módulo que se cargue sobre ella.

Una restricción a tener en cuenta es que las funciones de un módulo no deben hacer referencia a funciones de otro

ya que nunca estarán
simultáneamente en memoria.

Evidentemente, el tiempo de ejecución de un programa
estructurado con overlays es mayor que si no tuviese

puesto que durante la ejecución del programa es necesario
cargar cada módulo cuando se realiza una llamada a alguna de las funciones