Sie sind auf Seite 1von 34
Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos. José Daniel Muñoz Frías
Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos. José Daniel Muñoz Frías
Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos. José Daniel Muñoz Frías
Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos. José Daniel Muñoz Frías

Estructura de Computadores

Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.

José Daniel Muñoz Frías

Universidad Pontificia Comillas. ETSI ICAI. Departamento de Electrónica y Automática

ICAIdea Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.1/35 Índice
ICAIdea
Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.1/35
Índice
1. Introducción.
2. Direccionamiento inmediato.
3. Direccionamiento directo absoluto.
4. Direccionamiento directo relativo.
a) Dir. directo relativo a registro base.
b) Dir. directo relativo a registro índice.
c) Dir. directo relativo a pila.
d) Dir. directo relativo al PC.
5. Direccionamiento pseudodirecto del MIPS.
6. Direccionamiento indirecto.

ICAIdea

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.2/35

Introducción
Introducción
Introducción

Introducción

Modo de direccionamiento = procedimiento para determinar:

Un operando.

La dirección de un operando.

La dirección de una instrucción.

ICAIdea

de un operando. La dirección de una instrucción. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.3/35

Según (de Miguel Anasagasti, 2000): “Un modo de direccionamiento es un procedimiento que permite determinar un operando, o la dirección de un operando o una instrucción”. Como lo más frecuente es especificar la dirección donde está almacenado el dato o la instrucción, se emplea siempre el término modo de direccionamiento, aunque en el primer caso (determinar directamente el operando) no está muy justificado. Para simplificar, se denominará objeto al operando, resultado o instrucción que se desea di- reccionar. En la siguiente transparencia se muestra una clasificación de los distintos modos de direc- cionamiento usados en los procesadores. No obstante hay que resaltar que cada procesador incluye un subconjunto de estos modos de direccionamiento.

Introducción
Introducción
Introducción

Introducción

Inmediato.

Directo:

Absoluto:

De registro. De memoria. De página base.

Relativo:

A un registro. A un reg. índice A pila. Al contador de programa.

Indirecto.

Implícito.

ICAIdea

Al contador de programa. Indirecto. Implícito. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.4/35

Aunque cada modo de direccionamiento se expondrán en detalle a lo largo del capítulo, pode- mos introducir aquí su significado de forma somera:

Inmediato: El operando se incluye en la propia instrucción. En el MIPS, este modo de direccionamiento se usa para el segundo operando de las instrucciones addi, ori, etc.

Directo: Se indica en la instrucción la dirección del objeto. Por ejemplo el MIPS utiliza el modo relativo a un registro para las instrucciones de carga y almacenamiento.

Indirecto: Se indica una dirección en la que se encuentra la dirección del objeto. Este modo es útil para el manejo de punteros. No obstante algunas arquitecturas como el MIPS no lo incluyen.

Implícito: El objeto está siempre en un lugar predeterminado que depende de la instrucción. Por ejemplo en el MIPS la instrucción mult no necesita un registro destino, pues siempre deja su resultado en los registros hi y lo.

Ejercicio

En un programa MIPS es necesario cargar el dato cuya dirección está almacenada en la posi- ción 0x10007000. Si el registro gp contiene el valor 0x10008000, escriba la secuencia de instruc- ciones MIPS para cargar dicho dato en el registro s0.

Introducción
Introducción
Introducción

Introducción

Las motivaciones para usar los modos de direccionamiento son:

Ahorro de espacio.

Código reubicable y reentrante.

Manejo de estructuras de datos.

ICAIdea

y reentrante. Manejo de estructuras de datos. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.5/35

En principio puede parecer más conveniente especificar en la instrucción el objeto o su di- rección. Sin embargo esto no es lo más indicado, ya que los distintos modos de direccionamiento permiten:

Ahorro de espacio. Interesa que las instrucciones sean lo más cortas posibles para ahorrar tiempo al leerlas y espacio en memoria para almacenar los programas. Por ejemplo, en las operaciones aritméticas del MIPS han de especificarse dos operandos y un resultado. Si se especificase la dirección de memoria de cada uno de estos objetos serían necesarias 3 palabras de 32 bits, que sumados al código de operación (p. ej. 6 bits) harían un total de 102 bits.

Código reubicable y reentrante. Un código reubicable es aquel que puede ejecutarse sin cambios en cualquier zona de la memoria. Para ello es necesario disponer de direccionamientos relativos. Un código reentrante es aquel que puede ser llamado desde varios lugares a la vez o ser llamado varias veces antes de terminar su ejecución. Ejemplos cercanos son las rutinas recursivas o las rutinas de librerías en entornos multiproceso. En estos casos son necesarios direccionamientos de pila.

Manejo de estructuras de datos. Las tablas, matrices y estructuras de datos en lenguajes de alto nivel se manejan más eficientemente usando modos de direccionamiento relativos.

Direccionamiento inmediato
Direccionamiento inmediato
Direccionamiento inmediato

Direccionamiento inmediato

En el direccionamiento inmediato el objeto (un operando en este caso) está almacenado dentro de

la propia instrucción.

Por ejemplo, en el MIPS las instrucciones tipo I tienen un operando inmediato de 16 bits:

Tipo I

6 bits

5 bits

5 bits

16 bits

op

rs

rt

Inmediato

ICAIdea

5 bits 5 bits 16 bits op rs rt Inmediato ICAIdea Estructura de Computadores Cap. 4:

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.6/35

El modo de direccionamiento más simple es incluir el valor del operando dentro de la propia instrucción. Este modo de direccionamiento se usa para especificar constantes. En el MIPS existen varias instrucciones, las tipo I, que incluyen una constante como uno de sus operandos. Ejemplos de estas instrucciones son addi, ori. Su limitación principal es el tamaño máximo disponible. En el caso del MIPS el tamaño del valor inmediato son 16 bits. No obstante, la mayoría de las arquitecturas CISC permiten inmedi- atos de varios tamaños. Por ejemplo el Pentium permite constantes inmediatas de 8, 16 o 32 bits. El problema de esta aproximación es que las instrucciones se hacen de tamaño variable, lo que com- plica el paralelismo. En el caso del Pentium, según sea la longitud del inmediato, la instrucción puede ocupar 16, 24 o 40 bits. Esto es debido a que en este caso la instrucción se compone de un primer byte en el que incluye el código de operación seguido inmediatamente del dato inmediato de 8, 16 o 32 bits.

Direccionamiento directo absoluto
Direccionamiento directo absoluto
Direccionamiento directo absoluto

Direccionamiento directo absoluto

Se especifica directamente la dirección del objeto. Puede ser:

De registro. Se especifica el número del registro interno.

De memoria. Se especifica la dirección completa.

De página base. Se especifica la parte baja de la dirección. Los bits altos están implícitos.

ICAIdea

de la dirección. Los bits altos están implícitos. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.7/35

En el modo de direccionamiento directo absoluto, en la instrucción se especifica la localización del objeto. Existen tres alternativas:

De registro. Si el dato está almacenado en alguno de los registros internos del procesador, basta con que en la instrucción se indique el número de dicho registro.

