MIPS Instruction Set PDF
Document Details
Uploaded by RegalEuphoria1270
Universidad de Sonora
Tags
Summary
This document provides an overview of the MIPS instruction set, including aspects like instruction classes, arithmetic instructions, data transfer, and logical operations. It's aimed at an undergraduate level audience and offers details about MIPS architecture.
Full Transcript
MIPS MIPS (Microprocessor without Interlocked Pipeline Stages) es una familia de microprocesadores RISC desarrollada por MIPS Technologies desde 1981 y por Imagination Technologies desde 2012. Principio de regularidad. Todas las instrucciones ocupan 4 bytes (32 bits). Principio de sim...
MIPS MIPS (Microprocessor without Interlocked Pipeline Stages) es una familia de microprocesadores RISC desarrollada por MIPS Technologies desde 1981 y por Imagination Technologies desde 2012. Principio de regularidad. Todas las instrucciones ocupan 4 bytes (32 bits). Principio de simplicidad. Instrucciones sencillas. Solo hay 3 formatos de instrucción. Universidad de Sonora 2 MIPS Usados, entre otros, en algunas consolas de videojuego de Nintendo y Sony y sistemas empotrados como ruteadores Cisco, dispositivos Windows CE, gateways, etc. Más información en https://en.wikipedia.org/wiki/MIPS_instruction_set Universidad de Sonora 3 Instrucciones Clases de instrucciones: Aritméticas. Suma, resta, multiplicación, división. Transferencia de datos. Carga (load) de la memoria a un registro, almacena (store) de un registro a la memoria. Lógicas. AND, OR, corrimiento (shift). Brincos condicionales. Brincos incondicionales. Hay instrucciones para números reales y para enteros. Universidad de Sonora 4 Operandos Registros. Memoria. Universidad de Sonora 5 Registros Un registro es una memoria integrada en la CPU. Tienen poca capacidad, 4 bytes (32 bits) en MIPS, pero de acceso muy rápido. 32 registros enteros: $s0-$s7, $t0-$t9, $a0-$a3, $v0- $v1, $zero, $gp, $fp, $sp, $ra, $at. 32 registros float: $f0-$f31. Se usan para guardar valores temporales y resultados de operaciones aritméticas. En ese curso veremos solo instrucciones y registros enteros. Universidad de Sonora 6 Registros Universidad de Sonora 7 Memoria Se usa para guardar variables. MIPS usa byte addressing. La memoria es un arreglo de bytes. La dirección de una palabra es la dirección del byte más alto. Universidad de Sonora 8 Memoria Las palabras son de 4 bytes (32 bits). Los registros son de 4 bytes (32 bits). La memoria está alineada. Las palabras deben comenzar en direcciones que son múltiplo de 4. Universidad de Sonora 9 Memoria MIPS se puede configurar por hardware como big- endian o little–endian. Se usan 32 bits para direccionar la memoria. La memoria tiene: 232 bytes con direcciones desde 0 hasta 232 – 1. 230 palabras con direcciones desde 0 hasta 232 – 4. Universidad de Sonora 10 Registros vs Memoria La mayoría de las CPUs modernas mueven las variables de la memoria principal a los registros, operan sobre ellos y regresan el resultado a la memoria. A esto se le conoce como arquitectura load/store. MIPS emplea arquitectura load/store. Universidad de Sonora 11 Instrucciones aritméticas add – suma de registros. addu – suma de registros sin signo. addi – suma inmediata. addiu – suma inmediata sin signo. sub, subu – restas. div, divu – divisiones. mult, multu – multiplicaciones. Universidad de Sonora 12 Instrucciones aritméticas La suma y la resta tienen 3 operandos. El orden de los operandos es fija (primero el operando destino y luego los fuentes). Ejemplos: add $r0, $r1, $r2 # $r0 $r1 + $r2 $r0, $r1 y $r2 son registros con números de 32 bits con signo. Universidad de Sonora 13 Instrucciones aritméticas addi $r0, $r1, C # $r0 r1 + C $r0 y $r1 son registros con signo, C es una constante de 16 bits con signo en base 8, 10 o 16. addu $r0, $r1, $r2 # $r0 $r1 + $r2 $r0, $r1 y $r2 son registros sin signo. addiu $r0, $r1, C # $r0 r1 + C $r0 y $r1 son registros sin signo, C es una constante de 16 bits sin signo en base 8, 10 o 16. Universidad de Sonora 14 Instrucciones aritméticas Si al sumar se produce overflow. add y addi lo indican. addu y addiu lo ignoran. addi $t0, $t1, 0xFFE5 $t0 $t1 – 27 e indica el overflow si se presenta. addiu $t0, $t1, 0xFFE5 $t0 $t1 + 0xFFE5 e ignora el overflow si se presenta. Universidad de Sonora 15 Instrucciones aritméticas Las restas sub, subu funcionan de la misma manera. Las divisiones y multiplicaciones tienen dos argumentos. Dejan el resultado en dos registros especiales: LO y HI. Hay instrucciones para copiar datos de LO y HI a los registros normales. Universidad de Sonora 16 Instrucciones aritméticas mult $r0, $r1 # $r0 x $r1 $r0 y $r1 tienen números con signo. LO tiene los 32 bits bajos del producto. HI tiene los 32 bits altos del producto. multu es parecido, $r0 y $r1 tienen números sin signo. Universidad de Sonora 17 Instrucciones aritméticas div $r0, $r1 # $r0 / $r1 $r0 y $r1 tienen números con signo. LO tiene el cociente ($r0 DIV $r1). HI tiene el residuo o módulo ($r0 MOD $r1). divu es parecido , $r0 y $r1 tienen números sin signo. Universidad de Sonora 18 Transferencia de datos mflo – mueve el valor de LO a un registro. mfhi – mueve el valor de HI a un registro. lw – mueve (carga) una palabra (4 bytes) de la memoria a un registro. sw – mueve (almacena) el valor de un registro (4 bytes) a la memoria. Universidad de Sonora 19 Transferencia de datos mflo $r # $r LO mfhi $r # $r HI lw $r0, C($r1) # $r0 Mem[$r1 + C] Copia (carga – load) una palabra (4 bytes) de la memoria a un registro. $r0 es el registro destino. $r1 es el registro base. C es el offset. La dirección de la palabra (del su primer byte) en la memoria está dado por $r1 + C. Universidad de Sonora 20 Transferencia de datos sw $r0, C($r1) # Mem[$r1 + C] $r0 Copia (almacena – store) una palabra (4 bytes) de un registro a la memoria. $r0 es el registro fuente. $r1 es el registro base. C es el offset. La dirección de la palabra (del su primer byte) en la memoria está dado por $r1 + C. Universidad de Sonora 21 Uso de la memoria Por convención, los sistemas basados en MIPS dividen la memoria en 3 segmentos: 1. Segmento de texto (text segment). 2. Segmento de datos (data segment). 3. Segmento de pila (stack segment). Universidad de Sonora 22 Segmento de texto El segmento de texto, que comienza a partir de la dirección 40000016, es donde se guarda el código del programa. En los programas, el segmento de texto se marca por medio de la instrucción.text. Universidad de Sonora 23 Segmento de datos El segmento de datos (data segment), a partir de la dirección 1001000016, es donde se guardan los datos. Se indica por medio de la instrucción.data. A su vez, el segmento de datos consta de dos partes: a) Datos estáticos. Contiene variables de tamaño fijo y que necesitan ser accesados durante todo el programa. Por ejemplo, variables globales. Universidad de Sonora 24 Segmento de datos b) Datos dinámicos. Contiene variables que se crean durante el programa. Por ejemplo, espacio asignado con malloc en C, u objetos creados en Java. Universidad de Sonora 25 Segmento de pila El segmento de pila (stack segment), a partir de la dirección 7FFFFFFC16, es donde se guardan los stack frames. Universidad de Sonora 26 Uso de la memoria Universidad de Sonora 27 Ejemplo Generar el código MIPS para: f = (g + h) – (i + j) Actualizando en la memoria la variable f. Universidad de Sonora 28 Ejemplo .data f:.word -1 g:.word 10 h:.word 17 i:.word 12 j:.word -10 Universidad de Sonora 29 Ejemplo .text la $t0, g # dirección de g lw $s1, 0($t0) # valor de g la $t0, h # dirección de h lw $s2, 0($t0) # valor de h la $t0, i # dirección de i lw $s3, 0($t0) # valor de i la $t0, j # dirección de j lw $s4, 0($t0) # valor de j Universidad de Sonora 30 Ejemplo # f = (g + h) – (i + j) add $t0, $s1, $s2 # $t0 g + h add $t1, $s3, $s4 # $t1 i + j sub $s0, $t0, $t1 # $s0 $t0 - $t1 # actualizar f la $t0, f sw $s0, 0($t0) Universidad de Sonora 31 Variables Las variables se guardan en la memoria en el segmento de datos. Para hacer operaciones con ellas hay que pasarlas a los registros (arquitectura load/store). MIPS maneja varios tipos de variables. En ese curso solo se verán enteros, arreglos de enteros y strings. Universidad de Sonora 32 Variables Un entero se declara así: x:.word 17 x es una etiqueta y funciona como nombre de la variable. La directiva.word está reservando una palabra (4 bytes). El número 17 es el valor inicial. Otra forma es ver a x como un apuntador al primer byte de una palabra que contiene al 17. Universidad de Sonora 33 Variables Para usar una variable hay que pasarla a un registro: Hay al menos dos formas. Una: la $t0, x # $t0 tiene la dirección de x lw $t1, 0($t0) # $t1 tiene el valor de x Otra: lw $t1, x # $t1 tiene el valor de x Universidad de Sonora 34 Variables Para guardar un registro en una variable hay al menos dos formas. Una: la $t0, x # $t0 tiene la dirección de x sw $t1, 0($t0) # Se actualiza la memoria con el valor de $t1 Otra: sw $t1, x # Se actualiza la memoria con el valor de $t1 Universidad de Sonora 35 Variables Los arreglos de enteros se verán más adelante. Universidad de Sonora 36 Variables Un string se declara así: mssg:.asciiz “Hola mundo” mssg es una etiqueta y funciona como el nombre del string. La directiva.asciiz indica que es un string terminado en nulo (ascii 0). “Hola mundo” es el valor inicial. Los strings se guardan empacados, 4 caracteres en una palabra. Universidad de Sonora 37 Variables El uso más común de los strings es para imprimir mensajes en la consola. Para imprimir un string: 1. Obtener la dirección. la $t0, mssg 2. Hacer una llamada al sistema con syscall. Universidad de Sonora 38 Llamadas al sistema MIPS no tiene instrucciones de entrada y salida. MIPS ofrece llamadas al sistema a través de la instrucción syscall. Las llamadas permiten leer del teclado, escribir a la consola y manejar archivos del sistema. Para hacer una llamada, se carga el número de llamada en $v0 y los argumentos en $a0-$a3. Las llamadas que regresan un valor lo hacen en $v0. Universidad de Sonora 39 Llamadas al sistema Universidad de Sonora 40 Ejemplo Hacer un programa completo en MIPS para el siguiente código en C: int x = 10 int y = 7 int z = x + y printf(“%d\n”, z); Universidad de Sonora 41 Segmento de datos.data x:.word 10 y:.word 7 z:.word 0 m:.asciiz "El número es: " enter:.asciiz "\n" Universidad de Sonora 42 Segmento de texto.text # Carga x y y, hace la suma y la guarda en z lw $t0, x lw $t1, y add $t2, $t0, $t1 sw $t2, z Universidad de Sonora 43 Segmento de texto # imprime el string “El número es:” li $v0, 4 la $a0, m syscall # imprime la suma li $v0, 1 move $a0, $t2 syscall # imprime el enter li $v0, 4 la $a0, enter syscall Universidad de Sonora 44 Segmento de texto # exit addi $v0, $zero, 10 # servicio stop syscall Universidad de Sonora 45 Seudo-instrucciones Son instrucciones que un programa ensamblador reconoce pero que no existen en la definición del ISA. El ensamblador mapea cada seudo-instrucción a dos o mas instrucciones reales. Se usan para comodidad de los programadores. Algunas seudo-instrucciones no son standard. Dependen de cada programa ensamblador. Universidad de Sonora 46 Seudo-instrucciones Por ejemplo, la seudo-instrucción li (carga inmediata – load immediate) se usa para asignar una constante a un registro: li $r, 17 Un programa ensamblador la puede traducir a la siguiente instrucción básica: addi $r, $zero, 17 Universidad de Sonora 47 Seudo-instrucciones Otra seudo-instrucción útil es move. Sirve para copiar un registro a otro: move $r1, $r2 Un programa ensamblador la puede traducir a la siguiente instrucción básica: add $r1, r2, $zero Universidad de Sonora 48 Seudo-instrucciones Algunas seudo-instrucciones que veremos: Universidad de Sonora 49 Lenguaje máquina El lenguaje de máquina es lenguaje binario. El hardware solo entiende bits. El ensamblador traduce cada instrucción de lenguaje ensamblador a lenguaje de máquina. Por ejemplo, la instrucción add $t0, $s1, $s2 se traduce en binario a 000000100011001001001000001000002 → 0232482016 Universidad de Sonora 50 Lenguaje máquina 00000010001100100100100000100000 se descompone en los siguientes campos: 000000 es el código de todas las instrucciones R.. 10001 es el número del registro $s1. 10010 es el número del registro $s2. 01001 es el número del registro $t0. 00000 es el campo shamt (add no lo usa). 100000 es el código de la suma de registros. Universidad de Sonora 51 Lenguaje máquina En general, la instrucción add destino, fuente1, fuente2 genera el código máquina 000000fffffgggggddddd00000100000 donde: 000000 es el código de todas las instrucciones R. fffff es el número del registro fuente 1 ggggg es el número del registro fuente 2 ddddd es el número del registro destino 00000 es el shamt (add no lo usa) 100000 es el código de la suma de registros. Universidad de Sonora 52 Formatos de instrucción En MIPS hay 3 formatos de instrucción: Formato R. Todos los operandos son registros. Formato I. Hay un operando inmediato (número). Formato J. La instrucción es un brinco (jump). Universidad de Sonora 53 Formatos de instrucción Ejemplos: Formato R. add $t0, $s1, $s2 # $t0 = $s1 + $s2 Formato I. addi $t0, $s1, C # $t0 = $s1 + C [número de 16 bits] Formato J. jC # brinca a C [dirección de 26 bits] Universidad de Sonora 54 Formatos de instrucción Fuente: https://en.wikipedia.org/wiki/MIPS_instruction_set#MIPS_instruction_formats Universidad de Sonora 55 Ejemplos Fuente: COD 5, p. 85 Universidad de Sonora 56 Operaciones lógicas Operan sobre números. Principales operaciones lógicas. Fuente: COD 5, p. 87 Universidad de Sonora 57 Operaciones lógicas sll – corrimiento (shift) a la izquierda. Ejemplo: sll $t2, $s0, 4 # en C: t2 = s0 C Universidad de Sonora 60 Operaciones lógicas srlv $r0, $r1, $r2 Corrimiento a la derecha variable. $r0 $r1 >> $r2 and $r0, $r1, $r2 # r0 $r1 & $r2 andi $r0, $r1, C # r0 $r1 & C or $r0, $r1, $r2 # r0 $r1 | $r2 ori $r0, $r1, C # r0 $r1 | C Universidad de Sonora 61 Operaciones lógicas xor $r0, $r1, $r2 # r0 $r1 ^ $r2 xori $r0, $r1, C # r0 $r1 ^ C nor $r0, $r1, $r2 # r0 $r1 nor $r2 Se puede usar como operador not nor $r0, $r1, $zero # r0 not $r1 (a + 0)’ → a’. 1 → a’ Universidad de Sonora 62 Operaciones lógicas ¿Para qué sirven las operaciones lógicas? Los corrimientos a la izquierda (sll y sllv) son una manera rápida de multiplicar un número por una potencia de 2. Los corrimientos a la derecha (srl y srlv) son una manera rápida de dividir un número entre una potencia de 2. El and, or y los corrimientos se pueden usar para extraer y guardar datos dentro de un número. Universidad de Sonora 63 Operaciones lógicas Ejemplo de extracción de un dato. Dado un número binario. x = 11100101 Se desea extraer la información que está en los bits 2 al 5. Recordar que los bits se numeran de derecha a izquierda. Universidad de Sonora 64 Operaciones lógicas Dato original. x = 11100101 Se hace un AND con la máscara 00111100: t = x & 00111100 Ahora t vale 00100100 Se hace un corrimiento a la derecha: t = t >> 2 Ahora t vale 00001001 y es lo que se deseaba. Universidad de Sonora 65 Operaciones lógicas Ejemplo de guardar datos en un número. Guardar los siguientes datos en un número binario de 16 bits: 101 en los bits 1 al 3. 0111 en los bits 8 al 11. 11 en los bits 14 y 15. Dejando los demás en 0. Universidad de Sonora 66 Operaciones lógicas 101 en los bits 1 al 3: t = 101