Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DE ARQUITECTURA
FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN
DE SISTEMAS Y
ARQUITECTURA DE MÁQUINAS COMPUTADORAS II APLICACIONES
Podemos decir que las instrucciones son comandos que indican al procesador qué operación ejecutar
en cada momento y con cuales operandos. Se denomina conjunto o repertorio de instrucciones a todas las
posibles instrucciones para un procesador específico. El diseño del conjunto de instrucciones es el punto de
partida de toda arquitectura de computadoras.
Es deseable que el conjunto de instrucciones del CPU cumpla con las siguientes características:
3.1.2 Instrucción
Denominamos instrucción a un tipo especial de dato que se emplea para ordenar al CPU que ejecute
una de las operaciones que puede realizar. En términos generales, la instrucción debe tener información
acerca del tipo de operación a realizar, con qué operandos, dónde poner el resultado (si la operación genera
alguno) y alguna forma de obtener la próxima instrucción. En las máquinas del tipo Von Neumann, que son
máquinas secuenciales, se supone que la próxima instrucción está contigua en la memoria. En este caso, la
información de próxima instrucción es implícita. Este esquema de secuenciamiento requiere de un puntero o
contador de programa que se incremente de forma automática para que siempre señale a la próxima
instrucción a ejecutar. Para estos propósitos se emplea un registro del CPU denominado normalmente PC
(Program Counter).
Una instrucción debe, por tanto, determinar: la Operación a ejecutar y los Operandos (tanto fuentes como
destino) a emplear en la misma. El secuenciamiento implícito se puede cambiar mediante instrucciones de
salto que permiten modificar el PC. Los Operandos pueden especificarse de forma explícita o implícita
(cuando están sobreentendidos) en la instrucción. Por ejemplo, las instrucciones de salto no hacen referencia
al PC pero está sobreentendido que éste es el destino de esas operaciones.
Los operandos pueden residir en registros internos del procesador o en la memoria. Los operandos fuentes
también se pueden especificar directamente en la instrucción. Las diferentes formas de obtener los
operandos desde donde residan se denominan modos de direccionamiento. Los operandos que residen en
memoria pueden especificarse mediante muchos diferentes modos de direccionamiento.
Podemos clasificar las instrucciones en categorías o tipos de acuerdo a la operación que realizan. En
la tabla a continuación se presenta un cuadro sinóptico con el detalle de esta clasificación.
Control de flujo de Permite modificar la secuencia del JP, JR, BRN, CALL,
Programa programa para implementar sentencias de RET
selección, ciclos y llamadas a subrutinas.
Existen básicamente dos filosofías en torno al diseño del conjunto de instrucciones. Al inicio, el
diseño de las computadoras estaba orientado a proveer al programador con el mayor posible conjunto de
instrucciones con muchas formas de obtener los operandos (modos de direccionamiento), lo cual iba
haciendo el hardware cada vez más complejo y mayor el recargo de trabajo para la decodificación y ejecución
de las instrucciones. Un estudio reveló que era muy reducido el conjunto de éstas que en realidad se
utilizaban y se propuso una nueva filosofía de diseño, basada en el conjunto de instrucciones reducido que
realmente era utilizado con frecuencia y simplificar los modos para reducir la complejidad del hardware y
mejorar el desempeño. Esta corriente filosófica se denominó RISC (Computadora de conjunto reducido de
instrucciones) y a las máquinas con la tendencia de conjunto muy amplio, anteriores a ella se llamó CISC
(Computadoras con conjunto complejo de instrucciones).
RISC CISC
El formato de instrucción, por lo general se organiza en campos. Cada campo posee un tipo de información,
algunas arquitecturas, sin embargo, tienen campos compuestos y otras mezclan información en un mismo
campo. Ejemplos: MIPS siempre mantiene un mismo código de operación para el tipo de instrucción y
mantiene un campo fijo para cada operando, mientras la familia ix86 tiene un código de operación diferente
por cada tipo y cantidad de operandos de la misma operación.
IDENTIFICACION DIRECCIONAMIENTO
MD VALOR(ES)
Otra técnica empleada es la Técnica de bloque expandido. Esta se basa en el hecho que no todas las
instrucciones usan todos los campos de direccionamiento. Se pueden identificar grupos de 3, 2, 1 y 0
operandos, entonces, se pueden emplear pocos bits para el CO de las instrucciones de más operandos y en el
nuevo grupo usar los bits del operando que no ocupará el anterior para “expandir” el CO a más bits.
Ejemplo: ¿Cuántos bits ( L o longitud) se requieren para el formato de instrucciones de una máquina hipotética, si se tienen
que codificar 15 diferentes instrucciones cada una de 2 operandos, donde el operando fuente 1 asume como destino de la
operación y cada operando requiere 6 bits para codificarse?
L (F) = ?
n = 15 L (CO) = log2(15) = 4 bits
L (F) = L (CO) + 2 * L (Op) = 4 + 2 * 6 = 16 bits
*Nótese que aquí la longitud de los operandos es constante, existen máquinas donde no ocurre lo mismo.
Suponga, ahora que además de las 15 de 2 operandos requiero 30 de 1 operando. ¿Cuántos bits se
requieren?
En este nuevo escenario, la instrucción pasa a tener un total de 18 bits. Note que esto genera un
problema interesante, pues si la resolución de la memoria es de un byte y no de palabras de 18 bits, el
tamaño de instrucción deberá escalar a 3 * 8 = 24 bits, desperdiciando 6 bits en el formato. Esto no siempre
es malo, en términos de rendimiento, pero puede ser un inconveniente en cuanto a ahorro de espacio en
disco y memoria.
Para evitar el desperdicio del ejemplo anterior, se podría usar la técnica de bloque expandido, así los
6 bits que libera el segundo operando en este nuevo grupo, se pueden emplear para “expandir” el CO. Es
importante que queden algunas combinaciones libres del primer formato para poderlas usar como llave que
nos indique que esa combinación es expandida. En esta caso queda la combinación 1111. Así el decodificador
sabrá que cuando aparezca ésta encabezando el CO, éste será de 4 + 6 = 10 bits.
CO O2 O1
0000 xxxxxx xxxxxx
… … … 15 inst. de 2 operandos
1110 xxxxxx xxxxxx
1111
Nótese que con este formato, no se requieren más bits para codificar las nuevas 30 instrucciones.
Ejemplo: Supongamos que se desea codificar el conjunto de instrucción hipotético mostrado en la tabla
siguiente:
Nemónicos de Contador de Frecuencia Relativo
Instrucciones
LOAD 1/4
STO 1/4
ADD 1/8
AND 1/8
NOT 1/16
RSHIFT 1/16
JUMP 1/16
HALT 1/16
Los valores del contador de frecuencia relativa se obtienen inspeccionando la ocurrencia de cada
Instrucción en un conjunto de programas representativos. En ésta técnica podemos especificar un
algoritmo para crear los Códigos para cada CO de cada instrucción. Primero se ordenan las instrucciones
en función de su frecuencia relativa o probabilidad de ocurrencia, de mayor a menor de izquierda a
derecha. Segundo, se asigna a cada nemónico de Instrucción un nodo etiquetado con el contador de
frecuencia relativa correspondiente (figura a continuación)
Tercero: Asociar los nodos con el menor peso siempre, mediante la operación suma para genera nuevos
nodos hasta que no queden posibles asociaciones. La figuras 2.8 a, b y c muestran este proceso.
Cuarto: Las ramas derechas del árbol obtenido son etiquetadas con “0” y las izquierdas con “1” (Figura 2.8 c).
Quinto: Para encontrar el código de operación correspondiente de determinada instrucción se hace un
camino desde la raíz hasta el nodo del mnemónico correspondiente. Por ejemplo el CO de la instrucción
RSHIFT es 0010. En la figura 2.8 se puede apreciar todos los pasos y en la taba que le sigue se resumen los
CO para todo el Conjunto de instrucciones del ejemplo.
a) 1/8
1/8 1/8
b)
1 0 1 0 1 0 1 0
1 0
1/4
1 0
1/2
1 0
c)
1/2
Se puede apreciar que el procedimiento de Huffman codifica con menos bits las instrucciones
mas frecuentes usadas y con más bits las menos usadas. El número promedio de bits necesarios por
instrucción pueden ser calculados usando la formula:
n
longitud CO med LA li . f i
i 1
=1+¾+1
= 2.75 bits.
Aplicando esta formula al esquema de codificación de bloque donde cada instrucción será codificada
con tres bits:
= 3/2 + ¾ + ¾
= 3 bits.
LO = 2.75 bits.
La diferencia entre la longitud promedio actual y la longitud óptima sobre la longitud actual es llamada
Redundancia. Ésta mide el grado de desperdicio en el uso de bits para codificar el mensaje y se calcula
así:
R = LA - LO
LA
Calculando el desperdicio se nota que en el esquema de Huffman la redundancia es igual a cero, y para el
esquema de código de bloque hay una redundancia de 8.33%.
El esquema de Huffman lleva a cabo un resultado óptimo manteniendo la redundancia a un valor mínimo
sin embargo los códigos de operación son de tamaño variable, lo cual puede complejizar la construcción
del decodificador. La codificación de código de bloque fijo toma espacio de memoria extra pero es
ampliamente usado por su sencillo procedimiento de decodificación. La codificación de bloque extendido
también es muy usada cuando tenemos formatos de instrucción variable.
MD V
V (Valor): Dato que se emplea en el cálculo de la dirección efectiva del operando. Frecuentemente V
indica un registro, una dirección de memoria o un número. En los últimos casos, este valor puede ser
bastante grande, incluso, podrían no caber en un formato de instrucciones pequeño, por lo cual se
suelen emplear palabras adjuntas en la instrucción para dar cabida a estos valores. La figura abajo
muestra una de estas variantes.
CO MD1 V1 MD2 V2
El cálculo de la dirección efectiva del operando se obtiene combinando los valores del MD y V con el
estado del procesador. Esquemáticamente:
MD V
CALCULO DE LA
DIRECCION
EFECTIVA
DIRECCION EFECTIVA
DEL OPERANDO
ESTADO DEL
PROCESADOR
Para los operandos en registros, la dirección efectiva del operando es el número, dirección o identificación
del registro. Los operandos en memoria, se pueden obtener de diferentes modos. El objetivo final es
obtener la dirección efectiva donde se almacena el operando en memoria. A continuación estudiaremos los
modos de direccionamiento más comunes.
El valor del operando es especificado dentro de la misma instrucción. Realmente V es el valor mismo del
operando. En este caso no es necesario calcular dirección efectiva.
MD V = # ( operando )
El operando se encuentra en uno de los registros del procesador. En este caso el valor del operando es el
contenido del registro.
MD r Modo de direccionamiento
Directo o Directo de Registro
BANCO DE
REGISTROS DEL
PROCESADOR
Dirección
Efectiva
OPERANDO
Rr
MD @ Modo de direccionamiento
Absoluto o Directo de Memoria
MEMORIA
Dirección
Efectiva
OPERANDO
MD r Modo de direccionamiento
Indirecto de Registro
BANCO DE
REGISTROS DEL
MEMORIA PROCESADOR
Rr
Dirección Efectiva
OPERANDO
Se pueden dar diferentes niveles de Indirección, según la arquitectura. Como ejercicio visualice el
diagrama gráfico para doble indirección.
El valor de V especifica la dirección de memoria en cuyo contenido está la dirección efectiva del operando.
MD @ Modo de direccionamiento
Indirecto de Memoria
MEMORIA
Dirección Efectiva
OPERANDO
Este modo no es muy frecuente, ni eficiente en la actualidad, sin embargo fue usado en antiguas
máquinas para automatizar punteros y acceso a estructuras de datos.
Este es un modo particularmente útil para trabajar con estructuras de datos estáticas. Está presente en
arquitecturas antiguas como la PDP/11. Son variantes del modo indirecto de registro. En el autoincremento,
la EA1 es el contenido del registro Rr. Una vez que se obtiene tal dirección el contenido del registro Rr se
incrementa en una constante k, que por lo general es 1.
MD r Modo de direccionamiento
de Autoincremento
BANCO DE MEMORIA
REGISTROS DEL
PROCESADOR
Rr
Dirección Efectiva OPERANDO Celda A
Celda A + k
Operando = M([ Rr ])
Rr = [ Rr ] + k
BANCO DE MEMORIA
REGISTROS DEL
PROCESADOR
OPERANDO Celda A - k
Rr
A Celda A
Rr = [ Rr ] - k
Operando = M( [ Rr ] )
Cabe mencionar que estos modos también tienen sus indirectos. Como tarea, visualice las operaciones que
se deber realizar para recuperar un operando en indirecto de autoincremento.
Existe una serie de modos muy flexibles que permiten realizar direccionamiento dinámico, lo cual es
muy útil para recorrer estructuras de datos, como arreglos de números o de estructuras. Estos modos
obtienen la dirección efectiva del operando calculándola mediante suma de registros y/o valores numéricos.
Por ejemplo, la dirección puede obtenerse sumando dos o más registros, o un registro y un valor numérico.
Existen casos complejos donde se incluye también escalación, en el cual uno de los valores es multiplicado
por una constante que normalmente representa el tamaño del elemento del arreglo que se desea recorrer.
En nuestro curso sólo enfocaremos algunos de ellos. Especial interés debe ponerse en el modo relativo,
donde el desplazamiento es relativo al valor de un registro. El desplazamiento relativo más útil es el relativo
al PC que se emplea en las instrucciones de salto.
En este modo, el campo V tiene dos partes: Una dirección base (o registro base) y un registro índice.
Para calcular la dirección efectiva, se toma la dirección base y se le suma el contenido del registro índice.
Puede darse también el modo indirecto de índice. Se propone al lector interpretar el funcionamiento del
indirecto de índice.
BANCO DE MEMORIA
REGISTROS DEL
PROCESADOR
Rr
Indice
+ OPERANDO
Operando = M( [ Rr ] + base )
Para que este modo sea eficiente se requiere tener facilidad de manipulación del registro de índice
por aparte. Por ejemplo: incrementar y decrementar el registro por una constante arbitraria k para el
recorrido de las estructuras de datos estáticas o por diferentes valores específicos para estructuras de datos
variables.
Ventajas: Acceso eficiente a arreglos y estructuras en la memoria. Es considerado uno de los modos
más versátiles de acceso a memoria.
Desventajas: Precisa cargar y actualizar el índice por aparte.
Este modo es similar al anterior, el direccionamiento requiere dos partes: Un registro base y un valor de
desplazamiento. Para calcular la dirección efectiva, se toma la dirección contenida en el registro base y se le
suma con el desplazamiento. El valor del desplazamiento puede ser negativo o positivo. La diferencia con el
anterior es que éste último se usa cuando tenemos desplazamientos constantes, por ejemplo para acceso a
estructuras de datos.
BANCO DE MEMORIA
REGISTROS DEL Dirección Base
PROCESADOR
desplazamiento
Rr
Base
+ OPERANDO
Operando = M( [ Rr ] + desplazamiento )
Estos modos permiten involucrar varios registros y escalares en el cálculo de la dirección efectiva la cual
se realiza nos solo con suma sino además por multiplicación. Estos modos eliminan la necesidad de cálculo
del tamaño del operando en el índice por aparte. Así el índice solo se autoincrementa o decrementa por 1.
Por ejemplo, el modo siguiente permite recorrer una estructura de datos de 8 bytes de tamaño con base en
Rbase, usando Rindice para controlar el elemento a acceder: Rbase + Rindice * 8
Este modo es una variante del modo base-desplazamiento. La principal diferencia radica en que el valor
calculado no es la dirección de un operando sino el resultado de la operación. El modo relativo normalmente
tiene por registro base al PC, permitiendo implementar los saltos, es decir, las instrucciones de control de
flujo de programa, al modificar el secuenciamiento automático de la máquina. El registro base es implícito
cuando se trata del PC. Algunas arquitecturas permiten tener desplazamientos relativos muy complejos,
permitiendo además de una constante, un registro sumados al valor del PC.
MEMORIA
(Area de programa)
+ próxima instrucción
realmente
desplazamiento
(negativo )
instrucción actual
próxima instrucción
PC originalmente
PC = [PC] + desplazamiento
Es importante anotar aquí el uso del bit de indirecto en la arquitectura PDP, que sirve de base a
nuestro curso. Este bit se emplea para diferenciar los modos directos de su correspondiente indirecto sólo en
un bit (el LSB del campo de MD) Si este bit es 1 el modo en cuestión es indirecto. Por ejemplo, supongamos
que se define la combinación 000 para el modo Directo de Registro, entonces la combinación 001 deberá
corresponder al modo Indirecto de Registros. Esta técnica simplifica mucho la implementación de la Unidad
de Control.
ADD (R0), R1
Donde el primer operando se obtiene indirectamente del registro R0 y el segundo, que es a la vez destino, se
obtiene directamente de R1. Si el código de MD directo de registro es 000, entonces el formato de la
instrucción se vería así:
CO MD1 V1 MD2 V2
Formato de la instrucción
CO MD1 V1 MD2 V2
0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1
CO de ADD Indirecto en 0 =
modo directo
Bit de indirecto en 1 -
Modo de 000 = 0 001 = 1
> Modo indirecto
Registro -> R0 -> R1
Contenido de la Instrucción
Finalmente, para concluir nuestra discusión acerca del formato de la Instrucción. Anotaremos que los
modos de direccionamiento dependen de la estructura y organización del procesador. Recordemos que
existen tres diferentes: Máquina de registros, de Pila y de Acumulador. Las primeras enfatizan en el uso de
instrucciones de 2 y 3 direcciones. Las segundas poseen básicamente sólo instrucciones de 0 direcciones (o
de 1 en caso de transferencia) y la de acumulador básicamente solo de 1.