De memoria. Si el objeto se encuentra en la memoria, en la instrucción se especifica la dirección completa de dicho dato. Aunque desde el punto de vista del programador este modo de direccionamiento es muy conveniente, desde el punto de vista del rendimiento no es el más adecuado, ya que la instrucción ha de incluir la dirección completa del objeto. Así, en el caso de un procesador con un mapa de direcciones de 32 bits, como por ejemplo el Pentium, son necesarios 32 bits para especificar la dirección del objeto, aparte de los bits necesarios para codificar el resto de la instrucción. No obstante, conviene destacar que este tipo de direccionamiento es muy conveniente en los saltos si se desea abarcar toda la memoria.

De página base. Con el objetivo de buscar facilidad de programación sin perjudicar las prestaciones, algunos procesadores incluyen un modo de direccionamiento directo absoluto en el cual sólo se especifica en la instrucción la parte baja de la dirección del objeto, estando implícita la parte alta. Por ejemplo en el MC6800, que tiene un bus de direcciones de 16 bits, se puede especificar una dirección absoluta con sólo 8 bits, poniendo el procesador los 8 bits más significativos a cero. Esto permite que los accesos a los primeros 256 bytes de la memoria (página base o página cero) requieran instrucciones más cortas (y por tanto más rápidas).

Direccionamiento directo absoluto
Direccionamiento directo absoluto
Direccionamiento directo absoluto

Direccionamiento directo absoluto

El MIPS dispone de direccionamiento directo absoluto de registro:

6 bits 5 bits 5 bits 5 bits 5 bits 6 bits Tipo R op
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
Tipo R
op
rs=2
rt
rd
shamt
funct
0
1
2
31
ICAIdea
Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.8/35

De los modos de direccionamiento directo absoluto discutidos en la transparencia anterior, el MIPS sólo dispone del direccionamiento directo absoluto de registro, que también se denomina para simplificar direccionamiento de registro. Como se puede apreciar en la transparencia, el código de operación incluye un campo de 5 bits para poder direccionar cada uno de los 32 registros internos que dispone el MIPS.

Direccionamiento directo relativo
Direccionamiento directo relativo
Direccionamiento directo relativo

Direccionamiento directo relativo

Se especifica un desplazamiento sobre una dirección de referencia.

La dirección se calcula como referencia + desplazamiento.

El desplazamiento suele ser pequeño bits.

El desplazamiento suele considerarse con signo.

Se complica la circuitería (sumador adicional).

Según la dirección de referencia existen varios tipos de direccionamiento directo relativo.

menos

ICAIdea

tipos de direccionamiento directo relativo. menos ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.9/35

En este modo de direccionamiento, la instrucción contiene, en lugar de la dirección absoluta del objeto, un desplazamiento sobre una dirección de referencia. Como generalmente basta con desplazamientos pequeños, no es necesario que el desplaza- miento sea del tamaño necesario para acceder a todo el mapa de direcciones, por lo que en general este modo de direccionamiento precisa de menos bits que el absoluto. Como la dirección de refer- encia sí suele ser del tamaño necesario para abarcar todo el mapa de direcciones, con este modo de direccionamiento se puede acceder a cualquier posición de memoria. Además, debido al principio de localidad de los datos, cuando se accede a un dato, lo más probable es que los siguientes datos estén cerca de él, por lo que la dirección de referencia no suele ser necesario cambiarla para cada dato. Esto permite una mayor velocidad de ejecución, ya que para acceder a cada dato sólo es necesario especificar en la instrucción el desplazamiento, que ocupa muchos menos bits que la dirección completa. El único inconveniente de este modo de direccionamiento es la necesidad de complicar el hardware para incluir un sumador que sume la dirección de referencia más el desplazamiento. No obstante, aunque puede pensarse que el tiempo empleado en calcular la suma empeorará el rendimiento, en realidad dicho tiempo no suele ser significativo. Por último conviene destacar que en la mayoría de los procesadores el desplazamiento se suma con signo, lo que permite acceder a datos por encima y por debajo de la dirección de referencia. Según la dirección de referencia utilizada, existen varios tipos de direccionamiento directo relativo, los cuales se exponen a continuación.

Dir. directo relativo a registro base
Dir. directo relativo a registro base
Dir. directo relativo a registro base

Dir. directo relativo a registro base

La dirección de referencia se almacena en un registro base. La instrucción ha de contener:

Un campo para el desplazamiento.

Otro para indicar el registro.

Muy útil para acceder a estructuras de datos:

Se coloca la dirección base de la estructura en el reg. base.

Se accede a cada elemento con el desplazamiento apropiado

ICAIdea

a cada elemento con el desplazamiento apropiado ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.10/35

En este modo de direccionamiento, la dirección de referencia está almacenada en un registro base. Este registro puede ser fijo o pueden existir varios registros disponibles para este fin, por lo que la instrucción incluirá también en estos casos un campo para especificar dicho registro de referencia. Por ejemplo, en el caso del MIPS se pueden usar como registros base cualquiera de los 32 registros de propósito general. El desplazamiento usado varía de unas arquitecturas a otras. Por ejemplo en el MIPS es siem- pre de 16 bits con signo. En el Pentium en cambio puede ser de 8, 16 y 32 bits. Desplazamientos pequeños implican un rango de variables accesibles también pequeño, pero al mismo tiempo nece- sitan menos bits para codificarlos. En el Pentium, como el tamaño de instrucción es variable, el desplazamiento se puede adaptar la longitud necesaria en cada caso. En el caso del MIPS, como el tamaño de instrucción está fijado a 32 bits, el desplazamiento también se ha fijado al máximo disponible, que son 16 bits. Este tipo de direccionamiento es muy útil cuando se necesita acceder a una serie de variables que están situadas cerca, como por ejemplo una estructura de datos en C. En estos casos se sitúa la dirección de comienzo de la estructura en el registro base y se varía el desplazamiento para acceder a cada una de las variables de la estructura.

Dir. directo relativo a registro base
Dir. directo relativo a registro base
Dir. directo relativo a registro base

Dir. directo relativo a registro base

Las instrucciones de carga y almacenamiento del MIPS utilizan este modo de direccionamiento.

Tipo I

6 bits 5 bits 5 bits 16 bits op rs=2 rt Despl=4 0 1 2
6 bits
5 bits
5 bits
16 bits
op
rs=2
rt
Despl=4
0
1
2
0x70
31

0x74

ICAIdea

bits op rs=2 rt Despl=4 0 1 2 0x70 31 0x74 ICAIdea Estructura de Computadores Cap.

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.11/35

las instrucciones de carga y almacenamiento del MIPS: lw, sw, lh, sh, lb y sb utilizan este modo de direccionamiento. Como se ha dicho antes, el desplazamiento es de 16 bits y se suma con signo al registro base, que puede ser cualquiera de los 32 registros disponibles. Nótese que las instrucciones lw y sw accederán a los 32 bits que hay a partir de la dirección calculada, lh y sh a los 16 bits y, por último, lb y sb accederá al byte que hay en la dirección calculada. Si se usa el registro zero como registro base se dispone de un direccionamiento absoluto a página base. Cuando el desplazamiento sea positivo se accederá a los primeros 32 kb de la memoria y cuando sea negativo a los últimos 32 kb de la memoria. De la misma forma, existe una convención en el MIPS para el manejo de la memoria. Según esta convención, se reserva un bloque de 64 kb para almacenar los datos 1 de los programas. Dicho bloque está situado a partir de la posición 0x10000000. Para permitir un acceso fácil a esta zona de memoria, se sitúa el valor 0x10008000 en el registro gp (del ingles global pointer), de forma que se pueda acceder a todo el bloque mediante el desplazamiento adecuado tomando como base el registro gp.

