Unidad 2 / Escenario 3 Lectura fundamental Conjunto de instrucciones (ISA – Instruction Set Architecture) Contenido 1 2 3 4 5 6 7 8 MIPS Microprocessor without Interlocked Pipeline Stages Qué es el conjunto de instrucciones Tipos de Instrucción Registros Modos de Direccionamiento Traducción de ensamblador a máquina Herramienta de simulación: MARS Breve introducción a la aritmética para procesadores Palabras clave: set de instrucciones (ISA), lenguaje ensamblador, procesador, lenguaje de máquina. Diariamente se utilizan sistemas de cómputo para apoyar tareas en diversos (si no todos) campos. Desde la ingeniería, hasta la agricultura. Gracias a las interfaces de usuario amigables, estas tareas se realizan de forma casi trivial, de forma que los usuarios aprenden rápidamente utilizar nuevos dispositivos o aplicaciones. A través de esta lectura se presenta una introducción a qué pasa en el sistema de cómputo para que sea capaz de traducir un conjunto de pasos de un algoritmo, en operaciones ejecutables por el hardware del computador. Esta introducción ayudará a responder: ¿Cómo el hardware de estos dispositivos entiende nuestras órdenes? ¿Cómo un computador recibe y ejecuta tareas? Adicionalmente, este espacio permitirá entender cómo se traduce una instrucción a un conjunto que 1s y 0s que el hardware del computador pueda interpretar y ejecutar. 1. MIPS Microprocessor without Interlocked Pipeline Stages En este módulo se estudiará una de las arquitecturas más populares en la actualidad: aquella en la que la memoria de datos sólo se puede acceder a través de instrucciones de lectura y escritura load/ store. Específicamente, se estudiará esta arquitectura desde un caso particular: MIPS corresponde a la sigla de Microprocessor without Interlocked Pipeline Stages (Microprocesador sin etapas de pipeline bloqueadas). Su nombre se debe a que, en esta arquitectura, las instrucciones se ejecutan por etapas en el procesador. Adicionalmente, estas etapas no dependen unas de otras y todas las instrucciones se ejecutan pasando por todas las etapas. A este mecanismo de ejecución de instrucciones se le denomina. El pipeline permite un paralelismo a nivel de instrucción. La razón es que más de una instrucción se puede ejecutar a la vez, siempre y cuando estén en diferentes etapas. En la Figura 1 se muestra un ejemplo. En la parte superior de la imagen se ejecuta el proceso de lavar la ropa (que representa, como un recurso ilustrativo, una instrucción) sin aprovechar el pipeline, y en la parte inferior, aprovechando el pipeline. De acuerdo con la imagen, lavar la ropa se hace en 4 etapas: lavado, secado, planchado y guardado. Sin aprovechar el pipeline, cada “tanda” (instrucción) pasa por las 4 etapas, y solo hasta que se acaben las todas las etapas, inicia la siguiente “tanda” (instrucción). Aprovechando el pipeline, la “tanda” uno inicia, y tan pronto pasa la primera etapa, inicia la segunda “tanda”: mientras la primera se encuentra en secado, la segunda está en la etapa de lavado. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 2 Así, sin pipeline 4 “tandas” (equivalentes a las instrucciones) se ejecutan en 8 horas. Con pipeline, las mismas 4 “tandas” se realizan en 3 horas y media. Al pipeline se le denomina paralelismo a nivel de instrucciones y se verá con más detalle en la Unidad 4. Figura 1. Proceso de lavado de ropa Fuente: elaboración propia Se ha seleccionado MIPS como la arquitectura a ser estudiada porque se basa en un conjunto de características y principios de diseño que facilitan el aprendizaje de la arquitectura del computador. Una de las características es la simplicidad; por ejemplo: todas las instrucciones tienen el mismo tamaño que es, además, el mismo tamaño de los datos: 32 bits para MIPS32 y 64 bits para MIPS64. Figura 2. Tipos de Arquitectura MIPS: MIPS32 y MIPS64 Fuente: elaboración propia POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 3 Los principios de diseño de MIPS son (Hennessy & Patterson, 2000): • La simplicidad favorece la regularidad. Que se ve reflejado en el hecho de que todas las instrucciones tengan el mismo tamaño, todas las instrucciones pertenezcan a alguno de tres grandes tipos y todas las instrucciones de un mismo tipo tengan el mismo formato de instrucción. • Si es más pequeño es más rápido. El manejo de registros en MIPS es óptimo. Además, la cantidad de registros coincide con el tamaño de las instrucciones, facilitando también la regularidad. El usar registros para almacenar los datos más inmediatos, ayuda a que el procesador sea más rápido. A continuación, se define lo que es el conjunto de instrucciones, específicamente ejemplarizando con MIPS. En la siguiente lectura se realizará un repaso por algunas de las secciones de esta lectura, particularizando sobre el proceso de diseño de un conjunto particular, propio, que parte de un reto de diseño. 2. Qué es el conjunto (set) de instrucciones Como se presentó en el escenario 1, la arquitectura del computador estudia cómo un lenguaje de programación se traduce a un conjunto de instrucciones que pueden ser interpretadas y ejecutadas por una interconexión de elementos de hardware. Al conjunto de instrucciones se le denomina ISA (Instruction Set Architecture) y a la interconexión de los elementos de hardware se le denomina microarquitectura. El conjunto de instrucciones representa todas las instrucciones que puede interpretar y ejecutar el hardware. Se distribuyen en diferentes tipos, según su funcionalidad. Algunas orientadas a la ejecución de operaciones aritméticas o lógicas, otras a los saltos condicionales, otras a los saltos incondicionales, etc. Adicionalmente, el conjunto de instrucciones incluye la definición de los registros que se utilizan en el sistema, los modos de direccionamiento y del formato en el que cada tipo de instrucción se traduce a lenguaje de máquina. En las secciones siguientes se detallarán y ejemplificarán cada uno de estos elementos. En la lectura complementaria se puede encontrar una versión del conjunto de instrucciones de MIPS que incluye la definición completada y detallada de las instrucciones, su tipología, los registros que se utilizan, los modos de direccionamiento y las estructuras que definen las tipologías para escribir las instrucciones en formato binario. Es importante aclarar que más que una lectura, este documento es un manual que puede ser consultado cuando sea necesario y que no se debe leer de forma continua. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 4 3. Tipos de instrucción De acuerdo con la documentación de MIPS, las instrucciones de esta arquitectura se agrupan en 3 grandes categorías, de acuerdo con su formato de instrucción: R, I y J. El tipo R (R de registros) corresponde a aquellas instrucciones en la que los datos (operandos y resultados) son almacenados en registros (Por ejemplo las instrucciones aritméticas o las lógicas). Las instrucciones de tipo I (I de inmediato) corresponden aquellas donde el valor con el que se opera viene como parte de la instrucción (equivalente a una constante). Finalmente, las instrucciones tipo J, corresponde a instrucciones que permiten el cambio del flujo del programa, como aquellas usadas en saltos condicionales y aquellas correspondientes a saltos incondicionales (Araújo, Pádua, Andrade, & Correa, 2014). Más allá de los tipos de instrucciones definidos por el formato de instrucción, las instrucciones se pueden agrupar en diferentes categorías, de acuerdo con su utilidad y uso en la implementación de algoritmos. A continuación se presentan en las categorías más generales: 3.1. Aritmético-lógicas Como su nombre lo indica, corresponden a todas aquellas que reciben 3 parámetros: 2 indicando los operandos y 1 indicando el resultado, y adicionalmente aplican una operación aritmética o lógica. Por ejemplo: add $s0, $s1, $s2 indica que en $s0 se guarde el resultado de sumar (add) $s1 con $s2. 3.2. Artiméticas-inmediatas Son muy similares a las anteriores, pero cambia el modo en el que se direccionan los datos que se van a operar. En las inmediatas los datos a operar son constantes cuyo valor se incluye en la misma instrucción. A diferencia de las anteriores, en las que el valor se almacena en un registro y la instrucción incluye es la dirección del registro. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 5 Por ejemplo: addi $s0, $s1, 127 indica que en $s0 se guarde el resultado de sumar (addi) $s1 con el valor constante 127. En lenguaje ensamblador de MIPS, las constantes están en decimal por defecto. Para escribirlas en binario, hay que antecederlas con 0b y en hexadecimal con 0x. 3.3. De transferencia de datos Permiten, en esencia, comunicar los registros con la memoria RAM, de manera que se puedan cargar datos en los registros desde la memoria RAM (load (Resaltar y poner con un tipografía como de código)) o guardar datos desde los registros hacia la memoria RAM (store (Resaltar y poner con un tipografía como de código)). Por ejemplo: sw $s0,0($s1) indica que se debe guardar (sw) el valor de $s0 en la posición apuntada por $s1(Es decir que $s1 no contiene un valor sino una dirección). El 0 que antecede el ($s1) indica que se debe guardar justamente en esa posición. Si fuera un 4, indicaría que es 4 bytes delante de la dirección apuntada por $s1, o un 8, indicaría 8 bytes delante de la dirección apuntada por $s1. En MIPS el valor que antecede el registro que apunta la dirección debe ser una constante numérica (como en el ejemplo que es 0). POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 6 3.4. Salto 3.4.1. Condicionales Permiten ir a una línea de código de acuerdo con una condición. Por ejemplo: beq $s0, $s1, fin Compara si $s0 es igual a $s1 y si lo es, salta a la línea etiquetada con fin. 3.4.2. Incondicionales Permiten moverse entre distintas líneas del código, saltando de una línea a otra sin depender de una condición. Por ejemplo: j for Permite saltar a la línea de código que tenga la etiqueta “for” (Resaltar y poner con un tipografía como de código). 3.4.3. Comparación Son muy similares a las aritmético-lógicas. Se encargan de poner un registro en 1 o 0 en caso de que se cumpla una condición. Por ejemplo: slt $s0,$s1, $s2 pone en 1 el registro $s0 en caso de que $s1 sea menor que $s2. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 7 4. Registros Los registros son espacios de memoria de datos, tipo RAM, que se comunican directamente con la ALU (Unidad Lógico-Aritmética). Esto simplifica la estructuración de las instrucciones y aumenta la velocidad con la que se ejecutan las operaciones. En general, los registros se usan para almacenar datos, pero existen algunos de propósito específico que se usan para almacenar direcciones o apuntadores. En la Tabla 1 se presentan los 32 registros de la arquitectura MIPS. El registro $zero sirve de constante nula: es un registro de sólo lectura que siempre vale cero (0). Los registros $s0 a $s7 sirven para almacenar datos, tipo variables o direcciones de la memoria RAM cuando se usan para almacenar apuntadores a arreglos, matrices y otras estructuras. Los registros $t0 a $t9 se usan de forma similar a los $s, pero por convención se prefieren para datos temporales, de cálculos parciales, cuyo valor no tenga que mantenerse por mucho tiempo. Los registros $a0-$a3, $v0-$v1, $ra se utilizan para las funciones, los $a para enviarlos como parámetros, los $v para retorno y el $ra para la dirección de memoria de programa a la que debe retornar cuando se acabe la función. Los demás registros son de propósito específico: $sp como apuntador de pila, $fp como apuntador de frame o sección, $gp como apuntador global. Tabla 1. Registros de la arquitectura MIPS Nombre # del Uso $zero registro 0 Constante 0 $v0 - $v1 2-3 Valores para resultados y evaluación de expresiones $a0 - $a3 4-7 Argumentos $t0 - $t7 8-15 Temporales $s0 - $s7 16-23 Variables $t8 - $t9 24-25 Más temporales $gp 28 Global pointer $sp 29 Stack pointer $fp 30 Frame pointer $ra 31 Dirección de retorno Fuente: elaboración propia POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 8 5. Modos de Direccionamiento El direccionamiento, en la arquitectura del computador, se refiere a la forma en que se acceden los datos que van a ser operados o que se requieren para ejecutar una instrucción. En MIPS, existen los siguientes modos de direccionamiento: Registro-Indirecto, Desplazamiento, Índice base, Memoriaindirecto, Auto-incremento, Auto-indexación, Escalado, Relativo al PC (Contador de programa) (Martin & Roth, n.d.). 5.1. Directo a registro: En este modo de direccionamiento se incluye en la instrucción la dirección del registro que se desea acceder, como fuente o como destino. Por ejemplo: add $s1, $s2, $s3 Equivale a $s1=$s2+$s3 de manera que se envían como parámetros de la instrucción las direcciones de los registros $s1 (destino), $s2 (fuente) y $s3 (fuente). Figura 3. Direccionamiento directo a registro Fuente: elaboración propia 5.2. Indirecto a registro: En este tipo modo de direccionamiento se incluye la dirección de un registro y un desplazamiento. El dato que se usa como operando es el que se encuentre en una posición de la RAM equivalente a la suma del apuntador del registro más el desplazamiento en la instrucción. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 9 Por ejemplo: lw $s3, 4($s2) Indica que en el registro $s3 (destino) se va a guardar (load - lw) lo que esté en la posición de la memoria RAM a la que apunte ($s2+4). Figura 4. Direccionamiento indirecto a registro Fuente: elaboración propia 5.3. Relativo a PC (Contador de programa): En este caso, el operando corresponde a una dirección de la memoria de programa y resulta de la suma entre el valor actual del contador de programa y una constante que viene en la instrucción. Por ejemplo: beq $s1,$s2,for Esta instrucción salta a la línea del programa con etiqueta for cuando $s1 es igual a $s2. Como las direcciones de programa son largas, no se guarda la dirección completa con etiqueta for, sino la distancia entre la línea actual y la línea for (el desplazamiento). Figura 5. Direccionamiento relativo a PC Fuente: elaboración propia POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 10 5.4. Inmediato El modo de direccionamiento inmediato se refiere a aquellas instrucciones en los que uno de los operandos es un valor constante que viene dentro de la instrucción. Por ejemplo: addi $s6, $s7, 8 Corresponde a $s6=$s7+8 donde 8 sería direccionado de forma inmediata por ser una constante que haría parte de la instrucción. Figura 6. Direccionamiento relativo a PC Fuente: elaboración propia 5.5. Pseudodirecto: Se utiliza cuando se requiere una dirección del contador de programa absoluta. Funciona de manera que en la instrucción viene un valor constante que representa la dirección. A este número se le desplaza dos posiciones a la izquierda (lo multiplica por 4 - en binario) y luego lo concatena con los 4 bits más significativos del valor actual del contador de programa. Este resultado es el nuevo valor del contador de programa. Por ejemplo: j 2100 Salta a la posición 2100*4=8400 concatenada con los bits más significativos del valor de la posición actual. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 11 Figura 7. Direccionamiento pseudodirecto Fuente: elaboración propia 5.6. Implícito: Es el menos común de los modos de direccionamiento. Corresponde al direccionamiento el operando es determinado por el código de operación. Por ejemplo: jal 2500 Que salta a la posición 2500*4 y adicionalmente almacena la dirección del contador de programa actual en el registro $ra. Figura 8. Direccionamiento implícito Fuente: elaboración propia POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 12 6. Traducción de ensamblador a máquina Cada una de las instrucciones, según su tipo, tiene un formato de instrucción que define cómo se debe codificar desde el compilador y cómo el hardware la decodifica. A continuación se presenta cómo son los principales formatos de instrucción y a qué corresponde a cada uno de los elementos que conforman su estructura. En MIPS, todas las instrucciones tienen el mismo tamaño (32 bits), independiente de su tipo. Si una instrucción requiere menos de los 32 bits, los restantes se llenan con información basura, que nunca es usada por el hardware y por lo tanto no importa si su valor es 0 o 1. Instrucciones tipo R Se refiere a las instrucciones aritmético-lógicas. Los 6 bits más significativos corresponden a un código de operación. Los 5 bits siguientes (del 26 al 22) corresponden al registro fuente 1, los 5 siguientes (del 21 al 17) se refieren al segundo registro fuente. Los bits del 16 al 12 corresponden a la dirección del registro destino. Los últimos bits se utilizan en algunas funciones para el desplazamiento o especificar el código de operación. Instrucciones tipo I Integra las instrucciones de referencia a memoria, aritméticas (inmediatas) y de salto condicional. Los 6 bits más significativos corresponden a un código de operación. Los 5 bits siguientes (del 26 al 22) corresponden al registro fuente 1, los 5 siguientes (del 21 al 17) se refieren a la dirección del registro destino. Los últimos bits se utilizan para un valor constante. Instrucciones tipo J Corresponde a las instrucciones de salto incondicional. Los 6 bits más significativos corresponden a un código de operación. Los últimos bits se utilizan para un valor constante que representa una dirección. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 13 7. Herramienta de simulación: MARS La herramienta de simulación MARS permite realizar la programación de algoritmos usando las instrucciones de MIPS. En la simulación se puede ejecutar instrucción por instrucción, viendo el estado de los registros, de la memoria de programa y de la memoria RAM tras la ejecución de todo un programa o de cada instrucción. Se puede descargar para realizar el siguiente algoritmo en MIPS. Para que se pueda interactuar con la herramienta de simulación, se propone implementar un algoritmo en el que se guarden (en la RAM, a manera de arreglo) los divisores de un número n guardado en un registro (para el ejemplo $s0). En las Figuras 9 y 10 se presentan, respectivamente, el algoritmo en lenguaje de alto nivel y en lenguaje ensamblador MIPS. Figura 9. Algoritmos de alto nivel Fuente: elaboración propia POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 14 Figura 10. Algoritmos de alto nivel Fuente: elaboración propia 8. Breve introducción a la aritmética para procesadores La aritmética del procesador se refiere a la manera en que se realizan las operaciones aritméticas dentro del procesador. Esta definición incluye lo que sucede cuando hay un desbordamiento en la suma o la resta, cómo se manejan los productos teniendo en cuenta que la multiplicación requiere el doble de bits para el resultado que los bits que tienen los operandos, cómo se maneja el cociente y el residuo en una división, cómo se representan y operan los números reales, entre otros. En la lectura complementaria del escenario 3, podrás leer más acerca de la aritmética del procesador. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 15 Referencias MIT –Software MARS Recuperado de: http://courses.missouristate.edu/KenVollmar/mars/ Mayo de 2017 Patt, Y. (2001). Requirements, bottlenecks, and good fortune: agents for microprocessor evolution. Proceedings of the IEEE, 1553 - 1559. Patterson, D., Hennessy L. (1994) Computer Organization and Design: the Hardware/Software Interface. Editorial MK. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 16 INFORMACIÓN TÉCNICA Módulo: Arquitectura del Computador Unidad 2: ISA: Instruction Set Architecture y Aritmética para procesadores. Escenario 3: Conjunto de Instrucciones (ISA – Instruction Set Architecture) Autor: Laura Juliana Cortés Rico Asesor Pedagógico: Edwin Alcides Mojica Quintero Diseñador Gráfico: Carlos Montoya Asistente: Ginna Quiroga Este material pertenece al Politécnico Grancolombiano. Por ende, es de uso exclusivo de las Instituciones adscritas a la Red Ilumno. Prohibida su reproducción total o parcial. POLITÉCNICO GRANCOLOMBIANO POLITÉCNICO GRANCOLOMBIANO 17