Tema 3: El nivel de lenguaje máquina • Introducción • Modos de direccionamiento • Tipos de instrucciones • Tipos y tamaños de los operandos • Formatos de las instrucciones • Procedimientos • Clasificación de las arquitecturas a nivel de lenguaje máquina • Caso de estudio: – Arquitectura del repertorio de instrucciones del procesador MIPS. Bibliografía básica: [Patt-95], [Henn-93] Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 1 de 64 Introducción • Nivel de lenguaje máquina o nivel ISA: – Interfaz crítico entre el software y el hardware. Nivel más bajo al que se puede programar un computador. Software Arquitectura del repertorio de instrucciones (o nivel ISA) Hardware • Instrucción: Orden primitiva que debe ejecutar el hardware. • Objetivo común de los diseñadores de computadores: – Encontrar un lenguaje que haga fácil la construcción del hardware y del compilador. – Maximizar el rendimiento y minimizar el coste o precio. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 2 de 64 Características del lenguaje máquina • Instrucción: Orden individual que ejecuta el hardware. – Información contenida en una instrucción: • Operación a realizar • Destino del resultado de la operación • Especificación de los operandos • Siguiente instrucción a realizar (implícitamente la siguiente o la que se especifique en instrucciones de ruptura de secuencia). • Las características del lenguaje máquina o nivel ISA de un computador vienen determinadas por: – – – – El repertorio de instrucciones Los modos de direccionamiento (formas de localizar los operandos) La representación y tipos de datos que puede manejar Formato de las instrucciones (modo en el que se codifican) Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 3 de 64 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 (fuentes y destino) y comentarios (opcional). Operandos Etiqueta Instrucción demo: sumai: add addi Destino Fuentes $t1, $s1, $v0 $t5, $s2, 5 carga: lw $s3, Fundamento de Computadores (1º II) # # # 100($zero) # Cap 2: El nivel de lenguaje máquina Comentarios $t1= $s1 + $v0 $t5= $s2 + 5 $s3= M[100+$zero] $zero = 0 siempre! 4 de 64 Modos de direccionamiento • ¿Qué se entiende por modo de direccionamiento? – Las diversas formas que tiene una arquitectura (procesador) de especificar la localización de los operandos (datos) a procesar. • ¿Dónde pueden estar los operandos de una instrucción? – Particularizando para una máquina de registros de propósito general los operandos pueden estar en: • En un registro del procesador: • En la propia instrucción (forma inmediata): • En memoria: add r3,r1,r2 addi r2,r1,4 add r2,r1,M – Dirección efectiva (EA: Effective address): Dirección real de memoria especificada por un modo de direccionamiento. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 5 de 64 Modos de direccionamiento: Ubicación de los operandos • En Registros , en la propia instrucción (inmediato) o en Memoria Procesador Control Registros ; ALU Fundamento de Computadores (1º II) Dirección Memoria Contenido ... [0x00001144] [0x00001148] ... ... [0x00001000] ... ... ... ... Cap 2: El nivel de lenguaje máquina addi $t0, $t1, 9 ; lw $s0,1000($zero) 0x00001998 ; 6 de 64 Modos de direccionamiento: Interpretación de las direcciones de memoria • Convenios para clasificar los bytes de una palabra: – Little Endian: La dirección de un dato es la dirección de la parte menos significativa del dato. – Big Endian: La dirección de un dato es la dirección de la parte más significativa del dato. – Aspecto importante cuando se intercambia información entre distintas máquinas. Little Endian MSB Memoria LSB . 0x44332211 0 Big Endian MSB LSB 0x11223344 0x11 0x22 0x33 0x44 . 2n - 1 55 Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 7 de 64 Modos de direccionamiento: Alineación de los datos en memoria • Algunas arquitecturas exigen que los objetos mayores de un byte estén alineados en memoria. • Definición: – Un acceso a un objeto de tamaño t bytes en el byte de dirección D se alinea si D mod t = 0 (mod: resto de la división D/t). – Es decir, la dirección del objeto debe ser múltiplo de su tamaño en bytes. Objeto Bien alineado Mal alineado Byte 0,1,2,3,4,5,6,.. (nunca) Media palabra 0,2,4,6,8, ... 1,3,5,7, ... Palabra (4 bytes) 0,4,8,... 1,2,3,5,6,7,9,10,11,... Doble palabra 0,8, .. 1,2,3,4,5,6,7,9,10,11,12,13,14,15,.... Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 8 de 64 Red de alineación Ejemplo Memoria bit31 Memoria: bit0 Dirección byte 3 byte 2 byte 1 byte 0 bus bit0 .. . bit31 Contenido 0 Byte 0 1 Byte 1 2 Byte 2 3 Byte 3 4 Byte 4 ... .... Red de alineación bit31 Registro: bit0 byte 3 byte 2 byte 1 byte 0 Procesador Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 9 de 64 Modos de direccionamiento: Tipos más frecuentes Modo Ejemplo Significado Registro add r4,r3 r4 = r3+r4 Inmediato add r4,#5 r4 = r4+5 Directo add r1, (100) r1 = r1+M[100] Base + desplazamiento add r4,28(r1) r4 = r4 + M[28+r1] Indirecto por registro add r2, (r5) r2= r2 + M[r5] Indirecto por memoria add r1, @(r3) r1= r1 + M[M[r3]] Indexado add r3, (r1+r2) r3= r3+M[r1+r2] Autoincremento add r1,(r3)+ r1= r1 + M[r3] r3=r3+d (d:tamaño del elemento) Autodecremento add r1, -(r3) r3=r3-d r1= r1 + M[r3] (d:tamaño del elemento) Escalado o índice add r1, 50(r2)[r3] r1= r1+M[50+r2+r3xd] (d: tamaño del elemento) Ruptura de secuencia Fundamento de Computadores (1º II) Saltos directos, relativos al PC, llamadas a subrutinas, etc.. Cap 2: El nivel de lenguaje máquina 10 de 64 Breve descripción de la arquitectura MIPS Características generales • Máquina de carga-almacenamiento. – Los operandos de las operaciones que realiza la ALU tienen que estar en registros. No pueden estar en memoria. Los datos se tienen que mover a los registros (instrucciones de carga/almacenamiento) para procesarlos. • Repertorio reducido tanto de instrucciones como de tipos de datos. • Todas las instrucciones son de la misma longitud. • Número pequeño de modos de direccionamiento. – 3 para acceso a operandos – 2 para ruptura de secuencia (saltos y bifurcaciones) • Número reducido de formatos de instrucciones. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 11 de 64 Breve descripción de la arquitectura MIPS Registros • 32 registros de 32 bits: $0 - $31. – $1 - $31: Registros de propósito general. – $0: Registro cuyo contenido siempre es 0. • Contador de Programa: PC • 32 registros de punto flotante. – 16 doble precisión (64 bits): – 16 simple precisión (32 bits): F0-F2-....-F30 F0-F2- ...- F30 (direcciones pares) • Registros HI y LO para resultados aritméticos de 64 bits. – HI,LO: 64 bits. Producto aritmética entera (multiplicación) – LO: Cociente y HI: Resto para la división Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 12 de 64 Modos de direccionamiento del procesador MIPS • Sólo 5 modos de direccionamiento: – Registro • add $t0,$s0,$s1 # $t0= $s0 + $s1 – Inmediato • addi $t0,$t1,3 # $t0= $t1 +3 – Base + desplazamiento • lw $t6, 100($s0) # Carga: t6 = M[100+$s0] • sw $t6, 100($s0) # Almacenamiento: M[100+$s0] = t6 – Relativo al contador de programa • beq $t0,$t1,loop # Salto: si ($t0 = $t1) ir a loop – Pseudodirecto • j 1000 Fundamento de Computadores (1º II) # Bifurcación a la posición 1000 (dentro del # segmento actual de 256 Mb) Cap 2: El nivel de lenguaje máquina 13 de 64 Codificación de los modos de direccionamiento • La codificación de los modos de direccionamiento de los operandos depende de: – Número de modos de direccionamiento – Grado de independencia entre modos y códigos de operación • Alternativas para la codificación según el número de modos de direccionamiento que tenga una arquitectura: – Bajo: Codificación en el propio código de operación de la instrucción. Código de operación ........... ............ .......... .......... In – Alto: Utilización de especificadores de direcciones que indican el modo de direccionamiento que utiliza cada operando. Cód. Oper. Especificador ............ .......... .......... In Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 14 de 64 Modos de direccionamiento y registros: Impacto en el tamaño de las instrucciones • El número de modos de direccionamiento y el número de registros de una arquitectura influyen directamente en el tamaño de las instrucciones. – Cuanto mayor es el número de registros y modos de direccionamiento más bits se necesitarán para la codificación de los mismos. Por ejemplo: 32 registros necesitarán como mínimo 5 bits para su codificación en la instrucción: 00000 (R0) ………. 11111 (R31). • Fuerzas que debe equilibrar el arquitecto de computadores: – El deseo de tener muchos registros y modos de direccionamiento – El impacto en el tamaño de las instrucciones -> tamaño de los programas – El deseo de tener instrucciones codificadas en longitudes fáciles de manejar o decodificar por una implementación determinada (hardware que ejecuta el repertorio de instrucciones). Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 15 de 64 Tipos de instrucciones • Las operaciones soportadas por la mayoría de las arquitecturas pueden clasificarse según la siguiente tabla: Tipo de instrucción Ejemplos Comentarios Operaciones aritméticas y lógicas: suma, resta, and, or, ... Transferencia de datos entre memoria y registros: Carga/almacenamiento. Salto, bifurcación, llamadas a subrutinas, retorno de subrutinas, excepciones, Llamadas al Sistema operativo, gestión de la memoria virtual. Categorías presente en todas las máquinas con un repertorio completo de instrucciones. Punto Flotante operaciones en punto flotante: +, -, * y / . En máquinas destinadas a realizar muchas operaciones en punto flotante Decimal y multiplicación decimal, Suma conversiones de decimal a caracteres. Comparar, mover, copiar o buscar en strings o cadenas de caracteres. En algunas arquitecturas (VAX, 80x86) forman parte del repertorio de instrucciones y en otras las sintetiza el compilador a partir de instrucciones mas sencillas. Aritmética y lógica Transferencia de datos Control Sistema Cadenas Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina Varían entre las distintas arquitecturas pero todas proporcionan algún soporte de instrucciones para funciones del sistema. 16 de 64 Instrucciones para el control de flujo • Nomenclaturas más aceptadas – Saltos: • Rupturas de secuencias CONDICIONALES – Bifurcaciones: • Rupturas de secuencia NO CONDICIONALES. • Tipos de cambios de flujo – – – – Saltos condicionales Bifurcaciones Llamadas a procedimientos Retornos de procedimiento Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 17 de 64 Saltos condicionales • Normalmente, los saltos son relativos al PC – La dirección de destino se da como un desplazamiento que se suma o resta al Contador de Programa (PC). • Código independiente de la posición – Puede ejecutarse independientemente de su posición en memoria. • Un salto se realiza si la condición probada es verdadera • la condición que se prueba puede ser: – Un bit especial de estado que se activa en función del resultado de la ALU. » add r1,r2,r3 » bz label # si (bit de estado “zero” está activo) ir a label – Registro arbitrario que toma el valor del resultado de una comparación. » sub r1,r2,r3 » beqz r1,label # si (r1==0) ir a label – En la propia instrucción de salto se realiza la comparación. » beq $1,$2,label # si ($1==$2) ir a label • Los saltos suelen ser cortos -> pocos bits para especificar la dirección. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 18 de 64 Bifurcaciones • La dirección de la siguiente instrucción a ejecutar es la especificada por el campo de operandos de la instrucción de bifurcación. – Ejemplo: J 2000 # ir a la dirección 2000 de memoria • La dirección de salto puede especificarse de las siguientes formas: – Directa • El campo de operandos de la instrucción especifica directamente la siguiente instrucción que se ha de ejecutar. – J 1000 – Indirecta • Saltos indirectos por registros – jr $5 • Retornos de procedimientos o subrutinas – RET Fundamento de Computadores (1º II) # I8086: La dirección de retorno la recupera del “stack”. Cap 2: El nivel de lenguaje máquina 19 de 64 Procedimientos (o subrutinas) • Concepto de procedimiento o subrutina – Puede considerarse como una herramienta del programador para estructurar los programas y permitir que un programa desarrollado pueda ser reutilizado. – Librerías de subrutinas • Llamada y retorno de procedimientos: Funcionamiento simplificado Programa principal D1: instrucción 1 D2: instrucción 2 D3: Llamada a “pru” D4: instrucción 4 . . Dn: instrucción n Fundamento de Computadores (1º II) Guarda dirección D4 Registro o Stack Cap 2: El nivel de lenguaje máquina Procedimiento Pru Instrucción 1 instrucción 2 instrucción 3 inst. retorno Recupera D4 20 de 64 Instrucciones de llamada y retorno de procedimientos • Incluyen la transferencia del control y guardar algún estado. – Como mínimo, debe guardarse la dirección de retorno en algún lugar que normalmente es: Un registro del procesador o la pila (stack). • Algunas arquitecturas proporcionan mecanismos para guardar los registros. En otras, es el propio compilador quien genera las instrucciones para guardar los registros. • Convenios básicos para guardar los registros: – Guarda llamador (caller-saving) • Antes de llamar al procedimiento, se guardan los registros cuyo contenido se quiere preservar después de la llamada. – Guarda el llamado (called-saving) • El procedimiento llamado guarda los registros que quiera a utilizar. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 21 de 64 Frecuencia de uso de las instrucciones Ejemplo: Top 10 80x86 Instructions Rank instruction Integer Average Percent total executed 1 load 22% 2 conditional branch 20% 3 compare 16% 4 store 12% 5 add 8% 6 and 6% 7 sub 5% 8 move register-register 4% 9 call 1% 10 return 1% Total 96% Simple instructions dominate instruction frequency Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 22 de 64 Operaciones básicas • Conclusión: Soportar las siguientes operaciones porque son las que predominan en el conjunto de instrucciones ejecutadas. retur Tipo de instrucción load store add subtract move register-register and shift compare equal –not equal branch jump call (llamada a subrutina) return (retorno de subrutina) Fundamento de Computadores (1º II) lw sw add sub add and sll slt beq j jal Instrucción del procesador MIPS $a0, -30($t5) # $a0=M[-30+$t5] $t2, 100($s5) # M[100+$s5]=$t2 $t0,$t1,$t2 # $t0= $t1+t2 $a0,$s0,$s1 # $a0= $s0-$s1 $t0,$zero,$t1 # $t0=$t1 $t0,$t1,$t2 # $t0= $t1&$t2 $t0,$t1,5 # $t0=$t1 << 5 $t0,$t5,$s0 # si($t5<$s0) $t0=1 sino $t0=0 $t0,$zero,loop# si($t0==0) ir a loop 1000 # saltar a 1000 2000 # $ra=PC+4; ir a 2000 jr $ra Cap 2: El nivel de lenguaje máquina # ir a $ra ($ra=$31) 23 de 64 Tipos y tamaños de los operandos • Tipos de operandos – Bit: • 0,1 – Carácter • ASCII de 7 u 8 bits (extensiones gráficas) • EBCDIC de 8 bits (utilizado por los grandes computadores IBM) – Enteros • Números positivos y negativos representados en complemento a 2. • Byte: 8 bits • Media palabra (half-word): 16 bits • Palabra: 32 bits – Punto flotante • IEEE 754: Estándar para la representación en punto flotante. • Simple precisión (32 bits) y doble precisión (64 bits). – Decimal • Decimal empaquetado: Decimal codificado en binario (BCD), 4 bits para cada dígito, dos dígitos por byte. Ejemplo: 01001001 -> 49 • Decimal no empaquetado. Ejemplo: 00000100 00001001 -> 4 9 Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 24 de 64 Especificación del tipo de operando • Dos alternativas: – Codificarlo en el código de operación de la instrucción (caso más frecuente). – Añadir identificadores al dato que posteriormente serán interpretados por el hardware (método raramente utilizado) • Tagged architectures: Máquina de Burroughs Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 25 de 64 Frecuencia de uso de los tamaños de operandos 0% Doubleword 69% 74% Word Halfword Byte 31% Int Avg. FP Avg. 19% 0% 7% 0% 0% 20% 40% 60% 80% Frequency of reference by s ize • Es importante que las arquitecturas soporten: – Números enteros de 8, 16 y 32 bits. – Números en punto flotante de 32 y 64 bits (estándar IEEE754). Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 26 de 64 Formatos de las instrucciones • La información autocontenida en una instrucción se codifica con unos y ceros y se empaqueta en grupos de bits que definen los diferentes campos de una instrucción. • Campos de una instrucción Campo 1 Campo 2 ............... Campo n 11110011 11010 ................ 110000 • Alternativas de diseño: – Instrucciones de longitud variable • Alta densidad de código. • Programas compactos o de tamaño reducido. • Difícil implementación hardware. – Instrucciones de longitud fija • Mayor rendimiento (vía segmentación de las instrucciones) • Los programas son de mayor tamaño. • Fácil implementación hardware. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 27 de 64 Formatos de las instrucciones en el procesador MIPS Sólo tres formatos: • Formato R: add rd,rs,rt op 6 bits rs 5 bits rt 5 bits rd 5 bits shamt funct Formato de instrucciones aritméticas 5 bits 6 bits Todas las instrucciones MIPS de 32 bits 000000 01010 11111 00011 00000 100000 0x015f1820 add $3,$10,$31 • Formato I: lw rt,inmediato(rs) op 6 bits rs 5 bits rt 5 bits 100011 00011 00101 Dirección/inmediato 16 bits 0000000000100000 Formato de instrucciones carga Todas las instrucciones MIPS de 32 bits 0x8c650020 lw $5,32($3) • Formato J: j dirección op 6 bits 000010 Fundamento de Computadores (1º II) Dirección objetivo 26 bits 00000100000000000000000000 Cap 2: El nivel de lenguaje máquina Formato de instrucciones bifurcación Todas las instrucciones MIPS de 32 bits 0x08100000 j 0x400000 28 de 64 Ejemplo de arquitectura CISC (Complex Instruction Set Computer) • Máquina representativa CISC: VAX 11/780 – Objetivos de VAX: • Compiladores sencillos y alta densidad de código. – Estos objetivos dieron lugar a: • Formato de instrucciones de longitud variable. • Potentes modos de direccionamiento. • Potentes instrucciones y codificación de las mismas. • Arquitectura altamente ortogonal: El código de operación es independiente de los modos de direccionamiento que son independientes de los tipos de datos e incluso del número de operandos. Una instrucción puede utilizar cualquier modo de direccionamiento y tipo de dato de los soportados. – Ejemplo: SUMA (código de operación) (tipos de datos:byte, word, ...)(nº de operandos: 2,3) addb2 addw2 addl2 addf2 addd2 addb3 addw3 addl3 addf3 addd3 Cientos de operaciones se expanden a miles de instrucciones! Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 29 de 64 Ejemplo de arquitectura RISC (Reduced Instruction Set Computer) • Ejemplo de procesador RISC: MIPS – Objetivos de MIPS • Alto rendimiento vía segmentación. • Facilitar la implementación hardware de las instrucciones. • Compatibilidad con compiladores altamente optimizados. – Estos objetivos dieron lugar a: • Instrucciones sencillas. • Modos de direccionamiento sencillos. • Formato de instrucciones de longitud fija. • Gran número de registros. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 30 de 64 Procedimientos • Definición: Fragmento de código que realiza una tarea concreta y que puede ser llamado o activado desde otra parte del programa. • Ventajas del uso de procedimientos – Estructuración modular de los programas: • Nos permite descomponer un programa complejo en otros más sencillos que se pueden editar, compilar y depurar de forma independiente. – Código reutilizable • Librerías de procedimientos Llamada a un procedimiento nombre_proc (pa1, pa2,...) p1, p2,..: parámetros actuales Fundamento de Computadores (1º II) Formato Procedimiento nombre_proc(p1, p2,..) declaraciones inicio <acciones> fin p1, p2,..: parámetros formales Cap 2: El nivel de lenguaje máquina 31 de 64 Pasos en la llamada a un procedimiento Procedimiento Programa principal • Paso 1: Paso de parámetros. Colocar los parámetros de paso al procedimiento (en registros o stack). Paso 2: Llamada al procedimiento • • Paso 3: Salvar registros. Crear bloque de activación (adquirir los recursos de por el almacenamiento necesitados procedimiento). Guardar en el stack los registros que se deseen preservar (callee saving). Gestión del bloque de activación. Paso 4: Cuerpo del Procedimiento. Ejecuta tarea a realizar. Paso 5: Colocar los resultados para pasarlos al programa principal. Restaurar registros. Destruye bloque de activación. Paso 6: Retorno al procedimiento. Regresa al programa principal (dirección siguiente a la llamada de procedimiento). Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 32 de 64 Tipos de procedimientos • Procedimiento anidado – Un procedimiento A llama a otro B que a su vez llama a otro C y ...... Proc A Guardar Proc B Recuperar Guardar Proc C Recuperar • Procedimiento recursivo – Procedimiento que se llama a si mismo • Procedimiento reentrante Procedimiento FACTORIAL (N) integer N, FACTORIAL if N<= 1 then return 1 else return N*FACTORIAL(N-1) end if fin_procedimiento – Proceso = código + estado (PC, registros, variables,..) – Varios usuarios pueden hacer uso del mismo código cargado en memoria pero manteniendo un estado para cada usuario. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 33 de 64 La Pila (o stack) • Estructura de datos tipo LIFO (Last Input First Output) útil para: – Contener valores pasados a un procedimiento como parámetros. – Salvar la información que se desee preservar en llamadas a procedimientos. • Por ejemplo, registros que el invocador no quiere cambiar. – Proporcionar a un procedimiento espacio para variables locales • Operaciones básicas: • Guardar (push) y recuperar (pop). • Normalmente, la estructura de datos crece hacia posiciones más bajas de memoria. • Puntero de pila (Stack Pointer, SP) – Puntero o registro cuyo contenido apunta a la cima de la pila. – Ejemplo: MIPS utiliza el registro 29 ($29 o $sp) como puntero de pila. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 34 de 64 Operaciones sobre la pila Guardar (push) Recuperar (pop) 1. Decrementar puntero 2. Escribir en memoria (store) MIPS: addi $sp,$sp,-4 sw $reg, 0($sp) Memoria 1. Leer de memoria (load) 2. Incrementar puntero MIPS: lw $reg, 0($sp) addi $sp,$sp,4 Dirección Memoria Baja sp-4 Dirección Baja Valor guardado sp sp Valor leído sp+4 Alta Fundamento de Computadores (1º II) Alta Cap 2: El nivel de lenguaje máquina 35 de 64 Bloque de activación antes, durante y después de la llamada a un procedimiento # Programa principal ..... Llamar_a B(p1,p2,..) Antes # Procedimiento B(...) <guardar registros> <cuerpo> <restaurar registros> <retorno> Dirección baja de memoria sp -> sp -> Durante Después Variables locales Registros guardados Dirección de retorno fpOLD <- fpNEW sp -> <- fpOLD <- fp Dirección alta de memoria Estado de la pila antes, durante y después de la llamada a un procedimiento. Fundamento de Computadores (1º II) Cap 2:activación El nivel de lenguaje máquina Bloque de sombreado 36 de 64 Ejemplo: Soporte a procedimientos de la arquitectura MIPS • Convenio de los programadores para el uso de los registros – – – – – – • $a0 - $a3: Registros para paso de hasta 4 parámetros. $v0 - $v1: Registros para la devolución de resultados. $gp: puntero global que apunta a un segmento de datos estáticos. $sp: Puntero de pila. $fp: Puntero de encuadre (frame pointer). $ra: Registro para guardar la dirección de retorno al realizar la llamada. Instrucción MIPS para llamada a procedimientos – Jump - and - Link (jal) • jal ProcedureAddress • jalr registro # $ra= PC+ 4; ir a ProcedureAddress # $ra= PC+ 4; ir a (registro) • Instrucción MIPS para el retorno de procedimientos – Jump Register (jr) • jr $ra # ir a la dirección dada por $ra Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 37 de 64 Arquitectura MIPS: Convenio para el uso de los registros en llamadas a procedimientos Nombre Nº reg. Uso Preservado en llamadas? $zero 0 Constante 0 - $at 1 Reservado para el ensamblador - $v0-$v1 2-3 Valores de resultados y evaluación de expresiones no $a0-$a3 4-7 Paso de parámetros (hasta cuatro; más a través de la pila) no $t0-$t7 16-23 Registros temporales no $s0-$s7 16-23 Registros que deben preservarse si $t8-$t9 24-25 Registros temporales no $k0-$k1 26-27 Reservado para el Sistema Operativo - $gp 28 Puntero global (global pointer) si $sp 29 Puntero de pila (stack pointer) si $fp 30 Puntero de encuadre (frame pointer) si $ra 31 Dirección de vuelta (return address) si Las abreviaciones de dos letras y nombre de los registros reflejan los usos pensados para ellos en el convenio. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 38 de 64 Ejemplo para MIPS # Ejemplo para MIPS # Programa principal main: li $a0,5 li $a1,8 jal multi .................... SP=SP-20 Æ # comienzo del procedimiento multi: addi $sp,$sp,-20 # Crea bloque de activación. # Salva registros. Crea variables locales si se necesitan. sw $fp, 16($sp) # guarda fp antiguo sw $ra, 12($sp) # guarda dirección de retorno sw $s0, 8($sp) # guarda $s0 sw $s1, 4($sp) # guarda $s1 sw $s2, 0($sp) # guarda $s2 addi $fp,$sp,16 # nuevo fp SP Æ # cuerpo procedimiento ..... # Restaura registros lw $s2, 0($sp) # recupera $s2 lw $s1, 4($sp) # recupera $s1 lw $s0, 8($sp) # recupera $s0 lw $ra, 12($sp) # recupera dirección de retorno lw $fp, 16($sp) # recupera fp antiguo addi $sp,$sp,20 # Destruye bloque activación jr $ra # retorna al programa principal Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina Dirección baja de memoria $s2 $s1 Registros salvados $s0 $ra: dir. retorno $fp: frame pointer <- FP Dirección alta de memoria 39 de 64 Clasificación de las arquitecturas a nivel de lenguaje máquina • La clasificación puede realizarse atendiendo a varios criterios entre los que destacamos: – Almacenamiento de los operandos en la CPU. • Además de en memoria ¿dónde se encuentran los operandos? – Número de operandos explícitos por la instrucción. – Posición del operando. – Tipo de instrucciones – Tipo y tamaño de los operandos • Almacenamiento de los operandos en la CPU. – Criterio más importante que nos permite diferenciar una arquitectura de otra. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 40 de 64 Clasificación de las arquitecturas atendiendo al almacenamiento de operandos en la CPU • Alternativas para almacenar operandos en la CPU Arquitectura Arquitectura de Pila Arquitectura de Acumulador Arquitectura de Registros de Operandos explícitos 0 Destino de resultados Pila Procedimiento para acceder a operandos explícitos Introducir y sacar de la pila 1 Acumulador Cargar/almacenar acumulador 2ó3 Registros o Cargar/almacenar registro o memoria Propósito General memoria • Ejemplo: C= A + B (C,A y B variables en memoria) Pila Acumulador Registros PUSH A LOAD A LOAD R1, A PUSH B ADD B ADD R1, B ADD STORE C STORE C,R1 POP C Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 41 de 64 Ventajas y desventajas de cada una de las arquitecturas Tipo de máquina Pila Acumulador Registro Ventaja Desventaja Modelo sencillo para la evaluzación de expresiones. Instrucciones cortas. Buena densidad de código Instrucciones cortas. Minimiza los estados internos de la máquina Modelo más general para la generación de código. Uso efectivo de los registros por los compiladores. Acceso no aleatorio a la pila. Difícil generación de código eficiente. Dificulta una implementación eficiente. Como el acumulador es sólo almacenamiento temporal, el tráfico de memoria es el más alto. Todos los operandos deben ser nombrados -> instrucciones más largas. - Años 60: Arquitecturas de pila. - Años 70: Arquitecturas CISC (ej. VAX) - Años 80: Arquitecturas RISC (ej. MIPS) Las arquitecturas de registros son las que dominan hoy día! Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 42 de 64 Clasificación de las arquitecturas de registros de propósito general • Clasificación de las arquitecturas de registros atendiendo a: – Número de operandos: 2 o 3. • add r1,r2 # r1=r1 + r2 • add r1,r2,r3 # r1=r2 + r3 – Número de operandos en memoria: de 0 a 3. • add r1,r2,r3 # r1=r2 + r3 • add r1,r2,B # r1=r2 + EA(A) • add r1,B,A # r1=EA(A) + EA(B) • add C,B,A # EA(C)=EA(B) + EA(A) • Las arquitecturas de registros dominan hoy día. – Los registros son más rápidos que la memoria – Los registros son fáciles de usar por el compilador. – Los registros pueden almacenar variables: • Reducción del tráfico de memoria. Disminución del tiempo de ejecución. • Mejor densidad de código: unos cuantos bits son suficientes para especificar un registro. En cualquier caso, menos que los necesarios para indicar una dirección de memoria. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 43 de 64 Arquitecturas de registros de propósito general más frecuentes Tipo Registro-Registro (0,3) Registro-Memoria (1,2) Memoria-Memoria (3,3) Ventajas Desventajas Instrucciones longitud fija. Recuento de instrucciones más alto que las Fácil codificación. arquitecturas con referencias a memoria. Modelo simple de generación de código. Los datos pueden ser accedidos sin La codificación de una dirección de memoria y un registro en cada instrucción cargarlos primero en registros. Fácil formato de instrucción. puede restringir el número de registros. Buena densidad de código. Los ciclos por instrucción varían por la posición del operando. Más compacta. Gran variación en el tamaño de las No emplean registros para datos instrucciones. Los accesos a memoria crean cuellos de temporales botella importantes. Notación (m,n). m: Número de operandos en memoria; n: Número de operandos totales. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 44 de 64 Número de registros en arquitecturas populares EDSAC IBM701 IBM360 DEC PDP11 INTEL 8008 MOTOROLA 6800 DEC VAX Número de registros de propósito general 1 1 16 8 1 2 16 INTEL 8086 MOTOROLA 68000 INTEL 80386 MIPS 1 16 8 32 HP PA-RISC SPARC PowerPC DEC ALPHA 32 32 32 32 Máquina Fundamento de Computadores (1º II) Estilo de arquitectura Año Acumulador Acumulador Registro-memoria Registro-memoria Acumulador Acumulador Registro-memoria, memoriamemoria Acumulador extendido Registro-memoria Registro-memoria Registro-Registro (carga/almacenamiento) “ “ “ “ 1949 1953 1964 1970 1972 1974 1977 Cap 2: El nivel de lenguaje máquina 1978 1980 1985 1985 1986 1987 1992 1992 45 de 64 Lenguaje ensamblador • Introducción. • Ventajas e inconvenientes del lenguaje ensamblador. • Funcionamiento del ensamblador. • El montador de enlaces (o linker). • Utilidades de los ensambladores. • Lenguaje ensamblador del procesador MIPS R2000 Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 46 de 64 Ventajas e inconvenientes del lenguaje ensamblador • Ventajas del lenguaje ensamblador – Útil cuando es crítico alguno de los siguientes factores: • Tiempo de ejecución del programa. • Tamaño del programa. – El programador puede seleccionar instrucciones específicas de la arquitectura para realizar una determinada operación. • Inconvenientes del lenguaje ensamblador – Los programas son específicamente inherentes a la máquina. – Son de mayor tamaño que los programas equivalentes escritos en lenguaje de alto nivel. Menor productividad del desarrollo software. – Los programas son difíciles de leer, escribir y pueden contener más errores. • Soluciones híbridas para aprovechar la fortaleza de cada lenguaje – La mayor parte del programa se escribe en alto nivel. – Las secciones críticas en lenguaje ensamblador. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 47 de 64 Funcionamiento del ensamblador • Un ensamblador traduce un archivo con sentencias en lenguaje ensamblador a un archivo de instrucciones máquina y datos binarios. • Traducción en dos pasadas: – Primera pasada: • Calcula las posiciones de memoria que corresponden a los nombres simbólicos que aparecen en el programa para que sean conocidas cuando de traduzcan las instrucciones. Crea tabla de símbolos. – Segunda pasada: • Traduce cada sentencia del lenguaje ensamblador al combinar los equivalentes numéricos de los códigos de operación, especificadores de registros y rótulos de la tabla de símbolos en una instrucción legal. • Rótulos o etiquetas – Externos o globales: Pueden ser referenciados desde otro archivo distinto de aquél en el que se define (hay que declararlos como tales). – Internos o locales: Sólo puede ser referenciado en el archivo en el que se define (locales por defecto). Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 48 de 64 El montador de enlaces (linker) • El ensamblador procesa cada archivo de un programa de forma individual. Solamente se conocen las direcciones de los rótulos locales. • Necesidad de otra herramienta: El montador de enlaces (o linker). – Combina una colección de archivos objetos y librerías (opcional) en otro archivo ejecutable al resolver los rótulos externos. – El ensamblador asiste al montador suministrándole una tabla de símbolos o rótulos y referencias no resueltas. Archivo fuente Ensamblador Archivo objeto Archivo fuente Ensamblador Archivo objeto Enlazador Archivo fuente Ensamblador Archivo objeto Librería Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina Archivo ejecutable 49 de 64 Utilidades de los ensambladores • Los ensambladores proporcionan diversas características (utilidades) que facilitan al programador la escritura de los programas. • Utilidades: – Directivas para organizar datos en memoria. • Permite al programador describir los datos de una manera más concisa y natural que la representación binaria: decimal, ASCII, hexadecimal,... – Macros • Permiten nombrar una secuencia de instrucciones frecuentemente utilizada. No confundir con procedimiento o subrutina. – Pseudoinstrucciones • Son proporcionadas por algunos lenguajes ensambladores y no forman parte del repertorio de instrucciones del procesador. El ensamblador las sintetiza a partir de instrucciones puras del procesador. – Utilización de símbolos • Muy útil en instrucciones de control de flujo o para hacer referencia a los datos. Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 50 de 64 Lenguaje ensamblador MIPS R2000 • Componentes de un procesador MIPS • Modos de direccionamiento • Sintaxis del ensamblador • Directivas del ensamblador soportadas por el simulador SPIM. • Formato de las instrucciones. • Repertorio de instrucciones – – – – – – Aritméticas Lógicas Transferencia de datos Movimiento de datos Comparación Salto y bifurcación • Ejemplo de programa en ensamblador Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 51 de 64 Componentes de un procesador MIPS • Componentes – CPU – Dos coprocesadores: 0 y 1. Memory • CPU: 32 registros de propósito general – $0: Siempre contiene 0 – $1-$31: Propósito general CPU Coprocessor 1 (FPU) Registers Registers $0 $0 $31 $31 • C0: 4 registros – BadVAddr (reg. Nº 8), Status (reg. Nº 12) – Cause (reg. Nº 13), EPC (reg. Nº 14) • C1: 32 registros para punto flotante – 16 registros simple precisión • $f0, $f2, …. $f30 (32 bits) – 16 registros doble precisión (64 bits • $f0-$f1, $f2-$f3, …. $f30-$f31 Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina Arithmetic unit Multiply divide Lo Arithmetic unit Hi Coprocessor 0 (traps and memory) Registers BadVAddr Cause Status EPC 52 de 64 Convenio para el uso de la memoria en sistemas basados en el procesador MIPS 0x7FFFFFFF Pila Segmento de pila Datos dinámicos 0x10000000 Datos estáticos Código Segmento de datos Segmento de texto 0x00400000 0x00000000 Fundamento de Computadores (1º II) Reservada Cap 2: El nivel de lenguaje máquina 53 de 64 Modos de direccionamiento Register (direct) op rs rt rd register Immediate Base+index op rs rt immed op rs rt immed register PC-relative op rs rt + immed PC Fundamento de Computadores (1º II) Memory Cap 2: El nivel de lenguaje máquina Memory + 54 de 64 Sintaxis del ensamblador • Líneas de comentarios – Todo lo que haya a partir del simbolo # hasta el final de línea se ignora. • Directivas – Secuencia de caracteres, (_) y (.) que no empiezan por un número. • Etiquetas – Se declaran colocándolas al principio de línea y terminadas en (:). • Número decimales y hexadecimales – Números en base 10 por defecto. – Hexadecimales o en base 16 precedidos por 0x. • Cadenas o strings – Las cadenas están encerradas entre dos comillas (“). – Caracteres especiales: • \n Nueva línea • \t Tab • \” Comillas Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 55 de 64 Ejemplo de sintaxis ############################################################################ # Sintaxis del ensamblador # ############################################################################ # Comienzo del segmento de datos .data 0x10000000 init: .word 0x10,25,0x11223344 # declaración de 3 variables tipo word (4 bytes) string: .asciiz “Soy una cadena \n” # declaración de una cadena # Comienzo del segmento de código main: .text 0x400000 .globl main # declaramos la etiqueta “main” como global lw $t0,-8($s0) # comentario addi $t0,$t0,1 # comentario Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 56 de 64 Directivas del ensamblador de MIPS soportadas por el simulador SPIM •SPIM soporta un subconjunto de las directivas del ensamblador MIPS – .align n – .ascii – .asciiz str str – .byte – .half – .word b1,b2,... h1,h2,... w1,w2,... – .float – .double f1,f2,... d1,d2,... – .space n Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina – – – – .data .text .ktext .kdata <addr> <addr> <addr> – – – – .globl .extern .set .set símbolo símbolo size noat at 57 de 64 Formato de las instrucciones Sólo tres tipos de formatos: • Formato R: add rd,rs,rt op 6 bits rs 5 bits rt 5 bits rd 5 bits shamt funct Formato de instrucciones aritméticas 5 bits 6 bits Todas las instrucciones MIPS de 32 bits 000000 01010 11111 00011 00000 100000 0x015f1820 add $3,$10,$31 • Formato I: lw rt,inmediato(rs) op 6 bits rs 5 bits rt 5 bits 100011 00011 00101 Dirección/inmediato 16 bits 0000000000100000 Formato de instruciones de carga Todas las instrucciones MIPS de 32 bits 0x8c650020 lw $5,32($3) • Formato J: j dirección op 6 bits 000010 Fundamento de Computadores (1º II) Dirección objetivo 26 bits 000000000010000000000000000 Cap 2: El nivel de lenguaje máquina Formato de instrucciones de bifurcación Todas las instrucciones MIPS de 32 bits 0x08010000 j 0x400000 58 de 64 Repertorio de instrucciones MIPS: Instrucciones aritméticas Instrucción sumar sumar sin signo sumar inmediato sumar inmediato sin signo restar restar sin signo dividir dividir sin signo multiplicar multiplicar sin signo valor absoluto dividir dividir sin signo multiplicar multiplicar multiplicar sin signo Fundamento de Computadores (1º II) Ejemplo add $1,$2,$3 addu $1,$2,$3 addi $1,$2,10 addiu $1,$2,10 sub $1,$2,$3 subu $1,$2,$3 Significado $1= $2+$3 $1=$2+$3 $1=$2+10 $1=$2+10 $1=$2-$3 $1=$2-$3 Lo=$1÷$2 div $1,$2 Hi=$1mod$2 Lo=$1÷$2 divu $1,$2 Hi=$1mod$2 mult $1,$2 Hi,Lo=$1*$2 multu $1,$2 Hi,Lo=$1*$2 Pseudoinstrucciones abs $1=$2÷$3 div $1,$2,$3 (cociente) $1=$2÷$3 divu $1,$2,$3 (cociente) mul $1,$2,$3 $1=$2*$3 mulo $1,$2,$3 $1=$2*$3 mulou $1,$2,$3 $1=$2*$3 Cap 2: El nivel de lenguaje máquina Comentarios Posible excepción por desbordamiento Posible excepción por desbordamiento Posible excepción por desbordamiento Posible excepción por desbordamiento - Posible excepción por desbordamiento Posible excepción por desbordamiento Posible excepción por desbordamiento 59 de 64 Repertorio de instrucciones MIPS: Instrucciones lógicas Instrucción and or xor nor andi ori xori shift left logical shift left logical variable shift right logical shift right logical variable shift right arithmetic shift right arithmetic variable Fundamento de Computadores (1º II) Ejemplo and $1,$2,$3 andi $1,$2,10 xor $1,$2,$3 nor $1,$2,$3 andi $1,$2,10 ori $1,$2,10 xori $1,$2,10 sll $1,$2,10 sllv $1,$2,$3 srl $1,$2, 10 srlv $1,$2,$3 sra $1,$2,10 srav $1,$2,$3 Significado $1= $2&$3 $1=$2&10 $1=$2⊕$3 $1=~($2|$3) $1=$2&10 $1= $2|10 $1=$2|10 $1= $2<<10 $1= $2<<$3 $1=$2>>10 $1=$2>>$3 $1=$2>>10 $1=$2>>$3 Cap 2: El nivel de lenguaje máquina Comentarios 60 de 64 Repertorio de instrucciones MIPS: Instrucciones de transferencia de datos Instrucción carga byte carga byte sin ext. signo carga media palabra carga media palabra sin extensión de signo carga palabra carga inmediata de la parte más significativa “load upper inmediate” Carga registro del coprocesador z almacena byte almacena media palabra almacena palabra almacena registro en memoria registro del coprocesador z Ejemplo lb $1,10($2) lbu $1,10($2) lh $1,10($2) Significado $1=M[10+$2] $1=M[10+$2] $1=M[10+$2] Extiende el bit de signo No extiende el bit de signo Extiende el bit de signo lhu $1,10($2) $1=M[10+$2] No extiende el bit de signo lw $1,10($2) $1=M[10+$2] lui $1,50 $1=50*2 lwc1 $f0,10($2) $f0= M[10+$2] sb $1,10($2) sh $1,10($2) sw $1,10($2) M[10+$2]=$1 M[10+$2]=$1 M[10+$2]=$1 swc1 $f0,10($2) M[10+$2]=$f0 Carga inmediata li $1,1000 Carga dirección la $3,label Fundamento de Computadores (1º II) 16 Comentarios Carga un dato de 16 bits en la parte más significativa del registro. Pseudoinstrucciones Carga de un dato de 32 bits $1=1000 $3=dirección de Transfiere la dirección de memoria no el contenido. label Cap 2: El nivel de lenguaje máquina 61 de 64 Repertorio de instrucciones MIPS: Instrucciones de movimiento de datos Instrucción mover desde Hi mover desde Lo mover a Hi mover a Lo mover desde coprocesador z mover al coprocesador z transfiere o mueve transfiere doble desde coproc. 1 Fundamento de Computadores (1º II) Ejemplo Significado mfhi $1 $1= Hi mflo $1 $1= Lo mthi $1 Hi=$1 mtlo $1 Lo=$1 mfcz $1,$f0 $1=$f0 mtcz $1,$f0 $f0=$1 Pseudoinstrucciones move $1,$2 $1=$2 $4=$F0 mfc1.d $4,$f0 $5=$F1 Cap 2: El nivel de lenguaje máquina Comentarios $f0-$f30: Registros del coprocesador 1 62 de 64 Repertorio de instrucciones MIPS: Instrucciones de comparación Instrucción Inicializar menor que Ejemplo slt $1,$2,$3 Significado if ($2<$3) then $1=1 else $1=0 endif Comentarios inicializar menor que sin signo sltu $1,$2,$3 Inicializar menor que inmediato slti $1,$2,5 Inicializar menor que inmediato sin signo sltiu $1,$3,$5 Inicializa igual inicializa mayor o igual inicializa mayor que inicializa menor o igual inicializa no igual Fundamento de Computadores (1º II) Pseudoinstrucciones si ($2==$3) then $1=1 seq $1,$2,$3 else $1=0 endif sge $1,$2,$3 sgt $1,$2,$3 sle $1,$2,$3 sne $1,$2,$3 Cap 2: El nivel de lenguaje máquina 63 de 64 Repertorio de instrucciones MIPS: Instrucciones de salto y bifurcación Instrucción Ejemplo Significado si($1==$2) ir a PC+4 +100 salta sobre igual beq $1,$2,100 si($1!=$2) ir a PC+4 +100 salta sobre no igual bne $1,$2,100 si($1>=0) ir a PC+4 +100 salta sobre mayor o igual que cero bgez $1,100 salta sobre mayor o igual que cero y bgezal $1,1000 si($1>=0) $31=PC+4; ir a 1000 enlaza ..... ir a 2000 bifurcar j 2000 ir a $1 bifurcar registro jr $1 $31=PC+4; ir a 10000 Bifurcar y enlazar jal 10000 $31=PC+4; ir a $1 bifurcar y enlazar registro jalr $1 Pseudoinstrucciones si($1>=$2) ir a PC+4 +100 salta sobre mayor o igual bge $1,$2,100 si($1>$2) ir a PC+4 +100 salta sobre mayor que bgt $1,$2,100 si($1<=$2) ir a PC+4 +100 salta sobre menor o igual ble $1,$2,100 si($1<$2) ir a PC+4 +100 salta sobre menor que blt $1,$2,100 ..... Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina Comentarios 64 de 64