1 En esta zona se almacenan solamente las variables globales y las locales estáticas (las prece- didas por la palabra clave static en C). Las variables locales se almacenan en la pila.

Dir. directo relativo a registro índice
Dir. directo relativo a registro índice
Dir. directo relativo a registro índice

Dir. directo relativo a registro índice

Es una variación del anterior:

La dirección de referencia está contenida en la instrucción.

El desplazamiento está en un registro índice.

La dirección final se calcula al igual que antes como referencia+desplazamiento.

Permite acceder fácilmente a vectores de datos.

Para ello es conveniente escalar el índice.

ICAIdea

datos. Para ello es conveniente escalar el índice. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.12/35

El modo de direccionamiento relativo a registro índice es una variación del anterior: En lugar de almacenar la dirección de referencia en un registro y usar un desplazamiento pequeño para acceder a los datos, ahora se usa como dirección de referencia un campo de la instrucción y como desplazamiento un registro. El principal inconveniente de este modo de direccionamiento es que si se desea que la dirección de referencia abarque todo el mapa de direcciones, ha de tener un elevado número de bits. Algunas arquitecturas como el PowerPC solucionan este problema usando un registro para la dirección de referencia (registro base) y otro para el índice. El Pentium va un poco más allá permitiendo un registro base, un registro índice y además un desplazamiento de 8, 16 o 32 bits. El principal uso de este modo de direccionamiento es el acceso a vectores de datos. Por ello muchas arquitecturas permiten un escalado del registro índice, de forma que se puedan manejar vectores de datos de 16 o 32 bits automáticamente. Por ejemplo el Pentium dispone de este modo de direccionamiento con escalados de 1, 2 o 4 para acceder a vectores de bytes, palabras y dobles palabras (8, 16 y 32 bits en nomenclatura Pentium). Así, cuando se accede a un vector de dobles palabras, el índice se multiplica por 4, de forma que al acceder a la doble palabra i se direcciona la posición de memoria despl+4*i. Otras arquitecturas permiten incrementar o decrementar automáticamente el registro índice para recorrer automáticamente un vector de forma secuencial, tal como se muestra en la siguiente transparencia.

Dir. directo relativo a registro índice
Dir. directo relativo a registro índice
Dir. directo relativo a registro índice

Dir. directo relativo a registro índice

En algunas arquitecturas el registro índice se puede incrementar automáticamente. Existen 4 posibilidades:

Pre-autoincremento. vec[++i]. I

I+1 ; (ref+I)

Pre-autodecremento. vec[--i]. I

I-1 ; (ref+I)

Post-autoincremento. vec[i++]. (ref+I) ; I

Post-autodecremento. vec[i--]. (ref+I) ; I

I+1

I-1

Su utilidad es la de recorrer secuencialmente un vector.

ICAIdea

es la de recorrer secuencialmente un vector. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.13/35

Algunas arquitecturas como el 68000 o el PowerPC permiten incrementar o decrementar au- tomáticamente el registro índice. Existen cuatro posibilidades, aunque no todas las arquitecturas incluyen las cuatro:

Pre-autoincremento. Es equivalente a la sentencia de C vec[++i]: En primer lugar se incrementa el índice para a continuación calcular la dirección. Expresado en notación de

transferencia de registros, siendo ’I’ el registro índice y ’ref’ la dirección de referencia,

que coincidirá con la dirección del primer elemento del vector vec: I

Pre-autodecremento. Equivalente a: vec[--i]. Se decrementa el índice y después se

calcula la dirección. En notación de transferencia de registros: I

Post-autoincremento. Equivalente a: vec[i++]. Se calcula la dirección y a continuación

se incrementa el registro índice. En notación de transferencia de registros: (ref+I) ; I

Post-autodecremento. Equivalente a: vec[i--]. Se calcula la dirección y a continuación

se decrementa el registro índice. En notación de transferencia de registros: (ref+I) ; I

I+1 ; (ref+I)

I-1 ; (ref+I)

I+1

I-1

Estos modos de direccionamiento facilitan el recorrido secuencial de un vector, ya que au- tomáticamente incrementan o decrementan el índice de éste. Ahora bien, el incremento ha de adaptarse al tamaño de los datos del vector. Por ello, las arquitecturas que soportan este modo suelen permitir incrementar el índice en 1, 2 o 4 según se esté trabajando con vectores de 8, 16 o 32 bits.

Ejercicio

Escriba una serie de instrucciones MIPS para realizar un direccionamiento indexado con post- autoincremento en un vector de enteros de 32 bits. Como dirección base se usará s0 y como registro índice se usará t0. Utilice estas instrucciones para poner a cero un vector de 100 elementos cuya dirección inicial está almacenada en s0.

Dir. directo relativo a pila
Dir. directo relativo a pila
Dir. directo relativo a pila

Dir. directo relativo a pila

Es un caso particular del direccionamiento relativo a registro:

Existe un registro dedicado (SP) que almacena el tope de la pila.

push introduce un dato en la pila.

pop extrae un dato de la pila. Si la pila crece hacia abajo:

push realiza un direccionamiento relativo al SP con pre-autodecremento

pop realiza un direccionamiento relativo al SP con post-autoincremento.

ICAIdea

relativo al SP con post-autoincremento. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.14/35

Según se vio en el tema anterior, la pila es una estructura fundamental en programación. Su modo de direccionamiento es un caso particular del direccionamiento relativo a registro. De hecho en el MIPS se utiliza este modo de direccionamiento para implementar una pila utilizando uno de los registros generales sp para almacenar el tope de la pila. En muchas otras arquitecturas existen instrucciones especiales para introducir y extraer datos de la pila, típicamente llamadas push y pop respectivamente. Estas instrucciones realizan un di- reccionamiento relativo a registro, aunque de forma transparente al programador. Para empezar, no es necesario indicar el registro a usar, ya que hay un registro (el SP) reservado para almace- nar el tope de la pila. Además, a la hora de introducir un dato en la pila, el procesador realiza un direccionamiento relativo al SP con pre-autodecremento si la pila crece hacia abajo o con pre- autoincremento si la pila crece hacia arriba. De la misma manera, al extraer un dato de la pila, se realiza un direccionamiento relativo al registro SP con post-autoincremento si la pila crece hacia abajo o con post-autodecremento si la pila crece hacia arriba.

Dir. directo relativo al PC
Dir. directo relativo al PC
Dir. directo relativo al PC

Dir. directo relativo al PC

El registro base es el contador de programa.

Se utiliza para saltos cortos (bucles o if).

Se necesitan pocos bits para el salto.

Como el PC se incrementa al empezar a ejecutar la instrucción, el desplazamiento se calcula respecto a la instrucción siguiente a la del salto.

Ej. PC

64, Despl

16

salto a

PC

1

16

64

1

16

91.

El código producido es reubicable.

ICAIdea

64 1 16 91 . El código producido es reubicable . ICAIdea Estructura de Computadores Cap.

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.15/35

