Modos De Direccionamiento
Enviado por norber • 13 de Febrero de 2012 • 2.095 Palabras (9 Páginas) • 772 Visitas
MODOS DE DIRECCIONAMIENTO Y GENERACIÓN DEL CÓDIGO OBJETO
Generación de la dirección de la instrucción.
Todos los registros internos del 8086/8088 son de 16 bits. El bus de dirección es de 20 bits, por lo que se usa más de un registro interno para generar la dirección de 20 bits.
Los 2 registros usados para la dirección de la instrucción son el IP y el CS. Se combinan en una forma especial para generar la dirección de 20 bits. dirección de 20 bits = 1610 * CS + IP
Por ejemplo: Si los registros CS e IP contienen los valores:
CS = 1000H
IP = 0414 H
La dirección de 20 bits es:
1610 * 1000H + 0414H = 10000H + 0414H = 10414H
Esta es la dirección en memoria desde la cual la nueva instrucción debe buscarse. Al registro IP se le refiere como offset, el registro CS * 1610 apunta a la dirección de nicio o segmento en memoria desde el cual se calcula el offset. La Figura A muestra gráficamente cómo se calcula la dirección de 20 bits.
Cada dirección generada por el 8086/8088 usa uno de los 4 registros de segmento. Este registro de segmento es recorrido 4 bits hacia la izquierda antes de ser sumado al offset.
La instrucción del CPU especifica cuáles registros internos se usan para generar el offset. Vamos a ver los diferentes modos de direccionamiento tomando como ejemplo la instrucción MOV.
Instrucción MOV
Transfiere un byte desde el operando fuente al operando destino. Tiene el siguiente formato:
MOV destino, fuente
Direccionamiento Inmediato
El operando fuente aparece en la instrucción. Un ejemplo, es el que mueve un valor constante a un registro interno.
MOV AX, 568
Direccionamiento a Registro
Indica que el operando a ser usado está contenido en uno de los registros internos de propósito general del CPU. En el caso de los registros AX, BX, CX o DX los registros pueden ser de 8 a 16 bits
Ejemplos:
MOV AX, BX ; AX . BX
MOV AL, BL ; AL . BL
Cuando usamos direccionamiento a registro, el CPU realiza las operaciones internamente, es decir, no se genera dirección de 20 bits para especificar el operando fuente.
Direccionamiento Directo
Especifica en la instrucción la localidad de memoria que contiene al operando. En este tipo de direccionamiento, se forma una dirección de 20 bits.
Ejemplo:
MOV CX, COUNT
El valor de COUNT es una constante. Es usada como el valor offset en el cálculo de la dirección de 20 bits
El 8086/8088 siempre usa un registro de segmento cuando calcula una dirección física. ¿Cuál registro se debe usar para esta instrucción? Respuesta: DS
En la Figura B, se muestra el cálculo de la dirección desde la cual se tomará el dato que se carga en CX.
Este es el segmento por omisión que se usa. Sin embargo, cualquiera de los 4 segmentos puede usarse. Esto se efectúa especificando el registro apropiado en la instrucción.
Por ejemplo, suponga que deseamos usar el registro ES en lugar del DS:
MOV CX, ES: COUNT
Direccionamiento de Registro Indirecto
Con el modo de direccionamiento de registro índice, la dirección offset de 16 bits está contenida en un registro base o registro índice. Esto es, la dirección reside en el registro BX, BP, SI o DI.
Ejemplo:
MOV AX, [SI]
El valor de 16 bits contenido en el registro SI debe ser el offset usado para calcular la dirección de 20 bits.
Otra vez, debe usarse un registro de segmento para generar la dirección final. El valor de 16 bits en SI se combina con el segmento apropiado para generar la dirección.
Direccionamiento de Registro Indirecto con Desplazamiento
Este tipo de direccionamiento incluye a los dos modos de direccionamiento anteriores. La dirección offset de 16 bits se calcula sumando el valor de 16 bits especificado en un registro interno y una constante.
Por ejemplo, si usamos el registro interno DI y el valor constante (desplazamiento), donde COUNT ha sido previamente definido, el nemotécnico para esta construcción es:
MOV AX, COUNT [DI]
Si: COUNT = 0378H
DI = 04FAH
0872H
Entonces, la dirección offset de 16 bits es 0872H
Direccionamiento de Registro Indirecto con un Registro Base y un Registro Índice
Este modo de direccionamiento usa la suma de dos registros internos para obtener la dirección offset de 16 bits a usarse en el cálculo de la dirección de 20 bits.
Ejemplos:
MOV [BP] [DI], AX ; el offset es BP + DI
MOV AX, [BX] [SI] ; el offset es BX + SI
Direccionamiento de Registro Índice Indirecto con un Registro Base, un Registro Índice y un Registro Constante
Este es el modo de direccionamiento más complejo. Es idéntico al modo de direccionamiento anterior, excepto que se suma una constante.
Ejemplo: Suponga que tenemos los siguientes valores en los registros:
DI = 0367H
BX = 7890H
COUNT = 0012H
7C09H
Este modo de direccionamiento indica que el offset especificado por la suma de DI + BX
+ COUNT sea usado para mover el dato en memoria en el registro AX.
MOV AX, COUNT [BX] [DI]
La dirección offset de 16 bits es 7C09H. La dirección completa en 20 bits se calcula de la expresión:
1610*DS + 7C09H
Si el DS contiene 3000H, la dirección completa de 20 bits es:
3000H + 7C09H = 37C09H
Código Objeto del 8086/8088
Como programador, debes escribir los nemotécnicos. El código objeto es generado por la computadora (son los bytes que ejecuta el CPU) Con el conjunto de instrucciones del 8086/8088, cada tipo de modo de direccionamiento puede requerir un número diferente de bytes. En los ejemplos siguientes proporcionaremos el número de bytes requeridos por cada modo de direccionamiento.
Bit W y campo REG
La instrucción MOV AX, 568H
Indica mover inmediatamente al registro interno AX el valor 568H. El registro interno puede ser de 1 byte o de una palabra. Esta instrucción requiere 2 o 3 bytes, como se indica en la Figura C.
El primer byte contiene los
...