Sei sulla pagina 1di 9

SET DE INSTRUCCIONES

1.

Introduccin

El lenguaje que nos permite comunicarnos con el hardware se llama lenguaje de mquina y sus palabras se denominan set de instrucciones las cuales las iremos a analizar y con ayuda de estas miraremos paso a paso los efectos de un programa real. Se podra llegar a pensar que existen diferentes lenguajes de maquina, pero la verdad es que son muy parecidos, tanto que cuando se entiende uno es fcil entender los dems. El objetivo de un lenguaje de maquina es hacer ms fcil la construccin de hardware y del compilador maximizando el rendimiento y minimizando el coste. Este capitulo estar dedicado al estudio del repertorio de instrucciones basado en los MIPS donde se explica el funcionamiento de los bloques de instrucciones ms utilizados.

2.

Operaciones del hardware


La estructura de las operaciones son de la siguiente manera:

add

R1,R2,R3

# Suma R2 con R3 y lo guarda en R1.

Como se puede ver el nmero mximo de operandos es tres, dos que se suman entre s y uno donde se guarda el resultado. Cada linea como mximo debe tener una instruccin. Tambin es importante saber que el hardware para un nmero variable es mas difcil que para un nmero jo.

3.

Operandos del hardware.

Los operandos no son variables cualquiera, son posiciones especiales llamados registros. Los registros son de tamao limitado en el caso de los MIPS tienen 32 registros y se representa desde $0 hasta el $31. Un ejemplo de esto seria. add $7, $8, $9 # Suma el contenido de los registros $8 con $9 y los guarda en el registro $7.

El procesador tiene una capacidad de almacenamiento pequea, igual a la cantidad de registros que contenga, en estos puede almacenar variables simples como los datos de los ejemplos anteriores, pero tambin puede manejar datos complejos como los arrays y debido a que estos pueden llegar a ser muy grandes para almacenarlos en los registros se almacenan en la memoria la cual tiene una gran capacidad de almacenamiento. Las operaciones aritmticas solo se pueden realizar en los registros, debido a esto existen unas instrucciones que transeren datos desde la memoria hacia los registros llamadas instrucciones de transferencia de datos, donde la instruccin suministra su direccin. Las direcciones 1

comienzan en 0, como lo vemos en la gura 1 la direccin del tercer dato es 2 y su valor de Memoria[2] es 129.

Figura 1: Direccin y contenido de memoria.

La instruccin de transferencia que desplaza los datos se denomina cargar (load) y su formato es el nombre de la operacin seguido por el registro que se va a cargar, luego la direccin del comienzo del array, y nalmente un registro donde contiene el ndice del array que se cargara. lw add $7, A[$8] $9, $10, $7 # En el registro $7 obtenemos el dato guardado en A[j]. # Suma el contenido de $10 con A[j] y los guarda en el registro $9.

La instruccin lw suma la direccin del comienzo del array A con el ndice j en el registro $19 para obtener el dato A[j] por esta razn este registro se denomina registro ndice el cual nos indica la posicin real del dato en la memoria. La instruccin contraria a cargar es almacenar sw. Su funcin es la de transferir un dato de un registro a una posicin de memoria. lw add sw $7, A[$8] $7, $10, $7 $7, A[$8] # En el registro $7 obtenemos el dato guardado en A[j]. # Suma el contenido de $10 con A[j] y los guarda en $7. # Colocamos el resultado de la suma en el array A[j] ubicado en la memoria.

4.

Instrucciones en el computador

Las instrucciones en un computador son seales electronicas altas y bajas y se representan de la siguiente manera, por ejemplo si tenemos la siguiente instruccin: add $7, $20, $21

Esta instruccin se representa como veremos en el tabla 1. Cada segmento recibe el nombre de campo. 2

0 000000 op 6bits

20 10100 rs 5bits

21 10101 rt 5bits

7 00111 rd 5bits

0 00000 shamt 5bits

32 100000 f unct 6bits

Tabla 1: Representacin de la instruccin en decimal, binario y nombre de cada campo.