Cuando se realiza un salto, es necesario especificar la dirección de la instrucción a la que se desea saltar. Se puede especificar la dirección completa, pero ello implica usar un gran número de bits. No obstante, la mayoría de los saltos se originan en bucles y sentencias if, por lo que en la práctica la mayoría de los saltos se realizan a posiciones cercanas a la instrucción actual. Por ejemplo, en programas como el compilador gcc o el simulador de circuitos spice la mitad de los saltos son a posiciones que están situadas a menos de 16 instrucciones de la actual. Además la mayoría de los saltos son a instrucciones dentro del rango 2 15 respecto a la instrucción actual. Teniendo en cuenta lo dicho anteriormente, es muy conveniente disponer de un modo de di- reccionamiento relativo usando el PC como dirección de referencia para ser usado en los saltos. Además con un desplazamiento de 8 o 16 bits es más que suficiente en la mayoría de los casos. Hay que tener en cuenta que, por temas de implantación, el PC se incrementa mientras se está ejecutando la instrucción en curso, de forma que apunte lo antes posible a la instrucción siguiente. Por tanto, cuando se termina el ciclo de ejecución de la instrucción y se decide dar el salto, el PC ya estará apuntando a la instrucción siguiente. En consecuencia, el desplazamiento almacenado en la instrucción ha de calcularse relativo a la dirección de la instrucción siguiente al salto. Por ejemplo si la instrucción de salto está en la posición 64 y dicha instrucción tiene un desplazamiento de 16, el salto se realizará a la posición PC 1 16 64 1 16 91 (suponiendo que la instrucción ocupa 1 byte). Por último conviene destacar que el código producido con estos saltos es reubicable, pues no depende de las direcciones absolutas de las instrucciones para dar los saltos, sino de sus posiciones relativas.

Dir. directo relativo al PC
Dir. directo relativo al PC
Dir. directo relativo al PC

Dir. directo relativo al PC

El MIPS usa este direccionamiento en los saltos condicionales.

Tipo I

6 bits 5 bits 5 bits 16 bits op rs rt Despl=2 x4 0x78 PC
6 bits
5 bits
5 bits
16 bits
op
rs
rt
Despl=2
x4
0x78
PC
0x70

ICAIdea

16 bits op rs rt Despl=2 x4 0x78 PC 0x70 ICAIdea Estructura de Computadores Cap. 4:

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.16/35

En el MIPS se usa el direccionamiento directo relativo al PC para los saltos condicionales. Como se ha comentado antes, el PC se incrementa durante la fase de decodificación de la instrucción, por lo que cuando se decide dar el salto, el PC ya apunta a la siguiente instrucción (PC+4). En el ejemplo de la figura, la dirección que provoca el salto estará almacenada en la posición 0x6C. Por otro lado, como las instrucciones del MIPS tienen un tamaño fijo de 32 bits, los saltos serán siempre múltiplos de 4. Para conseguir una mayor distancia de saltos, esta multiplicación está implícita, por lo que el rango de los saltos pasa a ser de 2 15 instrucciones, es decir, 2 17 bytes.

Dir. pseudodirecto del MIPS
Dir. pseudodirecto del MIPS
Dir. pseudodirecto del MIPS

Dir. pseudodirecto del MIPS

Se emplea para saltos largos.

Tipo J

6 bits 26 bits op 0x1E x4 c 4 bits PC 0
6 bits
26 bits
op
0x1E
x4
c
4 bits
PC
0

0x78

ICAIdea

6 bits 26 bits op 0x1E x4 c 4 bits PC 0 0x78 ICAIdea Estructura de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.17/35

Según se mencionó anteriormente, es conveniente disponer de un modo de direccionamiento directo a memoria capaz de alcanzar todo el rango de direcciones para permitir que un programa pueda saltar a cualquier posición de memoria. En el MIPS son necesarios 32 bits para acceder a todo el mapa de memoria. Como las instrucciones en el MIPS tienen un tamaño fijo de 32 bits, no se puede especificar una dirección completa de 32 bits dentro de la instrucción. La solución adoptada es la de utilizar un nuevo formato de instrucción, denominado tipo J (de Jump), que contiene el código de operación de 6 bits, seguido de 26 bits para especificar una dirección. Al igual que con el direccionamiento directo relativo al PC, se puede almacenar en este campo de 26 bits la dirección de palabra en lugar de la dirección de byte, ya que todas las instrucciones tienen un tamaño de 32 bits y están alineadas en posiciones múltiplos de 4. Por tanto, los 26 bits se extienden así a 28 bits, con los dos bits menos significativos puestos a cero. Faltan por especificar los 4 bits superiores. La solución adoptada por los arquitectos del MIPS es la de copiar sin más los 4 bits superiores del PC actual, de forma que los saltos se restringen a zonas de 256 MB (64 Mega-instrucciones). Si el sistema operativo sitúa nuestro programa dentro de uno de esos bloques de 256 MB, no habrá ningún problema.

Ejercicios

1. ¿Es posible saltar fuera de una zona de 256 MB? ¿Cómo?

Ejemplo
Ejemplo
Ejemplo

Ejemplo

       

Inmediato

op

rs

st

rd

sh

fu

0x8000 B: sll $t1, $s2, 2

0

0

9

18

2

0

0x8004

add $t1, $t1, $s1 lw $t0, 0($t1) bne $t0, $s4, F add $s2, $s2, $s3 j B

0

9

17

9

0

32

0x8008

35

9

8

 

0

0x800C

5

8

20

 

2

0x8010

0

18

18

19

0

32

0x8014

2

 

0x2000

 

0x8018 F: add $t0, $zero,$zero

0

0

0

8

0

32

ICAIdea

add $t0, $zero,$zero 0 0 0 8 0 32 ICAIdea Estructura de Computadores Cap. 4: Repertorio

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.18/35

En la transparencia se muestra el código máquina generado por el código en ensamblador del MIPS del bucle mostrado en la página 58 del tema 3b. Se ha supuesto que el código se ha situado a partir de la posición de memoria 0x8000. Como se puede apreciar, en la instrucción de salto condicional situada en la dirección 0x800C, el desplazamiento es de 2. Por tanto el salto se realizará dos instrucciones más allá de la siguiente instrucción al salto, es decir:

0x800C + 4 + 2*4 = 0x8018 Por otro lado, la instrucción de salto incondicional situada en la dirección 0x8014 realiza un salto a la dirección 0x8000. Por tanto, en la instrucción se codifica como dirección de salto:

0x8000/4 = 0x2000.

Ejercicio

¿Es el código anterior reubicable? ¿Por qué? En caso negativo, modifique el programa anterior para que sea reubicable, incluyendo la codificación en código máquina. Para esta última parte puede usar el apéndice A de (Patterson y Hennessy, 2000).

Direccionamiento indirecto
Direccionamiento indirecto
Direccionamiento indirecto

Direccionamiento indirecto

Mediante uno de los modos de direccionamiento anteriores se obtiene la dirección del objeto.

Los modos usados son los absolutos y los indirectos a registro base e índice.

Se necesita otro acceso a memoria para leer el objeto.

Aunque es útil para manejo de punteros, muchas arquitecturas (p. ej. MIPS) no lo incluyen.

ICAIdea

muchas arquitecturas (p. ej. MIPS) no lo incluyen. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.19/35

En el direccionamiento indirecto, la dirección especificada en la instrucción no es la del objeto, sino la de la dirección del objeto. Es por tanto necesario un acceso a memoria adicional para leer el objeto una vez conocida su dirección. Aunque en teoría el direccionamiento indirecto se podría aplicar a todos los modos de direc- cionamiento directos, en la práctica se aplica a los absolutos y a los relativos a registro base y a registro índice. Este modo de direccionamiento es útil para el manejo de punteros. No obstante existen muchas arquitecturas, como por ejemplo el MIPS y en general todas las RISC, que no lo incluyen.

