Tema 2: Arquitectura del repertorio de instrucciones Visión del computador que tiene el programador en bajo nivel. Lo que el programador en lenguaje ensamblador (bajo nivel) debe conocer para escribir programas: - Tipos y formatos de las instrucciones. - Los registros del procesador. - Los tipos de operandos. - Los modos de direccionamiento. (Última modificación el 05/03/07) 1 2. Arquitectura del repertorio de instrucciones (ISA) 2.1 Introducción (diseño del ISA; cómo es una instrucción) 2.2 Los registros (del procesador) 2.2 Tipos de instrucciones (qué operaciones) 2.3 Tipos de operandos 2.4 Modos de direccionamiento (especificación de los operandos) 2.5 Formato de las instrucciones (codificación binaria) 2.6 Resumen de la ISA de la MIPS 2 2.1 Introducción Diseño del ISA Es un nivel complicado de diseñar, ya que hay que tener en cuenta: El software (LANs) que tiene que soportar. La estructura del hardware que lo soportará. Es la conexión entre ambos niveles: lenguaje que ambos tienen que entender. 3 Es un punto de encuentro del diseñador de la estructura y el programador a bajo nivel del computador (o el escritor del compilador): - El diseñador de la estructura ve el nivel ISA como la funcionalidad que ésta debe dar al programador. - El programador se hace consciente de la estructura definida por el diseñador: cómo usar los registros, qué operaciones tiene la ALU, cómo accede a memoria y qué tipos de datos tiene. Objetivo común de los diseñadores de computadores: – Encontrar un lenguaje que haga fácil la construcción del hardware y del software (el compilador). – Maximizar el rendimiento y minimizar el coste. 4 Características de las instrucciones de bajo nivel Los programas en este nivel se expresan en lenguaje ensamblador, swap:muli $2, $5,4 add $2, $4,$2 lw $16, 4($2) sw $16, 0($2) jr $31 , y son traducidos a lenguaje máquina. 00000000101000010000000000011000 00000000100011100001100000100001 10001100011000100000000000000000 10101100011000100000000000000100 00000011111000000000000000001000 5 El lenguaje máquina, lo interpreta y ejecuta directamente el hardware del computador: Está formado por instrucciones simples: órdenes que el procesador puede interpretar y ejecutar. 6 Una instrucción de bajo nivel debe contener toda la información necesaria para ser ejecutada. Tipos de instrucciones: una instrucción de este nivel especifica una orden individual al procesador para: (1) procesar datos, o (2) controlar la secuencia de ejecución de las instrucciones. (1) Una instrucción de este tipo debe especificar: (i) El proceso de datos a realizar. (ii) Los datos a procesar. (2) Una instrucción de este tipo debe especificar: (i) La dirección de la siguiente instrucción a ejecutar (destino del salto). (ii) La condición, si la hay, para el cambio de secuencia. 7 (1) Las instrucciones para procesar datos deben especificar el proceso de datos a realizar y los datos a procesar: (i) El proceso de datos es básico, el que puede llevar a cabo la estructura del procesador: (a) Una operación aritmética o lógica (de la ALU): suma, resta, AND, OR, desplazamiento… (b) Un movimiento de datos entre registros y/o memoria. (ii) Los datos, estarán en registro o en memoria: (a) Se denominan operandos: habrá que especificar los dos operandos fuente (con los que se opera) y el destino (resultado de la operación). (b) Habrá que especificar la fuente y el destino del movimiento de los datos. 8 Veamos una instrucción de cada tipo del procesador MIPS: (1) Proceso de datos: (i) Operación aritmética o lógica: Suma add rd, rs, rt Poner la suma de los registros rs y rt en el registro rd. AND and rd, rs, rt Poner el Y lógico de los registros rs y rt en el registro rd. (ii) Movimiento de datos. Carga palabra lw rt, address Carga la palabra (32 bits) en la dirección de memoria address en el registro rt. Almacena palabra sw rt, address Almacena la palabra en el registro rt en la dirección de memoria address. 9 (2) Control de secuencia: Bifurcación si igual beq rs, rt, label Salta condicionalmente a la instrucción especificada por label si el registro rs es igual al registro rt. Salto j target Salta incondicionalmente a la instrucción en target. 10 Sintaxis típica de una instrucción en lenguaje ensamblador Ejemplo: Lenguaje ensamblador del procesador MIPS R2000/3000 4 campos básicos: etiqueta, nemónico de la instrucción, operandos (2 fuentes y 1 destino) y comentarios (opcional) 11 Fíjate que el número de operandos fuente de una instrucción aritmética como la suma son dos. Esto permite tener una ALU más sencilla. Para evaluar expresiones aritméticas que aparecen en los lenguajes de alto nivel (LAN) habrá que ejecutar varias instrucciones aritméticas de bajo nivel. Ejemplo: la sentencia de alto nivel a=b+c+d+e se implementa con la secuencia de instrucciones de bajo nivel: add a, b, c add a, a, d add a, a, e Esto es un ejemplo de la diferencia de nivel de abstracción de un LAN y un lenguaje ensamblador ó máquina (1 instrucción de alto nivel equivale a 3 instrucciones de bajo nivel). 12 2.2 Los registros Pequeña memoria rápida en el procesador para almacenamiento temporal de información. Su número y función varían entre los distintos diseños de arquitecturas del repertorio de instrucciones. Hoy en día, casi todas las arquitecturas son de registros de propósito general: conjunto de registros manejables por el programador, para contener operandos y especificar direcciones de memoria. Históricamente existieron otras arquitecturas con otro tipo de almacenamiento temporal: - De pila. - De acumulador. 13 Tipos de arquitecturas del repertorio de instrucciones según el tipo de almacenamiento temporal para los operandos: Almacenamiento Ejemplos temporal 1. Pila HP 3000 2. Acumulador PDP-8 Motorola 6809 3. Conjunto de IBM 360 registros DEC VAX,MIPS Operandos explícitos 0 1 Operando destino en … Pila Acumulador 2ó3 Registros o memoria Dónde están los operandos, en los distintos tipos de arquitectura: - de pila: implícitamente en la cima de la pila (memoria). - de acumulador: implícitamente uno de los fuente y el destino en el registro acumulador y el otro fuente en memoria. - de registros: en registros o posiciones de memoria (2 ó 3 operandos explícitos). 14 Las arquitecturas de registros dominan hoy día. Ventajas: - Los registros son fáciles de usar por el compilador, pueden ser asociados con las variables, con lo que se consigue: • una disminución del tiempo de ejecución: reducción del tráfico con memoria (los registros son más rápidos). • una mejor densidad de código: menos bits son necesarios para especificar un registro que una dirección de memoria. 15 Veamos una atendiendo a: clasificación de las arquitecturas de registros (1) El número de operandos (2 ó 3) que se especifican explícitamente las instrucciones aritmético-lógicas. Si se especifican dos operandos, uno de ellos es fuente y destino. (2) El número de operandos que pueden estar en memoria en las instrucciones aritmético-lógicas (de 0 a 3). 16 Las posibles combinaciones de estas 2 características son: Máximo número de operandos explícitos por instrucción ALU (1) 2 3 2 Número de operandos que pueden estar en memoria por instrucción ALU (2) 0 0 1 2 3 2 3 Ejemplos IBM RT-PC SPARC, MIPS PDP-10, Motorola 68000, IBM 360 PDP-11 VAX 17 Registros del procesador Son de dos tipos: (1) Visibles al programador en lenguaje ensamblador: puede ser utilizados explícitamente en una instrucción. (2) De control y de estado, usados por: (a) La unidad de control para controlar el funcionamiento de la CPU: proceso de instrucciones y accesos a memoria. (b) El SO para controlar la ejecución de los programas. 18 (1) Registros manejables por el programador: Junto con la ALU forman el camino de datos. Se utilizan para contener los operandos de las instrucciones máquina o para especificar una dirección de memoria. Pueden ser referenciados explícitamente en las instrucciones máquina. Por ejemplo en la MIPS se referencian por un número: add $9, $17, $2 ó lw $16, 4($2) 19 Los compiladores pueden usarlos para asociarlos con variables y disminuir el tráfico con memoria. El ejemplo anterior (a=b+c+d+e) add a, b, c add a, a, d add a, a, e en realidad se implementa asociando las variables con registros: a - $8, b - $9, c - $10, d - $11, e - $12, de forma que el compilador generaría: add $8, $t9, $10 add $8, $8, $11 add $8, $8, $12 20 Cuestiones de diseño de los registros manejables por el programador: (a) Respecto al uso que le puede dar el programador: (1) De propósito general: pueden contener datos y especificar direcciones (MIPS). (2) De datos: sólo pueden contener datos. (3) De dirección: sólo para especificar direcciones (modos de direccionamiento indirecto ó base+desplazamiento). (b) Número de registros: La experiencia dice que entre 8 – 32 Menos Æ no suficientes para contener variables Æ muchas referencias a memoria. Más Æ no reduce notablemente las referencias a memoria y aumenta la longitud de las instrucciones (más número de bits para especificar los registros). 21 (c) Tamaño de los registros: Habrá que decidir si todos los registros tienen el mismo tamaño (MIPS) o no. (1) Los que han de contener direcciones, lo suficientemente largos para contener direcciones completas. (2) Los que han de contener datos, lo suficientemente largos para contener la mayoría de los tipos de datos: una palabra (tamaño habitual de los datos a procesar). 22 (2) Registros de control y estado del funcionamiento de la CPU: En la mayoría de las máquinas, no son manejables por el programador. Algunos lo serán mediante instrucciones ejecutadas en modo supervisor (control del SO). (a) Registros de control: (1) Contador de programa: contiene la dirección de la instrucción a ejecutar. (2) Registro de instrucción: contiene la instrucción a ejecutar. (3) Registro de dirección de memoria: contiene la dirección de una posición de memoria a ser leída o escrita. (4) Registro de buffer de memoria: contiene la palabra de datos a escribir en memoria o que ha sido leída. 23 En esta figura vemos los registros de control. 24 (b) Registro de estado (del programa en ejecución) Contiene los códigos de condición y otra información de estado. (i) Los códigos de condición (indicadores o ‘flags’) son valores binarios (bits) que especifican si se ha producido una determinada circunstancia en una operación ALU. Pueden ser de signo, cero, acarreo, overflow… Son utilizados implícitamente en las instrucciones de salto condicional. (ii) Además de los códigos de condición la palabra de estado puede contener bits para: (1) Habilitación/deshabilitación de interrupciones. (2) Modo supervisor/usuario (de funcionamiento de la CPU). 25 Ejemplos de organización de registros: 2 microprocesadores contemporáneos (1978):Motorola MC68000, Intel 8086. 26 Motorola MC68000: Registros de 32 bits: 8 de datos y 9 de dirección: (1) Los de datos: También se usan como registros índice (un modo de direccionamiento). Permiten operaciones con 8,16 y 32 bits según determine el código de operación (MIPS). (2) Los de direcciones: A7 y A7’ punteros de pila para usuarios y para SO respectivamente. (3) Contador de programa de 32 bits y registro de estado de 16. Decisiones de diseño: (1) Repertorio de instrucciones regular sin registros de uso especial. (2) División en dos grupos, ahorro de 1 bit (compromiso razonable entre generalidad total y código más compacto). 27 Intel 8086 Enfoque diferente en la organización de los registros: cada registro tiene un uso particular aunque algunos pueden tener uso general. 4 registros de datos de 16 bits, direccionables también como bytes. Uso general en algunas instrucciones e implícito en otras, p.e. la multiplicación usa siempre el acumulador. Registros de segmento uso dedicado e implícito, apuntan a los segmentos de datos, código y pila (base + desplazamiento). Los índice implícitos en algunas operaciones: contienen desplazamientos dentro de cada segmento(base + desplazamiento). Decisiones de diseño: codificación compacta Æ flexibilidad reducida. 28 Intel 80386 Microprocesador de 32 bits, diseñado como una ampliación del 8086 (16 bits). Conserva la organización de registros original integrada en la nueva organización Æ proporciona compatibilidad ascendente para los programas del 8086. Tuvieron que limitar la flexibilidad al diseñar la organización de los registros. El Pentium tiene la misma organización de registros que el 386. 29 Características del banco de registros del MIPS R2000 30 (1) Banco de registros de propósito general: 32 Registros de 32 bits (CPU). Se identifican como $0 a $31. Ejemplo: add $2, $3, $4 ($2=$3+$4) El registro $0 tiene permanentemente el valor 0. (2) Dos registros especiales de 32 bits (CPU): HI y LO: almacenan los resultados de multiplicaciones y divisiones. (3) Banco de registros de reales (FPU) 32 registros de 32 bits que puede utilizarse como: - 32 registros de 32 bits con formato IEEE 754 de simple precisión. Se identifican por $f0, $f2, $f4, …, $f30. - 16 registros de 64 bits con formato IEEE 754 de doble precisión. Se identifican por $f0, $f2, $f4, …, $f30. 31 Convención en el uso de los registros en la MIPS. Nombre del registro zero at v0 v1 a0 a1 a2 a3 t0..t7 s0..s7 t8, t9 k0, k1 gp sp fp ra Número Uso 0 1 2 3 4 5 6 7 8..15 16..23 24, 25 26, 27 28 29 30 31 Constante 0 Reservada para ensamblador Para devolver resultados de funciones “ Argumento 1 a una rutina Argumento 2 “ Argumento 3 “ Argumento 4 “ Temporal (no se guarda valor entre llamadas) Temporal (el valor se guarda entre llamadas) Temporal (no se guarda valor entre llamadas) Reservado para el kernel del sistema operativo Puntero al área global (apunta al bloque de datos) Puntero de pila Puntero de marco de pila Dirección de retorno, usado por llamadas a rutina 32 Esta es la visión de los registros de la MIPS que nos da el PCSpim. 33