Para los MIPS cada campo recibe un nombre, op es la operacin de la instruccin, rs es el primer registro fuente, rt es el segundo registro fuente, rd es el registro destino, shamt es la cantidad de desplazamiento y pro ltimo funct es el que selecciona la variante de la operacin del campo op. El anterior formato de el tabla 1 se denomina tipo R y se utiliza para operaciones que entre registros. Para operaciones que tengan que ver con la memoria se utiliza otro formato, debido a que la direccin de la memoria puede superar los 5 bits, este formato se denomina tipo I y su estructura esta en el tabla 2. En esta tabla tambin podemos ver la siguiente instruccin. lw $7, A[$8] op 35 6bits # En el registro $7 obtenemos el dato guardado en A[j]. rs 8 5bits rt 7 5bits direccin A[j] 16bits

Tabla 2: Representacin de la instruccin formato tipo I.

Para distinguir que formato utilizar solo basta con leer el primer campo op.

5.

Instrucciones para toma de decisiones

La toma de decisiones es algo propio de un computador, en donde el puede escoger entre varias alternativas. Los MIPS tienen varias instrucciones para la toma de decisiones de las cuales se destacan dos, if con goto. beq bne $8, $9, B1 $8, $9, B1 # Ir a (go to) la sentencia rotulada B1 si $8 = $10. # Ir a (go to) la sentencia rotulada B1 si $8 es diferente de $10.

El rtulo B1 corresponde a una direccin de memoria en la cual esta la instruccin de restar. Ejemplo: En el siguiente segmento en C, f, g, h, i y j son variables, correspondientes a los registros $16 a $20 Cul es el cdigo MIPS compilado? if (i==j) goto B1; 3

f=g+h; L1: f=f-i; El programa compilado es: beq add B1: add $19, $20, B1 # Ir a B1 si i = j. $16, $17, $17 # f=g+h (ignorada si si i = j). $16, $16, $19 # f=f-i (siempre se ejecutara).

Otras instrucciones de toma de decisiones son: slt j jr $8, $9, $10 B1 $9 # Pone 1 en $8 si $9 es menor que $10. de lo contrario pone 0 en $8. # Ir a B1 (bifurcacin incondicional). # Ir a $9 (bifurcacin incondicional a registro).

Un inconveniente para un programa, es que un cambio en la linea de un procedimiento requiere volver a compilar todo el programa, esto ocasiona perdidas de recursos. Una soluccin es compilar y ensamblar cada procedimiento de un programa por aparte, debido a esto son muy importantes las anteriores instrucciones de toma de decisiones. Todo este procedimiento lo hace un cargador de enlaces el cual permite separar los procedimientos de un programa, as que si llegase a cambiar alguna linea del cdigo solo se volvera a compilar una porci del programa.

6.

Procedimientos en el hardware del computador

Los procedimientos o subrutinas hacen mas fcil el funcionamiento de un programa y permiten que el cdigo sea reutilizable. Algunas instrucciones que nos permiten ir a un procedimiento y luego retornar a la siguiente instruccin de donde salto son las siguientes: jal jal jr P1 P1 $31 # Ir a P1 (bifurcacin incondicional). # Ir a P1 y guarda la direccin de la siguiente instruccin en $31. # Ir a $31 direccin de vuelta.

Implcitamente existe un registro llamado contador de programa PC, que contiene la direccin de la instruccin actual, lo que hace jal es incrementar este registro para que apunte a la siguiente instruccin. Lo que hace jr es simplemente copiar $31 en el PC. Pueden haber procedimientos que llamen a procedimientos y estos a su vez llaman a otros procedimientos y asi n veces, entonces tendramos que ir guardando las direcciones del $31 en la memoria, la estructura ideal para guardar estos datos es una pila en donde el ultimo dato en entrar es el primero en salir (lifo). Las pilas crecen de las direcciones superiores hacia las inferiores de modo que cuando se introducen direcciones en la pila se resta el puntero de pila

y cuando se sacan direcciones de la pila aumenta el puntero de pila. Para introducir datos en la pila se denomina push y para sacarlos se denomina pop. Para devolver direcciones los MIPS utiliza dos convenios que gobiernan los pasos de parmetros, colocndolos en los registros del $4 al $7 (registros de llamada). Estos convenios son: 1. Guardar invocador (caller save). Guarda y restaura cualquier registro que tenga que conservarse a travs de una llamada. 2. Guardar invocado (caller save). Guarda y restaura cualquier registro que utilice. En el caso de que ocurra mas de cuatro parmetros el convenio MIPS coloca los parmetros extra en la pila.