Dir. indirecto absoluto de registro
Dir. indirecto absoluto de registro
Dir. indirecto absoluto de registro

Dir. indirecto absoluto de registro

La dirección del objeto está en el registro indicado en la instrucción.

op rs=2 rt 0 0x27 1 2 0x74 31
op
rs=2
rt
0
0x27
1
2
0x74
31

0x74

ICAIdea

op rs=2 rt 0 0x27 1 2 0x74 31 0x74 ICAIdea Estructura de Computadores Cap. 4:

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.20/35

En este modo de direccionamiento, en la instrucción se especifica un registro en el que está almacenada la dirección del objeto. El MIPS no dispone de este modo de direccionamiento, aunque se puede generar a partir de

otro.

Ejercicio

Si el registro s0 contiene un puntero a un entero que se desea cargar en el registro t0, escriba una instrucción MIPS para hacerlo.

Dir. indirecto absoluto de memoria
Dir. indirecto absoluto de memoria
Dir. indirecto absoluto de memoria

Dir. indirecto absoluto de memoria

En la instrucción se especifica la dirección del puntero al objeto.

La dirección puede ser completa o a página base.

Dir=0x74 Dirección del objeto 0x27 Objeto
Dir=0x74
Dirección del objeto
0x27
Objeto

0x74

0x27base. Dir=0x74 Dirección del objeto 0x27 Objeto 0x74 ICAIdea Estructura de Computadores Cap. 4: Repertorio de

ICAIdea

Dirección del objeto 0x27 Objeto 0x74 0x27 ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.21/35

En este modo de direccionamiento, en la instrucción se especifica la dirección de memoria en la que se encuentra un puntero al objeto al que se desea acceder. Dicha dirección de memoria puede ser completa (más bits en la instrucción, pero el puntero puede estar en cualquier parte del mapa de memoria) o a página base (menos bits en la instrucción pero el puntero ha de estar situado en una zona restringida de la memoria). En ambos casos el objeto puede estar en cualquier parte de la memoria, ya que el puntero contendrá la dirección completa del objeto. Aunque el MIPS no dispone de este modo de direccionamiento de forma explícita, a partir de uno de sus modos de direccionamiento se puede generar un direccionamiento indirecto absoluto de página base.

Ejercicio

Se desea cargar en t0 un entero cuya dirección está almacenada en la posición de memoria 0x1000. Escriba una secuencia de instrucciones MIPS para hacerlo. ¿En qué zonas de memoria han de residir los punteros para poder usar este modo de direccionamiento en el MIPS?

Dir. indirecto relativo a reg. base
Dir. indirecto relativo a reg. base
Dir. indirecto relativo a reg. base

Dir. indirecto relativo a reg. base

La dirección del puntero se obtiene como base+desplazamiento.

Útil para tablas de punteros.

Tipo I

6 bits 5 bits 5 bits 16 bits op rs=2 rt Despl=4 0 0x27 1
6 bits
5 bits
5 bits
16 bits
op
rs=2
rt
Despl=4
0
0x27
1
2
0x70
31

0x74

0x27

ICAIdea

rs=2 rt Despl=4 0 0x27 1 2 0x70 31 0x74 0x27 ICAIdea Estructura de Computadores Cap.

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.22/35

En este modo de direccionamiento se aplica un direccionamiento relativo a registro base para obtener la dirección del objeto. Este modo permite trabajar fácilmente con tablas de punteros, ya que variando el desplaza- miento se obtiene cada uno de los objetos a los que apunta cada uno de los elementos del vector de punteros. En la figura se muestra gráficamente un modo de direccionamiento indirecto relativo a registro base. Se ha tomado como ejemplo el MIPS, aunque hay que destacar que el MIPS No dispone de este modo de direccionamiento. En el MIPS hay que realizar el acceso al objeto explícitamente:

lw $t0, 4($v0) lw $t0, 0($t0)

Como se puede observar, en primer lugar se carga la dirección del objeto en el registro t0 y a continuación se carga el objeto, también en el registro t0.

Dir. indirecto relativo a reg. índice
Dir. indirecto relativo a reg. índice
Dir. indirecto relativo a reg. índice

Dir. indirecto relativo a reg. índice

Existen dos posibilidades:

Post-indexado: La dirección de referencia de la instrucción contiene un puntero al que se le suma el registro índice: dir = ((ref))+(Ri).

Pre-indexado: La dirección del puntero al objeto está almacenada en la dirección de referencia + Ri: dir = ((ref)+(Ri)).

Nota: ref es el campo de la instrucción que contiene la dirección de referencia.

ICAIdea

que contiene la dirección de referencia. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.23/35

Al igual que en el direccionamiento directo relativo a registro índice, en la instrucción se especifica una dirección de referencia y un registro índice. Según el momento en el que se realiza la indexación, existen dos modos de direccionamiento indirecto relativo a registro índice (también llamado para abreviar indirecto e indexado):

Post-indexado: En este caso se accede a la dirección de referencia para obtener una dirección a la que se le suma el contenido del registro índice. El resultado de esta suma será la dirección a la que hay que acceder para obtener el objeto. En notación de transferencia de registros, la dirección a la que se accede es: ((ref))+(Ri). La utilidad de este modo de direccionamiento es la de poder acceder a cada uno de los elementos de un vector conociendo la dirección del puntero a su primer elemento. El inconveniente de usar este modo para esta aplicación es su gran ineficiencia ¿Sabría explicar por qué?

Pre-indexado: En este caso se suman en primer lugar la dirección de referencia y el con- tenido del registro índice para obtener el puntero al objeto. A continuación se usa la direc- ción obtenida para acceder al objeto. En notación de transferencia de registros, la dirección a la que se accede es: ((ref)+(Ri)). Este modo de direccionamiento es útil para acceder a cada uno de los elementos a los que apunta una tabla de punteros.

Dir. indirecto relativo a reg. base indexad
Dir. indirecto relativo a reg. base indexad
Dir. indirecto relativo a reg. base indexad

Dir. indirecto relativo a reg. base indexad

Es una combinación del direccionamiento indirecto relativo a reg. base y el indirecto post-indexado.

La dirección del objeto se obtiene como:

((Rb)+(despl))+(Ri)

Siendo:

Rb: Registro base.

despl: Campo de la instrucción que contiene el desplazamiento.

Ri: Registro índice.

ICAIdea

contiene el desplazamiento. Ri: Registro índice. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.24/35

En la página 12 se expuso brevemente el direccionamiento directo a registro base con de- splazamiento e indexado como una combinación del direccionamiento a registro base con el direc- cionamiento indexado. Este direccionamiento, disponible en el Pentium, calcula la dirección del objeto como (Rb)+(despl)+(Ri), es decir, la dirección a la que se accede es la suma del contenido del registro índice más el desplazamiento almacenado en el campo ’despl’ de la instrucción más el contenido del registro Ri. En el direccionamiento indirecto relativo a registro base con desplazamiento e indexado, se accede a la dirección (Rb)+(despl) para obtener un puntero al que se le suma el contenido del registro Ri para obtener la dirección final del objeto. En notación de transferencia de registros, la dirección del objeto se obtiene como: ((Rb)+(despl))+(Ri). La utilidad de este modo de direccionamiento es la de poder acceder a los elementos de un vector a partir de una tabla de punteros a una serie de vectores, lo cual no es muy común en la práctica. Al igual que el direccionamiento indirecto con post-indexado, este modo de acceder a los elementos de un vector no es muy eficiente ¿Por qué?

