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 debe conocer para escribir programas: (1) Los registros del procesador (2) Tipos de instrucciones (3) Tipos de operandos (4) Modos de direccionamiento (5) Formato de las instrucciones 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 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. Al hacerlo, hay que tener en cuenta: El software (compilador de 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 de el 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 usa 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 Cómo es una instrucción Los programas se escriben en lenguaje ensamblador. swap:muli $2, $5,4 add $2, $4,$2 lw $16, 4($2) sw $16, 0($2) jr $31 El lenguaje ensamblador es ‘equivalente’ al 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 (máquina) simples. Una instrucción máquina especifica una procesamiento de datos que debe realizar el procesador. 6 Según el tipo, una instrucción especifica: - Una operación aritmética o lógica a realizar sobre uno o dos datos para obtener un resultado. Este tipo de instrucciones se realiza en el camino de datos: la ALU opera con datos en el banco de registros (fuentes) y el resultado se almacena en el banco de registros (destino). - Una transferencia de un dato desde una posición de memoria o registro (fuente) a un registro o posición de memoria (destino). Este tipo de instrucciones implican un acceso a memoria. - Un ruptura de la secuencia de ejecución de las instrucciones. Este tipo de instrucciones se realiza en el camino de datos: se carga un valor en el contador de programa. 7 Sintaxis típica de una instrucción en lenguaje ensamblador Ejemplo de la MIPS Cuatro campos básicos: etiqueta, nombre de la instrucción, operandos destino y fuente(s) y comentarios: En el simulador aparecen las instrucciones máquina: 8 2.2 Los registros Es un pequeña memoria rápida en el procesador para almacenamiento temporal de datos. 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 con registros de propósito general. En éstas, existe un conjunto de registros manejables libremente por el programador. Este no es el único tipo de arquitectura, veamos qué tipos de arquitectura hay en función de cómo se pueden especificar en una instrucción los operandos: 9 Tipos de arquitecturas del repertorio de instrucciones Una primera clasificación (histórica) según almacenamiento temporal para los operandos. el tipo de Esto determina el número de operandos explícitos por instrucción Almacenamiento Ejemplos temporal 1. Pila HP 3000 PDP-8 2. Acumulador Motorola 6809 IBM 360 3. Conjunto de DEC registros VAX, MIPS Operandos explícitos 0 Operando destino en … Pila 1 Acumulador 2ó3 Registros o memoria 10 Dónde están los operandos para las instrucciones aritméticas en los distintos tipos de arquitectura: - Arquitectura de pila: todos en memoria (en la pila). Ningún operando explícito en la instrucción. - Arquitectura de acumulador: uno de los fuente y el destino en el registro acumulador y el otro fuente en memoria. El operando en memoria explícito. - Arquitectura de registros: en registros o posiciones de memoria. Dos (uno será fuente y destino) o tres operandos explícitos. Según el tipo de arquitectura de registros: (i) Se podrá hacer operaciones ALU con datos en memoria. (ii) Habrá que cargarlos en registros para operar con ellos. 11 Veamos las instrucciones de transferencia y suma para cada una: Pila Estructura LIFO: el registro puntero de pila (SP) ‘apunta’ (contiene la dirección de) al último elemento puesto en la pila. - PUSH dir = SP Å SP+1 , M[SP] Å M[dir] (2 accesos a memoria) - POP dir memoria) = M[dir] Å M[SP] , SP Å SP-1 (2 accesos a - ADD = SP Å SP-1 , M[SP] Å M[SP+1] + M[SP] (3 accesos a memoria) 12 Acumulador - LOAD dir = AC Å M[dir] (1 acceso a memoria) - STORE dir = M[dir] Å AC (1 acceso a memoria) - ADD dir = AC Å AC + M[dir] (1 acceso a memoria) Registros - LOAD reg, dir = reg Å M[dir] (1 acceso a memoria) - STORE reg, dir = M[dir] Å reg (1 acceso a memoria) - ADD reg_dest, reg_f1, reg_f2 = reg_dest Å reg_f1 + reg_f2 (no hay accesos a memoria) 13 Veamos cómo se traduciría la secuencia de código C = A + B para las 3 clases de arquitectura: (A, B y C son variables y se almacenan en memoria) Pila PUSH dirA PUSH dirB ADD POP dirC Acumulador LOAD dirA ADD dirB STORE dirC Registro LOAD R1,dirA LOAD R2,dirB ADD R3,R1,R2 STORE R3,dirC 4 instrucciones 9 accesos a memoria 3 instrucciones 3 accesos a memoria 4 instrucciones 3 accesos a memoria ¿Cómo sería para D = A + B +C? 14 Veamos las ventajas e inconvenientes de cada una: (1) Pila Ventaja: Instrucciones aritméticas cortas (no se especifican operandos). Inconveniente: Muchos accesos memoria. (2) Acumulador Ventaja: Menos accesos a memoria. Inconveniente: Instrucciones aritméticas más largas, se especifica un operando en memoria. (3) Registros (la mayoría hoy en día) Ventajas: Menos accesos a memoria e instrucciones más cortas (se especifican tres operandos en registro). 15 Registros del procesador Son de dos tipos: (1) Visibles al programador en lenguaje ensamblador. Serán especificados explícitamente en una instrucción. (2) De control y de estado, no pueden ser especificados explícitamente en una instrucción, son usados por: (a) La unidad de control para el procesamiento de instrucciones y los accesos a memoria. (b) El sistema operativo para controlar la ejecución de los programas. 16 (1) Registros manejables por el programador: Junto con la ALU forman el camino de datos Se utilizan para contener los operandos de las instrucciones aritméticas o para especificar una dirección de memoria. Son especificados explícitamente en las instrucciones. Por ejemplo en la MIPS mediante un número: add $9, $17, $2 ó lw $16, 4($2) 17 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 son suficientes para contener variables lo que implica 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). 18 (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 largo 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. A menudo es posible usar dos registros de datos contiguos como uno solo para contener valores de doble longitud (MIPS: los registros para punto flotante doble precisión). 19 (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 serán manejables por instrucciones ejecutadas en modo supervisor (control del sistema operativo). (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 para 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. 20 En esta figura vemos los registros de control 21 (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 (flags) son bits que especifican si se ha producido una determinada circunstancia en una operación ALU: signo del resultado, resultado igual a cero, acarreo de orden superior, desbordamiento, etc. 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 (E/S). (2) Modo supervisor/usuario (de funcionamiento de la CPU). 22 Características del banco de registros del MIPS R2000 23 (1) Banco de registros de propósito general: 32 registros de 32 bits: se especifican con el símbolo ‘$’ y el número de registro (add $2, $3, $4). El registro $0 contiene invariablemente el valor 0. (2) Dos registros especiales de 32 bits: HI y LO almacenan los resultados de multiplicaciones y divisiones. (3) Banco de registros para números reales: 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 24 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 25 Esta es la visión de los registros de la MIPS que nos da el PCSpim 26