7.

Otros modos de direccionamientos de los MIPS.

El propsito de los diseadores de los MIPS es acceder ms rapido a constantes pequeas y hacer ms ecientes los saltos.

7.1.

Operandos constantes o inmediatos.

Las contantes son muy utilizadas en un programa. Con las instrucciones vistas hasta ahora para utilizar una constante tenemos primero que cargarla en memoria para luego cargarlas en un registro. Para evitar esto, se puede hacer que la constante se conserve en la instruccin. Utilizaremos el formato tipo I (I signica inmediato), adems de esto le agregaremos una i al nal de cada instruccin (operacin inmediata). Por ejemplo: addi $7, $7, 4 op 8 001000 # En el registro $7 obtenemos el la suma del $7, con la constante 4. rs 7 00111 rt 7 00111 inmediato 4 0000 0000 0000 0100

Tabla 3: Representacin de la instruccin suma inmediata en formato tipo I .

Como el registro $0 es siempre 0, podemos comparar con 0. Si utilizamos el modo inmediato podemos usarlo para compararlo con cualquier valor. Por ejemplo: slti $8, $9, 6 # $8 = 1 si $9 es menor que 6, si no $8 = 0.

El repertorio de instrucciones MIPS tiene una instruccin para cargar constantes que superen los 16 bits, cargar inmediato superior (load upper inmediate) (lui), coloca los 16 bits de una constante een un registro y por medio de la siguiente instruccin coloca los 16 bit inferiores. Por ejemplo para cargar la constante 4000.000 (0000 0000 0011 1101 0000 1001 5

0000 0000) en el registro $10, lo primero que hacemos es coger los primeros 16 bits (0000 0000 0011 1101 = 61) y los cargamos en la parte superior de $10, luego cogemos los 16 bits inferiores (0000 1001 0000 0000 = 2304) y se los sumamos a $10 de forma inmediata. Esto lo podemos ver en las siguientes dos instrucciones. lui addi $10, 61 $10, $10, 2304 # $10 = 0000 0000 0011 1101 0000 0000 0000 0000. # $10 = 0000 0000 0011 1101 0000 1001 0000 0000.

Esto nos permite descomponer grandes constantes y volverlas a reenzamblar en un registro. Para esto es utilizado el registro temporal $1. Es asi como el ensamblador puede manejar grandes constantes y grandes direcciones.

7.2.

Direccionamiento en saltos y bifurcaciones.

Utilizan un nuevo formato tipo J, consta de 6 bits para el campo de operacin y 26 bits para la direccin. Como lo vemos en la primera instruccin. j bne 1000 $8, $9, B1 # Ir a la posicin 1000 (bifurcacin incondicional). # Ir a (go to) la sentencia rotulada B1 si $8 es diferente de $10.

En la segunda instruccin se utiliza el formato tipo I, dejando 16 bits para la direccin. Esto signicara que ningn programa podra tener mas de 216 direcciones, el cual seria muy pequeo. Una solucin seria que un registro se sumara con la direccin de salto, de modo que la instruccin de salto seria: PC = registro + direccin de salto Esto nos permite tener un programa mas grande hasta de 232 direcciones y la posibilidad de tener saltos condicionales, resolviendo el problema de direccin de salto. Como el PC contiene la direccin de la instruccin actual podemos realizar saltos menores de 216 si utilizamos el PC como registro para sumar a la direccin. Esta forma de direccionamiento se denomina direccionamiento relativo al PC. Recordemos que contador de programa cuenta el nmero de palabras a la siguiente instruccin y no el nmero de bytes, por lo tanto su salto se puede aumentar al cudruple de capacidad si utilizamos el PC. Los MIPS utiliza el direccionamiento relativo al PC en todos los saltos condicionales porque el destino es puede estar muy proximo y cuando invoca a procedimientos que no estn cerca lo hace por medio del formato tipo J, tanto para bifurcacin como para bifurcacin y enlace. Los modos de direccionamiento de los MIPS son: 1. Direccionamiento inmediato, donde uno de los operandos es una constante. 2. Direccionamiento de registros, donde los operandos son registros. 6