Ej. CISC: Formatos de instrucción
Ej. CISC: Formatos de instrucción
Ej. CISC: Formatos de instrucción

Ej. CISC: Formatos de instrucción

F1

CO LI MD

CD

 

F2

CO LI MD

RT1

RT2

CD

CO

Código de operación.

LI

Longitud de instrucción.

MD

Modo de direccionamiento.

CD

Campo de datos.

RTx Identificación de registro.

ICAIdea

Campo de datos. RTx Identificación de registro. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.25/35

En las siguientes transparencias se va a estudiar un ejemplo de aplicación de los modos de direccionamiento vistos hasta ahora a una máquina CISC ficticia. Dicha máquina CISC tiene un bus de datos de 16 bits y un bus de direcciones de 16 bits. Las instrucciones se codifican según los dos formatos mostrados en la figura: F1 y F2. Los dos formatos comienzan con un primer byte en el que se codifica el código de operación, la longitud de la instrucción y el modo de direccionamiento empleado. En el segundo byte se encuentra un dato inmediato en el formato F1 o dos identificadores de registro en el formato F2. En el formato F2 se incluye una segunda palabra de 16 bits con un campo de datos que puede contener un dato inmediato o una dirección. En las siguientes transparencias se muestran los distintos modos de direccionamiento sopor- tados por esta máquina CISC. Se indica para cada modo el formato de instrucción utilizado (Fx), el contenido del campo de datos (CD), la dirección final a la que se accede (DF) y el número de accesos de memoria empleados para ejecutar una instrucción que realice ACC (ACC)+(DF). Éste número de accesos se divide en captación (C) y ejecución (E) de la instrucción.

Ej. CISC: Modos de direccionamiento
Ej. CISC: Modos de direccionamiento
Ej. CISC: Modos de direccionamiento

Ej. CISC: Modos de direccionamiento

Tipo Dir.

Fx

CD

DF

C+E

Comentario

Inmediato

F1

Dato 8b

 

– 1+0

Op. con cte. = 8 b

F2

Dato 16b

 

– 2+0

Op. con cte. = 16 b

Directo

F1

Dir(dato)

(CD)

1+1

Acceso pag. base

F2

Dir(dato)

(CD)

2+1

Acceso toda mem.

Indirecto

F1

Dir(Dir(dato))

((CD))

1+2

Punteros en mem.

Directo Reg.

F1

Id. Reg.

RT

1+0

Op. con reg.

Indir. Reg.

F1

Id. Reg.

(RT)

1+1

Punt. en reg.

ICAIdea

F1 Id. Reg. (RT) 1+1 Punt. en reg. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.26/35

En esta transparencia y en la siguiente se muestran los modos de direccionamiento soportados por esta arquitectura CISC ficticia. Existen dos modos de direccionamiento inmediato, en función de la longitud necesaria para la constante. Si ésta es pequeña, se podrá codificar dentro del campo de datos (CD) de la instrucción con formato F1. Con ello se consigue una operación rápida, ya que sólo es necesario un ciclo de acceso para leer la instrucción. Si la constante necesita 16 bits para codificarse, entonces es necesario usar el formato de instrucción F2, necesitándose entonces 2 ciclos de acceso a memoria para captar la instrucción. Para direccionamiento directo absoluto de memoria, este computador dispone de direccionamien- to a página base usando el formato F1, con lo que se necesita 1 acceso para captar la instrucción y otro para captar el operando desde la memoria. Si se necesita acceder a toda la memoria es nece- sario usar el formato F2 para disponer de un campo de datos de 16 bits. El inconveniente es un ciclo adicional para captar la segunda palabra de la instrucción. El modo de direccionamiento indirecto absoluto sólo está soportado en página base utilizando el formato F1. Nótese que ahora es necesario un ciclo de captación para la instrucción y dos accesos adicionales para leer el dato: un primer acceso para leer el puntero al dato y un segundo acceso para leer el dato. Por último, existen dos modos de direccionamiento con registro: directo, en el cual se usa el dato contenido en el registro y por tanto sólo es necesario un ciclo de captación; e indirecto, en el cual el registro contiene la dirección del dato, lo que implica un acceso a memoria adicional para leer el dato.

Ejercicio

¿Dónde han de residir los punteros para poder utilizar el direccionamiento indirecto? ¿Cuántos accesos a memoria serían necesarios en un modo de direccionamiento indirecto si queremos que el puntero utilizado pueda estar en cualquier parte de la memoria?

Ej. CISC: Modos de direccionamiento
Ej. CISC: Modos de direccionamiento
Ej. CISC: Modos de direccionamiento

Ej. CISC: Modos de direccionamiento

Tipo Dir.

Fx

CD

DF

C+E

Comentario

Relativo CP

F1

Despl.

(CP)+(CD)

1+1

Saltos cercanos

Relativo Ind.

F1

Ref.

(CD)+(Rin)

1+1

Vectores

F2

Ref.

(CD)+(Rin)

2+1

Relativo base

F1

Despl.

(Rb)+(CD)

1+1

Estructuras datos

F2

Despl.

(Rb)+(CD)

2+1

ICAIdea

datos F2 Despl. (Rb)+(CD) 2+1 ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.27/35

El modo de direccionamiento relativo al contador de programa usa el formato F1, con lo que sólo se permiten saltos cortos (del tamaño del CD). El número de accesos es uno de captación más otro para captar el objeto, que en este modo de direccionamiento será una instrucción. 1 El modo de direccionamiento relativo a registro índice dispone de dos formatos: F1 cuando la dirección de referencia está en página base y F2 cuando dicha dirección de referencia está en cualquier parte de la memoria. En el primer caso se necesita un ciclo para captar la instrucción y otro para acceder al dato, mientras que en el segundo se necesitan dos ciclos para captar la instrucción. El modo de direccionamiento relativo a registro base dispone también de dos formatos posi- bles, en función de la longitud necesaria para el desplazamiento.

1 Aunque este modo de direccionamiento se utiliza siempre para saltos, nada impide en teoría usarlo para acceder a los datos del programa. No obstante, en la mayoría de las aplicaciones los datos y los programas se sitúan en segmentos de memoria separados para una mayor facilidad de programación. Por ejemplo en el MIPS los programas de usuario se sitúan desde 0x400000 a 0x0FFFFFF y los datos desde 0x1000000 a 0x7FFFFFFF.

Ej. CISC: Modos de direccionamiento
Ej. CISC: Modos de direccionamiento
Ej. CISC: Modos de direccionamiento

Ej. CISC: Modos de direccionamiento

Tipo Dir.

Fx

CD

DF

C+E

Comentario

Ind. postindex

F1

Dir(vec)

((CD))+(Rin)

1+2

Punt a vector

Ind. preindex

F1

Dir(vec)

((CD)+(Rin))

1+2

Vec de punt.

Ind. Reg. Base

F1

Despl.

((Rb)+(CD))

1+2

Vec de punt.

Ind. Base+Indx

F2

Dir.

((Rb)+(CD))+(Rin)

2+2

Vec de vec de punt.

ICAIdea

((Rb)+(CD))+(Rin) 2+2 Vec de vec de punt. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.28/35

El modo de direccionamiento indirecto relativo a registro índice con post-indexado utiliza el formato F1, lo cual implica que la dirección de referencia ha de estar en página base. El contenido de dicha dirección será normalmente la dirección del primer elemento de un vector, por lo que para acceder a cada uno de los elementos basta con situar su índice en el registro índice. Nótese que son necesarios ahora un ciclo de captación y dos de ejecución: un primer acceso para leer la dirección base del vector y poder así calcular la dirección del dato sumando a dicha dirección base el contenido del registro índice. Una vez calculada la dirección del dato se realiza otro acceso para acceder a él. El modo de direccionamiento indirecto relativo a registro índice con pre-indexado se utiliza para acceder a objetos a través de una tabla de punteros. Al igual que el post-indexado, se utiliza el formato F1, con lo que la tabla de punteros ha de estar en página base. Para acceder al objeto se realiza un acceso para leer la dirección base a la que se le suma el registro índice para obtener la dirección del objeto. Son necesarios por tanto tres accesos: uno para la instrucción, otro para la base del vector de punteros y un tercero para el objeto. El modo de direccionamiento indirecto relativo a registro base es similar al indirecto relativo a registro índice con pre-indexado. La única diferencia es que el registro base contendrá la dirección de una tabla de punteros y para acceder a cada uno de los elementos de dicha tabla se usan distintos desplazamientos dentro del CD de la instrucción. Por último el direccionamiento indirecto relativo a registro base e indexado se puede utilizar para acceder a los elementos de un vector a partir de una tabla de punteros a una serie de vectores. Mediante un direccionamiento indirecto a registro base se obtiene la dirección del primer elemento del vector. A dicha dirección se le suma el contenido de un registro índice para acceder al elemento deseado dentro del vector. Como se dijo antes, la utilidad de estos cuatro últimos modos de direccionamiento en la prác- tica no es mucha, por lo que las arquitecturas RISC optan por no incluirlas en su repertorio de modos de direccionamiento. Esto evita complicar innecesariamente la CPU con modos de direc- cionamiento que se utilizan rara vez.

Regularidad y ortogonalidad
Regularidad y ortogonalidad
Regularidad y ortogonalidad

Regularidad y ortogonalidad

Regularidad: Inexistencia de casos particulares.

Es más fácil de programar en ensamblador.

El diseño del compilador es mas sencillo.

Ortogonalidad: Se puede usar cualquier modo de direccionamiento para cada uno de los operandos y el resultado.

ICAIdea

para cada uno de los operandos y el resultado. ICAIdea Estructura de Computadores Cap. 4: Repertorio

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.29/35

Un buen juego de instrucciones ha de ser regular y ortogonal. Por regular se entiende que no presente casos particulares, lo cual facilita la programación en ensamblador y el diseño de compiladores. Por ejemplo el MIPS puede usar cualquiera de sus 32 registros en todas sus operaciones. Además la mayoría de las instrucciones son de tres direcciones:

un resultado y dos operandos. Sin embargo en este aspecto presenta una irregularidad con las instrucciones de multiplicación mult y división div, ya que como recordará, estas aceptan sólo dos operandos y dejan el resultado en los registros hi y lo. No obstante el ensamblador admite la pseudoinstrucción (mul) que después de multiplicar transfiere el contenido del registro lo a un registro destino. Así para multiplicar s0 por s1 y depositar el resultado en t0 basta con hacer mul $t0, $s0, $s1. El Pentium en cambio tiene ciertos registros que sólo pueden usarse con determinadas instrucciones. En cuanto a la ortogonalidad, el MIPS no es nada ortogonal, pues en las operaciones sólo ad- mite direccionamiento directo de registro o un operando inmediato. El Pentium en cambio admite operaciones registro-registro, registro-memoria y memoria-registro, lo cual lo hace más ortogonal (faltan las operaciones memoria-memoria). El colmo de la ortogonalidad lo tenemos en el VAX, hoy obsoleto, en el cual tanto el resultado como los operandos podían estar en registros o en memo- ria, pudiéndose utilizar cualquiera de los modos de direccionamiento disponibles.

Ej. CISC: Pentium
Ej. CISC: Pentium
Ej. CISC: Pentium

Ej. CISC: Pentium

En las siguientes transparencias se muestra la arquitectura a nivel de ensamblador del Pentium.

Sólo se discute el modelo de 32 bits, pues el de 16 bits

está claramente en desuso (MS-DOS) y es bastante

peor.

ICAIdea

claramente en desuso (MS-DOS) y es bastante peor. ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.30/35

Ej. CISC: Pentium. Registros

Name

31

0

Use

EAX

 

GPR 0

ECX

 

GPR 1

EDX

 

GPR 2

EBX

 

GPR 3

ESP

 

GPR 4 (Stack Pointer)

EBP

 

GPR 5 (Frame Pointer)

ESI

 

GPR 6 (Source Index)

EDI

 

GPR 7 (Destination Index)

CS

Code segment pointer

SS