3. Direccionamiento base o desplazamiento, donde el operando esta en memoria y su direccin es la suma de un registro con una direccin de una instruccin. 4. Direccionamiento relativo al PC, donde la direccin es la suma del PC con una constante que va dentro de mla instruccin. En la gura 2 se muestra cada uno de estos modos de direccionamiento.

Figura 2: Modos de direccionamiento.

8.

Alternativas a la aproximacin de MIPS.

El objetivo es reducir el nmero de instrucciones. El costo de esto es que se incrementa el tiempo para cada instruccin. A continuacin se presentan varios mtodos para reducir el nmero de instrucciones utilizando operaciones ms potentes.

8.1.

Autoincremento y autodecremento.

El autoincremento se puede utilizar para hacer un recorrido de un array de palabaras. lw $8, S[$19] # $8, = S[$19]. 7

addi

$19, $19, 4

# $19 = $19 + 4.

Estas dos insturcciones podrian sustituirse por la siguiente: lw+ $8, S[$19] # $8, = S[$19] $19 = $19 + 4.

El auto decremento se utiliza en progarmas que recorren la memoria en direccin contraria. Este mtodo tambin es muy utilizado en las pilas.

8.2.
lw addi

Operandos basados en memoria para operaciones.


$8, A[$19] $16, $17, $8 # $8 = A[$19]. # $16 = $17 + A[i].

Estas dos instrucciones podran sustituirse por la siguiente: addm $16, $17, S[$19] # $16 = $17 + A[$19 + A].

En esta instruccin se combinan instrucciones de carga con instrucciones aritmticas.

9.

Ejemplo de aplicacin.
En este ejemplo pasaremos un procedimiento (swap) escrito en C a lenguaje ensamblador.

swap(int v[ ], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } Este procedimiento intercambia dos variables. Para pasar de C a lenguaje ensamblador se sugiere seguir los siguientes pasos. 1. Asignar registros a las variables del programa. 2. Hacer un cdigo para el cuerpo del procedimiento. 3. Guardar los archivos en la invocacin a procedimientos. Asignacin de parmetros: Para asignar los parmetros v y k utilizamos los registros $4 y $5, asignados por los MIPS para esto. Para la variable temp se utiliza el registro temporal $15. 8

Cdigo para el cuerpo: temp = v[k]; v[k] = v[k+1]; v[k+1] = temp;

Debido a que las direcciones de los MIPS se referencian en bytes y cada palabra contiene 4 bytes, por esto tenemos que multiplicar el ndice k por 4 antes de sumarlo a la direccin y despes incrementamos v[k] en 4 para obtener v[k+1]. muli add lw lw sw lw $2, $5, 4 $2, $4, $5 $15, $16, $16, $15, 0($2) 4($2) 0($2) 4($2) # # # # # # # Registro $2 = k*4. Registro $2 = v + k. $2 = v[k]. Registro $15 (temp) = v[k]. Registro $16 = v[k+1]. Referencia al siguiente elemento de v. v[k] = $16. v[k+1] = $15 (temp).

Por ltimo solo queda guardar los registros de la invocacin a procedimientos. Utilizamos el convenio guardar invocado callee save. Como estamos utilizando los registros $2, $15, y $16, guardamos estos registros con sus valores originales en la pila. Como ya sabemos el registro $29 es el puntero de la pila y lo tenemos que ajustar a 12 o 3 x 4 ya que son tres palabras que vamos a preservar. addi $29, $29, -12

El signo negativo se debe a que para que la pila crezca desde las direcciones ms elevadas a las ms bajas. Los guardamos de la siguiente manera: sw sw sw $2, 0($29) $15, 4($29) $16, 8($29) # guarda en la pila el registro $2. # guarda en la pila el registro $15. # guarda en la pila el registro $16.

Al nal del procedimientos restauramos los tres registros y se ajusta la pila en otra direccin. Como este procedimiento no llama a otros procedimientos nos evitamos guardar restaura las direcciones de vuelta en el registro $31. Para terminar este procedimiento colocamos en la ltima linea la siguiente instruccin: jr $31 # Vuelve a la rutina que invoca.

Potrebbero piacerti anche