Stack segment pointer (top of stack

DS

Data segment pointer 0

ES

Data segment pointer 1

FS

Data segment pointer 2

GS

Data segment pointer 3

EIP

 

Instruction pointer (PC)

EFLAGS

 

Condition codes

ICAIdea

pointer (PC) EFLAGS   Condition codes ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.31/35

En la figura se muestran los registros disponibles en el Pentium para operaciones con enteros. Los 8 primeros EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI son considerados de propósito general, aunque algunos de ellos tienen además otras tareas específicas. Por ejemplo el ESP es el puntero de pila y el EBP puede ser usado como puntero al bloque de activación. Los registros ESI y EDI se usan en las instrucciones de transferencia de cadenas de caracteres para apuntar respectivamente al origen y destino de los caracteres transferidos. Los 6 registros de 16 bits CS, SS, DS, ES, FS, GS son los punteros de segmentos en el modo real o los descriptores de segmento en modo protegido. Aunque en modo real (MS-DOS) el programador tenía que acceder a estos registros para el manejo de la memoria, en modo protegido son sólo usados por el sistema operativo. En cualquier caso, no están disponibles para usarlos en las aplicaciones. Por último el registro EIP es el contador de programa y el registro EFLAGS contiene los bits de estado (banderas) del procesador. Estos bits se activan automáticamente al ejecutarse ciertas instrucciones. Por ejemplo existe un bit denominado Z que se activa cada vez que el resultado de una operación es cero. Como puede observar, el banco de registros del Pentium, si se compara con el del MIPS, es bastante más limitado. Existen sólo 8 registros de propósito general en lugar de los 31 del MIPS, pero además 4 de ellos tienen funciones muy específicas, lo que hace que sea aún más difícil mantener un gran número de variables dentro de estos registros durante la ejecución de los programas. Lamentablemente, la necesidad de mantener la compatibilidad con el 8086 hace imposible introducir nuevos registros para mejorar las prestaciones. Lo único que se ha podido hacer ha sido aumentar su tamaño de 16 a 32 bits, pero nada más.

Ej. CISC: Pentium. Operandos
Ej. CISC: Pentium. Operandos
Ej. CISC: Pentium. Operandos

Ej. CISC: Pentium. Operandos

El Pentium es una máquina de dos direcciones. las combinaciones permitidas son las siguientes:

Fuente1/Destino

fuente2

Registro

Registro

Registro

Inmediato

Registro

Memoria

Memoria

Registro

Memoria

Inmediato

ICAIdea

Memoria Registro Memoria Inmediato ICAIdea Estructura de Computadores Cap. 4: Repertorio de

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.32/35

Las instrucciones aritméticas y lógicas del Pentium admiten dos argumentos, de los cuales el primero hace las veces de fuente y de destino, es decir, el resultado de la operación se sobreescribe en el primer argumento. Esto hace aún más difícil mantener las variables de los programas en los registros internos de la CPU, ya que uno de los argumentos se destruye en la operación, por lo que si lo volvemos a necesitar después hay que volver a cargarlo de memoria (o guardarlo en la pila y recuperarlo después si es un resultado intermedio que no está aún almacenado en la memoria). Una clara ventaja del Pentium con respecto al MIPS (y en general con respecto a todos los RISC) es la de poder especificar como uno de los operandos una palabra situada en memoria, usando cualquiera de los modos de direccionamiento descritos a continuación. Esta característica facilita la programación, pero dificulta la implementación del procesador.

Ej. CISC: Pentium. Modos de direcciona
Ej. CISC: Pentium. Modos de direcciona
Ej. CISC: Pentium. Modos de direcciona

Ej. CISC: Pentium. Modos de direcciona

Los modos de direccionamiento del Pentium son irregulares:

No todos los modos pueden usarse con todas las instrucciones.

No todos los registros pueden usarse en todos los modos

Esto hace difícil la escritura de programas en ensam-

blador y de los compiladores.

ICAIdea

de programas en ensam- blador y de los compiladores. ICAIdea Estructura de Computadores Cap. 4: Repertorio

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.33/35

Un ejemplo de instrucción que no soporta todos los modos de direccionamiento es la instruc- ción out que sirve para enviar un dato a un puerto de entrada/salida. Dicha instrucción necesita que la dirección del puerto esté en el registro DX.

Tampoco algunos registros pueden usarse con otros modos de direccionamiento a memoria. Por ejemplo, para copiar un dato al registro ES no puede hacerse mediante un direccionamiento inmediato con la instrucción:

mov es, 023h ; Ilegal

pues este tipo de instrucción sólo soporta el modo registro, registro. Por tanto para almacenar un valor en el registro es primero hay que colocar dicho valor en un registro de propósito general (por ejemplo ax) y luego copiar dicho registro al es, tal como se muestra a continuación:

mov

ax, 023h

mov

es, ax

Obviamente estas excepciones dificultan la labor de los programadores que han de recordar un gran número de excepciones y casos particulares.

Ej. CISC: Pentium. Modos de direcciona
Ej. CISC: Pentium. Modos de direcciona
Ej. CISC: Pentium. Modos de direcciona

Ej. CISC: Pentium. Modos de direcciona

Los modos de direccionamiento soportados son:

Inmediato (8, 16 o 32 bits) Directo absoluto de registro Directo absoluto de memoria (dir 32 bits) Indirecto absoluto de registro (ni ESP ni EBP) Directo relativo a registro base (no ESP) Directo relativo a reg. base escalado e indexado Directo relativo a pila Directo relativo al CP (IP)

ICAIdea

Directo relativo a pila Directo relativo al CP (IP) ICAIdea Estructura de Computadores Cap. 4: Repertorio

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.34/35

Siguiendo la filosofía de los procesadores RISC, el Pentium soporta un gran número de modos de direccionamiento. En primer lugar los valores inmediatos pueden ser de hasta 32 bits, lo cual contrasta con el MIPS, en el cual sólo pueden ser de 16 bits. En segundo lugar se puede especificar la dirección absoluta de memoria de 32 bits dentro de una instrucción, lo cual permite usar fácilmente cualquier posición de la memoria. Al igual que el MIPS es posible acceder a una posición de memoria cuya dirección está al- macenada en un registro de propósito general. No obstante dicho registro no puede ser ni ESP ni EBP. También dispone de un modo de direccionamiento relativo a registro base, pudíendose usar desplazamientos de 8 bits o de 32 bits, lo que permite nuevamente acceder a toda la memoria. El modo relativo a registro base escalado en indexado (SIB en la terminología Intel) es bastante potente, permitiendo acceder a cualquier elemento de un vector en una sola operación. En este modo se especifica un registro base, al que se le suma un índice multiplicado por un factor de escala que puede ser 1, 2, 4 u 8 para permitir usar vectores con elementos de 1, 2, 4 u 8 bytes. Al resultado se le puede sumar un desplazamiento adicional de 8 o 32 bits. Por ejemplo, si el comienzo del bloque de activación está almacenado en el registro ebp y de desea almacenar un 4 en el elemento 3 de un vector de enteros que comienza en la posición 7 del bloque de activación, se puede hacer:

mov eax, 3 mov [dword ebp+4*eax+7], dword 4

El direccionamiento a pila está soportado mediante las instrucciones push y pop. Por último, el direccionamiento relativo al CP admite desplazamientos de 8 o de 32 bits.

Formatos de instrucción. Pentium
Formatos de instrucción. Pentium
Formatos de instrucción. Pentium

Formatos de instrucción. Pentium

Bytes

0 − 4

1 − 3

0 − 1

0 − 1

0 − 4

 

0 − 4

PREFIX

OPCODE

MODE

SIB

DISPLACEMENT

 

IMMEDIATE

 
   
   
 
   
 

Bits

2

3

 

SCALE

INDEX

BASE

 
 
   
 

Bits

2

3

3

MOD

REC

R/M

ICAIdea

      Bits 2 3 3 MOD REC R/M ICAIdea Estructura de Computadores Cap. 4:

Estructura de Computadores Cap. 4: Repertorio de instrucciones. Direccionamiento y formatos.– p.35/35

En la figura, que ya se ha mostrado en el capítulo 3, se ilustra el formato de las instrucciones del Pentium. En el se puede apreciar cómo se codifican los modos de direccionamiento, el cual se realiza entre el código de operación y los dos bytes siguientes, denominados MODE y SIB. El primero de ellos indica el modo de direccionamiento del operando que está en memoria. Mediante los 3 bits R/M se indica el registro usado en el direccionamiento y con los 2 bits MOD se especifica el modo de acceso: Directo absoluto de registro (11), indirecto absoluto de registro (00), directo relativo a registro base con desplazamiento de 8 bits (01) o de 32 bits (10). Las combinaciones no usadas debido a que los registros ebp y esp no pueden usarse en algunos modos se usan para especificar el direccionamiento directo y el direccionamiento SIB. En este último caso se necesita incluir el byte SIB para especificar los dos registros base e índice así como la escala por la que se multiplica al índice. Los dos últimos posibles campos sirven para almacenar el desplazamiento (DISPLACEMENT) de 1, 2 o 4 bytes 1 y un dato inmediato, también de 1, 2 o 4 bytes. Una exposición más detallada puede encontrarse en (Intel, 2003).

Referencias

de Miguel Anasagasti, P. (2000). Fundamentos de los computadores. Paraninfo-Thomson learning.

Intel (2003). IA-32 Intel

R

Architecture Software Developer’s Manual. Volume 2: Instruction Set

Reference. Intel corporation. Disponible on-line en:

http://developer.intel.com/design/pentium4/manuals/245471.htm.

Patterson, D. A. y Hennessy, J. L. (2000). cuitería/programación. Reverté.

Estructura y diseño de computadores. Interficie cir-

1 El desplazamiento de 2 bytes sólo se usa en el modo real (compatibilidad con 8086).