Práctica 2 - Assembler MIPS Organización del Computador 1 Verano 2014 Se deberán resolver al menos los ejercicios: 3, 6, 7, 9, 17, 22, 25 de la presente guı́a. El resto de los ejercicios son opcionales. Ejercicio 1 Para cada una de las siguientes instrucciones expresadas en lenguaje C a. b. f = g - h; f = g + (h - 5); y asumiendo que f, g, h e i representan a variables enteras de 32-bits declaradas previamente: i) Traducir a código assembler MIPS utilizando la cantidad mı́nima de instrucciones necesarias. ii) ¿Cuántas instrucciones de assembler MIPS fueron necesarias? iii) Si las variables f, g, h e i inicialmente poseen los valores 1, 2, 3 y 4, respectivamente, ¿Cuál es el valor final de f? Para cada una de las siguientes instrucciones expresadas en lenguaje assembler MIPS a. b. addi f, f, 4 add f, g, h add f, i, f i) Traducir a código C utilizando la cantidad mı́nima de instrucciones necesarias. ii) Si las variables f, g, h e i inicialmente poseen los valores 1, 2, 3 y 4, respectivamente, ¿Cuál es el valor final de f? Ejercicio 2 Para cada una de las siguientes instrucciones expresadas en lenguaje C a. b. f = g - f; f = i + (h - 2); y asumiendo que f, g, h e i representan a variables enteras de 32-bits declaradas previamente: i) Traducir a código assembler MIPS utilizando la cantidad mı́nima de instrucciones necesarias. ii) ¿Cuántas instrucciones de assembler MIPS fueron necesarias? iii) Si las variables f, g, h e i poseen los valores 1, 2, 3 y 4, respectivamente, ¿Cuál es el valor final de f? 1 Para cada una de las siguientes instrucciones expresadas en lenguaje assembler MIPS a. b. addi f, f, 4 add f, g, h sub f, i, f i) Traducir a código C utilizando la cantidad mı́nima de instrucciones necesarias. ii) Si las variables f, g, h e i poseen los valores 1, 2, 3 y 4, respectivamente, ¿Cuál es el valor final de f? Ejercicio 3 Para cada una de las siguientes instrucciones expresadas en lenguaje C a. b. f = - g - f; f = g + (-f -5); y asumiendo que f y g representan a variables enteras de 32-bits declaradas previamente: i) Traducir a código assembler MIPS utilizando la cantidad mı́nima de instrucciones necesarias. ii) ¿Cuántas instrucciones de assembler MIPS fueron necesarias? iii) Si las variables f y g poseen los valores 1 y 2, respectivamente, ¿cuál es el valor final de f? Para cada una de las siguientes instrucciones expresadas en lenguaje assembler MIPS a. b. addi f, f, -4 add i, g, h sub f, i, f i) Traducir a código C utilizando la cantidad mı́nima de instrucciones necesarias. ii) Si las variables f, g, h e i poseen los valores 1, 2, 3 y 4, respectivamente, ¿Cuál es el valor final de f? Ejercicio 4 Para cada una de las siguientes instrucciones expresadas en lenguaje C a. b. f = - g - A[4]; B[8] = A[i-j]; asumiendo que las variables f, g, h, i y j son asignadas a los registros $s0, $s1, $s2, $s3 y $s4, respectivamente, y que las direcciones iniciales de los vectores A y B se encuentran en los registros $s6 y $s7, respectivamente: i) Traducir a código assembler MIPS utilizando la cantidad mı́nima de instrucciones necesarias. ii) ¿Cuántas instrucciones de assembler MIPS fueron necesarias? iii) ¿Cuántas registros se necesitaron en cada caso? 2 Para cada uno de los siguientes códigos en lenguaje assembler MIPS a. b. sll add add sll add sll add lw addi lw add sw $s2, $s0, $s0, $t0, $t0, $t1, $t1, $s0, $t2, $t0, $t0, $t0, $s4, 1 $s2, $s3 $s0, $s1 $s0, 2 $s6, $t0 $s1, 2 $s7, $t1 0($t0) $t0, 4 0($t2) $t0, $s0 0($t1) # # # # # $t0 = f * 4 $t0 = &A[f] $t1 = g * 4 $t1 = &B[g] $f = A[f] asumiendo que las variables f, g, h, i y j son asignadas a los registros $s0, $s1, $s2, $s3 y $s4, respectivamente, y que las direcciones iniciales de los vectores A y B se encuentran en los registros $s6 y $s7, respectivamente: i) Traducir a código C utilizando la cantidad mı́nima de instrucciones necesarias. Ejercicio 5 La tabla que se presenta a continuación muestra los valores de un vector almacenado en memoria. Asuma que la dirección inicial del vector se guarda en el registro $s6. a. b. Dirección 20 24 28 32 36 Dirección 24 28 32 36 40 Dato 4 5 3 2 1 Dato 2 4 3 6 1 i) Escribir un programa en C que ordene los datos del vector de menor a mayor. Asumir que los datos de la tabla se encuentran almacenados en una variable de tipo int[ ] denominada Array. La máquina direcciona a byte y una palabra se encuentra compuesta por 4 bytes. ii) Escribir un programa en assembler MIPS que ordene los datos del vector de menor a mayor utilizando la menor cantidad posible de instrucciones. iii) ¿Cuántas instrucciones fueron necesarias en el caso del código assembler MIPS? En el caso de no permitirse el uso del campo inmediato para las instrucciones lw y sw, ¿Cuántas instrucciones serı́an necesarias para realizar el ordenamiento? Dado los siguientes números que se encuentran expresados en base hexadecimal a. b. 0xabcdef12 0x10203040 3 i) Traducirlos a decimal. ii) Mostrar cómo se organizan los datos de la tabla en una máquina con un diseño littleendian. ¿Y en una máquina big-endian? Asumir que los datos son almacenados a partir de la dirección de memoria 0. Ejercicio 6 Para cada una de las siguientes instrucciones expresadas en lenguaje C a. b. f = f + A[2]; B[8] = A[i] + A[j]; asumiendo que las variables f, g, h, i y j son asignadas a los registros $s0, $s1, $s2, $s3 y $s4, respectivamente, y que las direcciones iniciales de los vectores A y B se encuentran en los registros $s6 y $s7, respectivamente y que los elementos de los vectores son palabras de 4-bytes: i) Traducir a código assembler MIPS utilizando la cantidad mı́nima de instrucciones necesarias. ii) ¿Cuántas instrucciones de assembler MIPS fueron necesarias? iii) ¿Cuántos registros se necesitaron en cada caso? Para cada uno de los siguientes códigos en lenguaje assembler MIPS a. b. sub $s0, $s0, $s1 sub $s0, $s0, $s3 add $s0, $s0, $s1 addi $t0, $s6, 4 add $t1, $s6, $0 sw $t1, 0($t0) lw $t0, 0($t0) add $s0, $t16, $t0 asumiendo que las variables f, g, h, i y j son asignadas a los registros $s0, $s1, $s2, $s3 y $s4, respectivamente, y que las direcciones iniciales de los vectores A y B se encuentran en los registros $s6 y $s7, respectivamente: i) Traducir a código C utilizando la cantidad mı́nima de instrucciones necesarias. ii) Asumiendo que los registros $s0, $s1, $s2, y $s3 contienen los valores 0x0000000A, 0x00000014, 0x0000001E y 0x00000028, respectivamente, $s6 contiene el valor 0x00000100, y la memoria contiene los siguientes valores: Dirección 0x00000100 0x00000104 0x00000108 Valor 0x00000064 0x000000C8 0x0000012C ¿Qué valor toma $s0 al final de la ejecución del código assembler ? iii) Para cada instrucción MIPS, mostrar su valor de opcode (OP), source register (RS) y target register (RT). Para cada instrucción de tipo I-type, mostrar el valor del inmediate field y para las instrucciones de tipo R-type mostrar el valor del destination register (RD). 4 Ejercicio 7 Dados: a. b. 0010 0100 1001 0010 0100 1001 0010 0100(2) 0101 1111 1011 1110 0100 0000 0000 0000(2) i) ¿Qué número representa en base 10, asumiendo que es un entero complemento a 2? ii) ¿Qué número representa en base 10, asumiendo que es un entero sin signo? iii) ¿Qué número hexadecimal representa? Dados: a. b. -1(10) 1024(10) i) Representar en binario asumiendo complemento a 2. ii) Representar en hexadecimal asumiendo complemento a 2. Ejercicio 8 Dados: a. b. $s0 = 0x80000000(16) $s0 = 0x00000001(16) $s1 = 0xD0000000(16) $s1 = 0xFFFFFFFF(16) i) ¿Qué valor toma $t0 luego de ejecutar la siguiente instrucción assembler MIPS? add $t0, $s0, $s1 ¿$t0 contiene el resultado esperado o ha habido overf low? ii) ¿Qué valor toma $t0 luego de ejecutar la siguiente instrucción assembler MIPS? sub $t0, $s0, $s1 ¿$t0 contiene el resultado esperado o ha habido overf low? iii) ¿Qué valor toma $t0 luego de ejecutar las siguientes instrucciones assembler MIPS? add $t0, $s0, $s1 add $t0, $t0, $s0 ¿$t0 contiene el resultado esperado o ha habido overf low? Dadas las siguientes instrucciones en assembler MIPS: a. a. add add add add add $s0, $s0, $s0, $s0, $s0, $s0, $s0, $s0, $s0, $s0, $s1 $s1 $s1 $s1 $s1 i) Asumiendo que $s0 = 0x70000000 y $s1 = 0x10000000, ¿Se obtendrá overf low? ii) Asumiendo que $s0 = 0x40000000 y $s1 = 0x20000000, ¿Se obtendrá overf low? iii) Asumiendo que $s0 = 0x8FFFFFFF y $s1 = 0xD0000000, ¿Se obtendrá overf low? 5 Ejercicio 9 Para cada valor del registro $s1: a. b. -1(10) 1024(10) i) Asumiendo que el registro $s0 = 0x70000000, si la instrucción add $s0, $s0, $s1 es ejecutada, ¿Dará overf low? ii) Asumiendo que el registro $s0 = 0x80000000, si la instrucción sub $s0, $s0, $s1 es ejecutada, ¿Dará overf low? iii) Asumiendo que el registro $s0 = 0x7FFFFFFF, si la instrucción sub $s0, $s0, $s1 es ejecutada, ¿Dará overf low? Para cada valor del registro $s1: a. b. 0010 0100 1001 0010 0100 1001 0010 0100(2) 0101 1111 1011 1110 0100 0000 0000 0000(2) i) Asumiendo que el registro $s0 = 0x70000000, si la instrucción add $s0, $s0, $s1 es ejecutada, ¿Dará overf low? ii) Asumiendo que el registro $s0 = 0x70000000, si la instrucción add $s0, $s0, $s1 es ejecutada, ¿Cuál es su resultado en hexadecimal? iii) Asumiendo que el registro $s0 = 0x70000000, si la instrucción add $s0, $s0, $s1 es ejecutada, ¿Cuál es su resultado en decimal? Ejercicio 10 Para número binario que se presenta a continuación: a. b. 0000 0010 0001 0000 1000 0000 0010 0000(2) 0000 0001 0100 1011 0100 1000 0010 0010(2) i) ¿Qué instrucción MIPS representa? ii) ¿En qué formato está codificada la instrucción (I-type, R-type, J-type)? iii) Si fueran bits de datos, ¿Qué número hexadecimal representan? Para cada instrucción: a. b. addi $t0, $t0, 0 sw $t1 32($t2) i) Mostrar el número en hexadecimal que la respresenta. ii) ¿En qué formato está codificada la instrucción (I-type, R-type, J-type)? iii) ¿Cuál es la representación hexadecimal de los campos opcode, Rs y Rt? Para la instrucción R-type, ¿Cuál es la representación hexadecimal de los campos Rd y funct? Para la instrucción I-type, ¿Cuál es la representación del campo inmediato? Ejercicio 11 Dados: a. b. 01084020(16) 02538822(16) 6 i) ¿Qué número representa en base 2? ii) ¿Qué número representa en base 10? iii) ¿Qué instrucción MIPS representa? Dados: a. b. op=0, rs=3, rt=2, rd=3, shamt=0, funct=34 op=0x23, rs=1, rt=2, const=0x4 i) ¿En qué formato está codificada la instrucción (I-type, R-type)? ii) ¿Qué instrucción MIPS describe? iii) ¿Cuál es la representación en base 2 de la instrucción que representa? Ejercicio 12 Dados: a. b. 128 registros 4 veces más instrucciones i) Si el set de instrucciones del procesador MIPS fuera modificado, el formato de instrucción también deberı́a ser modificado. Para cada cambio sugerido arriba, mostrar el tamaño de los campos bits de una instrucción de formato R-type . ¿Qué cantidad de bits se necesita para cada instrucción? ii) Si el set de instrucciones del procesador MIPS fuera modificado, el formato de instrucción también deberı́a ser modificado. Para cada cambio sugerido arriba, mostrar el tamaño de los campos bits de una instrucción de formato I-type . ¿Qué cantidad de bits se necesita para cada instrucción? iii) ¿Qué instrucción MIPS representa? iv) ¿Por qué, el cambio sugerido en la tabla anterior, podrı́a disminuir el tamaño de un programa en assembler MIPS? Dados: a. b. 01090012(16) AD090012(16) i) ¿Qué número representa en base 10? ii) ¿Qué instrucción MIPS representa? iii) ¿Qué tipo de instrucción representa (I-type, R-type, J-type)? ¿Cuáles son los valores de los campos op y rt? Ejercicio 13 Dados: a. b. $t0 = 0xAAAAAAAA, $t1 = 0x12345678 $t0 = 0xF00DD00D, $t1 = 0x11111111 7 i) ¿Cuál es el valor de $t2 luego de ejecutar las siguientes instrucciones? sll $t2, $t0, 44 or $t2, $t2, $t1 ii) ¿Cuál es el valor de $t2 luego de ejecutar las siguientes instrucciones? sll $t2, $t0, 4 andi $t2, $t2, -1 iii) ¿Cuál es el valor de $t2 luego de ejecutar las siguientes instrucciones? srl $t2, $t0, 3 andi $t2, $t2, 0xFFEF Dados: a. b. sll andi andi srl $t2, $t2, $t2, $t2, $t0, 1 $t2, -1 $t1, 0x00F0 2 i) Asumiendo que $t0 = 0x0000A5A5 y $t1 = 00005A5A ¿Cuál es el valor de $t2 luego de ejecutar las instrucciones de la tabla? ii) Asumiendo que $t0 = 0xA5A50000 y $t1 = A5A50000 ¿Cuál es el valor de $t2 luego de ejecutar las instrucciones de la tabla? iii) Asumiendo que $t0 = 0xA5A5FFFF y $t1 = A5A5FFFF ¿Cuál es el valor de $t2 luego de ejecutar las instrucciones de la tabla? Ejercicio 14 Sólo a efectos de mantener la numeración sincronizada con el libro. Ejercicio 15 Dadas: a. b. not $t1, $t2 // invierte bit a bit orn $t1, $t2, $t3 // OR bit a bit de $t2, $t3 i) Las instrucciones incluidas en la tabla no se encuentran incluidas en el set de instrucciones de assembler MIPS, pero en la misma tabla se adjunta una mı́nima descripción de lo que realizan. Dados los valores de $t2 = 0x00FFA5A5 y $t3 = 0xFFFF003C, ¿Cuál es valor de $t1 luego de ejecutar la instrucción? ii) La instrucciones incluidas en la tabla no se encuentran incluidas en el set de instrucciones de assembler MIPS, las mismas pueden ser recreadas utilizando una o más instrucciones de assembler MIPS. Mostrar un conjunto mı́nimo de instrucciones MIPS que puedan recrear las instrucciones de la tabla. iii) Para la secuencia de instrucciones del punto anterior, mostrar la representación a nivel bit de cada instrucción. 8 Dadas: a. b. A = B | !A; A = C[0] << 4; i) La tabla muestra diferentes sentencias en C que utilizan operadores lógicos. Si la posición de memoria C[0] contiene el valor entero 0x00001234, y los valores iniciales de los enteros A y B son 0x00000000 y 0x00002222, ¿Cuál es el valor resultante de A? ii) Para las sentencias en C de la tabla, escribir una secuencia mı́nima de instrucciones de assembler MIPS que realicen las mismas operaciones. Asumir que $t1 = A, $t2 = B, y $s1 es la dirección inicial de C. iii) Para la secuencia de instrucciones del punto anterior, mostrar la representación de cada una a nivel de bits. Ejercicio 16 Dados: a. b. $t0 = 0010 0100 1001 0010 0100 1001 0010 0100(2) $t0 = 0101 1111 1011 1110 0100 0000 0000 0000(2) i) Si $t1 = 0011 1111 1111 1000 0000 0000 0000 0000(2) ¿Cuál es valor de $t2 luego de la ejecución de las siguientes instrucciones? ELSE: DONE: slt beq j addi $t2, $t0, $t1 $t2, $0, ELSE DONE: $t2, $0, 2 ii) Dada la instrucción slti que se muestra a continuación, ¿Para qué valores de X, si es que existe alguno, $t2 será igual a 1? slti $t2, $t0, X iii) Suponga que el program counter (PC) = 0x0000 0020. ¿Es posible usar la instrucción jump (j) de assembler MIPS para asignarle al PC la dirección de la tabla? ¿Es posible utilizar el branch-on-equal (beq) de la instrucción assembler MIPS para asignarle al PC la dirección de la tabla? Dados: a. b. $t0=0x00101000 $t0=0x80001000 i) ¿Cuál es valor de $t2 luego de la ejecución de las siguientes instrucciones? ELSE: DONE: slt beq j addi $t2, $0, $t0 $t2, $0, ELSE DONE: $t2, $t2, 2 9 ii) ¿Cuál es valor de $t2 luego de la ejecución de las siguientes instrucciones? sll slt $t0, $t0, 2 $t2, $t0, $0 iii) Suponga que el program counter (PC) = 0x2000 0000. ¿Es posible usar la instrucción jump (j) de assembler MIPS para asignarle al PC la dirección de la tabla? ¿Es posible utilizar el branch-on-equal (beq) de la instrucción assembler MIPS para asignarle al PC la dirección de la tabla? Prestar atención al formato de las instrucciones J-type. Ejercicio 17 Dadas: a. b. subi $t2, $t3, 5 rpt $t2, loop # R[rt] = R[rs] - SignExtImm # if(R[rs]>0) R[rs]=R[rs]-1, PC=PC+4+BranchAddr i) La tabla contiene instrucciones que no se encuentran incluidas en el set de instrucciones de assembler MIPS y una descripción de su funcionamiento. ¿Por qué estas instrucciones no han sido incluidas en el set de instrucciones MIPS? ii) Si estas instrucciones tuvieran que ser implementadas dentro del set de instrucciones MIPS, ¿Cuál serı́a el formato de instrucción más apropiado? iii) Escribir la secuencia más corta de instrucciones MIPS que ejecuten la instrucción. Dados: a. LOOP: b. DONE: LOOP: addi $s2, $s2, 2 subi $t1, $t1, 1 bne $t1, $0, LOOP slt beq subi addi $t2, $t2, $t1, $s2, $0, $t1 $0, DONE $t1, 1 $s2, 2 DONE: i) ¿Cuál es el valor de $s2, asumiendo que inicialmente $s2=0 y $t1=10? ii) Escribir una rutina equivalente en C. Asumir que los registros $s1, $s2, $t1, y $t2 son representados por los enteros A, B, i y temp, respectivamente. iii) Asumiendo que incialmente $t1=N, ¿Cuántas instrucciones MIPS son ejecutadas? Ejercicio 18 Dados: a. b. for(i=0; i<a; i++) a+= b; for(i=0; i<a; i++) for(j=0; j<b; j++) D[4*j] = i + j; i) Dibujar un diagrama de flujo del código C ii) Trasladar el código C a assembler MIPS. Usar la mı́nima cantidad de instrucciones posibles. Asumir que los valores de a, b, i y j se encuentran almacenados en los registros $s0, $s1, $t0 y $t1, respectivamente. Además, asumir que el registro $s2 contiene la posición inicial del vector D 10 iii) ¿Cuántas instrucciones MIPS toma implementar el código C? Si las variables a y b son inicializadas en 10 y 1 respectivamente y todos los elementos de D son inicializados en 0, ¿Cuántas instrucciones MIPS son ejecutadas al finalizar el ciclo? Dados: a. LOOP: b. LOOP: addi lw add lw add addi subi bne addi lw add addi addi slti bne $t1, $s1, $s1, $s1, $s1, $s0, $t1, $t1, $t1, $s1, $s2, $s0, $t1, $t2, $t2, $0, 50 0($s1) $s2, $s1 4($s0) $s2, $s1 $s0, 8 $t1, 1 $0, LOOP $0, $0 0($s0) $s2, $s1 $s0, 4 $t1, 1 $t1, 100 $s0, LOOP i) ¿Cuántas instrucciones MIPS se ejecutan? ii) Escribir una rutina equivalente en C. Asumir que los registros $t1, $s2 y $s0 son representados por los enteros i, result y la dirección inicial del vector MemArray, respectivamente. iii) Rescribir el ciclo para reducir la cantidad de instrucciones MIPS ejecutadas. Ejercicio 19 Dados: a. b. int fib(int n){ if (n==0) return 0; else if (n==1) return 1; else fib(n-1) + fib(n-2); } int positive(int a, int b){ if (addit(a, b) >0) return 1; else return 0; } int addit(int a, int b){ return a+b; } 11 Conservado Registros guardados: $s0-$s7 Registro stack pointer: $sp Registro de dirección de retorno: $ra Stack por encima de stack pointer No conservado Registros temporales: $t0-$t9 Registros de argumentos: $a0-$a3 Registros con valores de retorno: $v0-$v1 Stack por debajo de stack pointer Cuadro 1: Que debe ser conservado y que no, en un llamado a procedimiento. Si el software se basa en los registros frame pointer o global pointer, también deben ser conservados. (Tabla obtenida de la Figura 2.11 del libro) Nombre $zero $v0-$v1 Número de registro 0 2-3 $a0-$a3 $t0-$t7 $s0-$s7 $t8-$t9 $gp $sp $fp $ra 4-7 8-15 16-23 24-25 28 29 30 31 Uso Valor constante cero Valores para resultados y evaluación de expresiones Argumentos Temporales Guardados Más temporales Global Pointer Stack Pointer Frame Pointer Dirección de retorno ¿Conservado en la llamada? n.a. no no no si no si si si si Cuadro 2: Convención de uso de registros MIPS. El registro 1, llamado $at, es reservado para el ensamblador, y los registros 26-27, denominados $k0-$k1, son reservados para el sistema operativo. (Tabla obtenida de la Figura 2.14 del libro) i) Implementar el código C en assembler MIPS. ¿Cuántas instrucciones MIPS son necesarias para ejecutar la función? ii) La funciones generalmente pueden ser implementadas por los compiladores in-line. Una función in-line es cuando el cuerpo de la función es copiado dentro del espacio de programa, eliminando la sobrecarga por la llamada a la función. Implementar en assembler MIPS una versión in-line del código C. ¿Cuál es la reducción en cantidad de instrucciones MIPS necesarias para ejecutar la función? Asumir que la variable n se inicializa en 5. iii) Para cada llamada a función, mostrar el contenido del stack luego de que la llamada sea hecha. Asumir que el stack pointer se encuentra originalmente en la dirección 0x7FFFFFFC y sigue la convensión de registros especificada en el Cuadro 1. La función f llama a otra función: func, cuyo código C (de la función func) ya ha sido compilada en otro módulo usando la convención de llamadas de MIPS del Cuadro 2. La declaración de la función func es int func(int a, int b); El código de la función f se detalla a continuación: a. b. int f(int a, int b, int c, int d){ return func(func(a,b),c+d); } int f(int a, int b, int c, int d){ if(a+b>c+d) return func(a+b,c+d); return func(c+d,a+b); } 12 i) Trasladar la función f a assembler MIPS, usando la convención de llamadas MIPS del Cuadro 2. Si necesita utilizar los registros $t0 a $t7, utilizar primero los de menor numeración. ii) ¿Puede utilizarse la optimización tail-call en esta función? Si la respuesta es no, justificar. Si la respuesta es sı́, ¿Cuál es la diferencia, en cantidad de instrucciones ejecutadas en f, con y sin la optimización? iii) Justo antes de que la función f del punto previo retorne, ¿Cuál es el contenido de los registros $t5, $s3, $ra y $sp?. Tener en mente que se conoce lo que hace la función f, pero de la función func sólo se conoce su declaración. Ejercicio 20 Sean: a. FACT: L1: b. FACT: L1: sw sw addi slti beq addi addi jr addi jal addi lw lw mul jr addi sw sw add slti beq mul addi jr addi jal addi lw lw addi jr $ra, 4($sp) $a0, 0($sp) $sp, $sp, -8 $t0, $a0, 1 $t0, $0, L1 $v0, $0, 1 $sp, $sp, 8 $ra $a0, $a0, -1 FACT $sp, $sp, 8 $a0, 0($sp) $ra, 4($sp) $v0, $a0, $v0 $ra $sp, $sp, 8 $ra, 4($sp) $a0, 0($sp) $s0, $0, $a0 $t0, $a0, 2 $t0, $0, L1 $v0, $s0, $v0 $sp, $sp, -8 $ra $a0, $a0, -1 FACT $v0, $0, 1 $a0, 0($sp) $ra, 4($sp) $sp, $sp, -8 $ra i) Los programas (en assembler MIPS) de la tabla computan el factorial de un número dado. Dicho número es ingresado a través del registro $a0, y el resultado es devuelto a través del registro $v0. En ambos códigos hay errores. Corregirlos. ii) Asumir que para ambos programas recursivos, el valor de entrada es 4. Rescribir dichos programas para que funcionen de manera no recursiva. Restringir el uso de registros sólo a $s0-$s7. ¿Cuántas instrucciones se ejecutan en la versión recursiva? ¿Y en la no recursiva? iii) Mostrar el contenido del stack después de cada llamada a función, asumiendo que el valor de entrada es 4. 13 Sean: a. FIB: L1: EXIT: b. FIB: L1: EXIT: addi sw sw sw slti beq addi j addi jal addi addi jal add lw lw lw addi jr addi sw sw sw slti beq addi j addi jal addi jal add lw lw lw addi jr $sp, $ra, $s1, $a0, $t0, $t0, $v0, EXIT $a0, FIB $s1, $a0, FIB $v0, $ra, $a0, $s1, $sp, $ra $sp, $ra, $s1, $a0, $t0, $t0, $v0, EXIT $a0, FIB $a0, FIB $v0, $a0, $s1, $ra, $sp, $ra $sp, -12 0($sp) 4($sp) 8($sp) $a0, 1 $0, L1 $a0, $0 $a0, -1 $v0, $0 $a0, -1 $v0, $s1 0($sp) 8($sp) 4($sp) $sp, 12 $sp, -12 8($sp) 4($sp) 0($sp) $a0, 3 $0, L1 $0, 1 $a0, -1 $a0, -2 $v0, $s1 0($sp) 4($sp) 8($sp) $sp, 12 i) Los programas (en assembler MIPS) de la tabla computan Fibonacci de un número dado. Dicho número es ingresado a través del registro $a0, y el resultado es devuelto a través del registro $v0. En ambos códigos hay errores. Corregirlos. ii) Asumir que para ambos programas recursivos, el valor de entrada es 4. Rescribir dichos programas para que funcionen de manera no recursiva. Restringir el uso de registros sólo a $s0-$s7. ¿Cuántas instrucciones se ejecutan en la versión recursiva? ¿Y en la no recursiva? iii) Mostrar el contenido del stack después de cada llamada a función, asumiendo que el valor de entrada es 4. Ejercicio 21 Asumiendo que el stack y el segmento estático de datos se encuentran vacı́os, y el stack y el global pointer comienzan en la dirección 0x7FFF FFFc y 0x1000 8000, respectivamente. Además, asumiendo la convención de llamadas del Cuadro 1 del ejercicio 14 19 y que los parámetros de entrada a función son pasados a través de los registros $a0-$a3, y que el resultado se devuelve a través de $r0 y que las funciones leaf function pueden utilizar solamente registros guardados; dados: a. b. int my global = 100; main(){ int x = 10; int y = 20; int z; z = my function(x,y); } int my function(int x, int y){ return x - y + my global; } int my global = 100; main(){ int z; my global+=1; int z; z = leaf function(my global); } int leaf function(int x){ return x - 1; } i) Transcribir los programas a assembler MIPS. ii) Mostrar el contenido del stack y del segmento estático de datos después de cada llamada a función. iii) Si la función leaf function pudiera usar los registros temporales ($t0, $t1, etc.), escribir el código MIPS para cada programa. Dados los siguientes programas escritos en assembler MIPS que siguen la convención del Cuadro 2 del ejercicio 19: a. f: b. L: f: L: add bnez sub jr add slt move beqz jr move jal $v0, $a1, $a0 $a2, L $v0, $a0, $a1 $v0 $a2, $a3, $a2 $a2, $a2, $a0 $v0, $a1 $a2, L $ra $a0, $a1 g ; Tail call i) El código contiene un error y viola la convención de llamada de MIPS. ¿Cuál es el error y cómo puede solucionarse? ii) ¿Cuál es el código equivalente en C de este programa? Asumir que los argumento de la función en C son denominados a, b, c, etc. iii) Mostrar el contenido del stack después de cada llamada a función, asumiendo que el valor de entrada es 4. En el punto que esta función es llamada, los registros $a0, $a1, $a2 y $a3 contienen los valores 1, 100, 1000 y 30, respectivamente. ¿Qué valor retorna la función? Si otra función g es llamada desde f, asumir que g siempre devuelve 500. 15 Ejercicio 22 Dadas las siguientes cadenas de caracteres: a. b. hello world 0123456789 i) Transcribirlos a los valores en bytes hexadecimales ASCII . ii) Transcribirlos a Unicode de 16-bits (usando la notación hex y el Basic Latin character set). Dados los siguientes valores de caracteres ASCII hexadecimales: a. b. 41 44 44 4D 49 50 53 i) trasladarlos a texto. Ejercicio 23 Sean: a. b. cadena de enteros decimales positivos y negativos enteros hexadecimales positivos i) Escribir un programa en lenguaje ensamblador MIPS que convierta una cadena de números ASCII a un entero, bajo las condiciones que figuran en la tabla. El registro $a0 contiene la dirección de la cadena de dı́gitos que contiene alguna combinación de 0 y 9 y que finaliza con un terminador null. El programa debe calcular el valor entero equivalente a la cadena y almacenarlo en el registro $v0. Si en la cadena aparece un caracter que no se corresponde con un dı́gito decimal, el programa debe terminar su ejecución almacenando en el registro $v0 el valor -1. A modo de ejemplo, si el registro $a0 apunta a la secuencia de tres bytes 50(10) , 52(10) y 0(10) (que corresponde a la cadena 24 con terminador null), al terminar el programa deberı́a retornar el valor 24(10) en el registro $v0. Ejercicio 24 Asumiendo que los registros $t1 y $t2 contienen la direcciones 0x1000 0000 y 0x1000 0010, respectivamente, y que la arquitectura MIPS utiliza el modo de direccionamiento big-endian. Sean: a. b. lbu sw lb sh $t0, $t0, $t0, $t0, 0($t1) 0($t2) 0($t1) 0($t2) i) Asumiendo que el dato en la dirección de memoria 0x1000 0000 es: 1000 0000 12 34 56 78 ¿Qué valor es almacenado en la dirección apuntada por el registro $t2? Asumir que la dirección de memoria apuntada a $t2 es inicializada en 0xFFFF FFFF ii) Asumiendo que el dato en la dirección de memoria 0x1000 0000 es: 1000 0000 80 80 80 80 ¿Qué valor es almacenado en la dirección apuntada por el registro $t2? Asumir que la dirección de memoria apuntada a $t2 es inicializada en 0x0000 0000 16 iii) Asumiendo que el dato en la dirección de memoria 0x1000 0000 es: 1000 0000 11 00 00 FF ¿Qué valor es almacenado en la dirección apuntada por el registro $t2? Asumir que la dirección de memoria apuntada a $t2 es inicializada en 0x5555 5555 Ejercicio 25 Dados: a. a. 0010 0000 0000 0001 0100 1001 0010 0100(2) 0000 1111 1011 1110 0100 0000 0000 0000(2) i) Escribir un programa en assembler MIPS que cree las constantes de 32-bits de la tabla y que almacene dicho valor en el registro $t1. ii) Si el valor actual del PC=0x00000000, ¿Es posible utilizar una sola instrucción jump para obtener un PC con el valor de la tabla? iii) Si el valor actual del PC=0x00000600, ¿Es posible utilizar una sola instrucción branch para obtener un PC con el valor de la tabla? iv) Si el valor actual del PC=0x1FFFF000, ¿Es posible utilizar una sola instrucción branch para obtener un PC con el valor de la tabla? v) Si el campo inmediato de una instrucción MIPS fuera de solo 8-bits de ancho, escribir un código MIPS que cree las constantes de 32-bits de la tabla y almacene sus valores en el registro $t1. No está permitido utilizar la instrucción lui. Dados: a. b. lui addi lui andi $t0, $t0, $t0, $t0, 0x1234 $t0, 0x5678 0x1234 $t0, 0x5678 i) ¿Cuál es el valor del registro $t0 luego de ejecutar el código de la tabla? ii) Escribir un código C equivalente al código assembler de la tabla. Asumir que la constante más grande que se puede cargar en un entero de 32-bits son 16-bits. Ejercicio 26 Dados: a. a. 0002 0000(16) FFFF FF00(16) i) Si el PC=0x0000 0000, ¿Cuántas instrucciones branch (no jump) son necesarias para alcanzar la dirección de la tabla? ii) Si el PC=0x0000 0000, ¿Cuántas instrucciones jump (no branch, ni jump a registro) son necesarias para alcanzar la dirección de la tabla? iii) Para reducir el tamaño de un programa MIPS, los diseñadores de MIPS han decidido recortar el campo inmediato de las instrucciones de tipo I-type de 16-bits a 8-bits. Si el PC=0x0000 0000, ¿Cuántas instrucciones branch son necesarias para setear al PC la dirección de la tabla? Dados: a. b. 128 registros 4 veces más operaciones diferentes 17 i) Si el set de instrucciones del procesador MIPS es modificado, el formato de instrucción también deberá ser modificado. Para cada cambio sugerido en la tabla, ¿Cuál es el impacto sobre el rango de direcciones para una instrucción beq? Asumir que todas las instrucciones se mantienen en un largo de 32-bits y cada cambio realizado al formato de instrucción de las instrucciones de tipo I-type sólo incrementa/decrementa el campo inmediato de la instrucción beq. ii) Si el set de instrucciones del procesador MIPS es modificado, el formato de instrucción también deberá ser modificado. Para cada cambio sugerido en la tabla, ¿Cuál es el impacto sobre el rango de direcciones para una instrucción jump? Asumir que todas las instrucciones se mantienen en un largo de 32-bits y cada cambio realizado al formato de instrucción de las instrucciones de tipo J-type sólo impacta en el campo de dirección de la instrucción jump. iii) Si el set de instrucciones del procesador MIPS es modificado, el formato de instrucción también deberá ser modificado. Para cada cambio sugerido en la tabla, ¿Cuál es el impacto sobre el rango de direcciones para una instrucción jump de registro? Asumir que todas las instrucciones se mantienen en un largo de 32-bits. Ejercicio 27 Sean: a. Direccionamiento base o desplazamiento a. Direccionamiento pseudo-directo i) Dado los modos de direccionamiento de MIPS, que se encuentran en la tabla anterior, dar un ejemplo de una instrucción MIPS que muestre dicho modo de direccionamiento. ii) Para la instrucción del punto anterior, ¿Cuál es el tipo de instrucción utilizada (I-type, etc.)? iii) Listar las ventajas y desventajas de cada modo de direccionamiento. Escribir un código MIPS que muestre dichas ventajas y desventajas. Sean: a. b. 0x00400000 ... 0x00403100 0x00000100 ... 0x04000010 beq $s0, $0, FAR FAR: addi j $s0, $s0, 1 AWAY AWAY: addi $s0, $s0, 1 i) Para las sentencias MIPS de la tabla, mostrar su repesentación a nivel bit en hexadecimal de cada una. ii) Al reducir el tamaño del campo inmediato de las instrucciones de tipo I-type y J-type, se pueden ahorrar los bits necesarios para representar este tipo de instrucciones. Si el campo inmediato de las instrucciones I-type fuera de 8-bits y el de las J-type fuera de 18-bits, rescribir el código MIPS de la tabla para que refleje dicho cambio. No está permitido utilizar la instrucción lui. iii) ¿Cuántas instrucciones de más se necesitan para ejecutar el código del punto anterior, comparado con el de la tabla? 18 MIPS Reference Data Card (“Green Card”) 1. Pull along perforation to separate card 2. Fold bottom side (columns 3 and 4) together M I P S Reference Data CORE INSTRUCTION SET FORNAME, MNEMONIC MAT OPERATION (in Verilog) add Add R R[rd] = R[rs] + R[rt] Add Immediate addi Add Imm. Unsigned addiu R[rt] = R[rs] + SignExtImm (1,2) I R[rt] = R[rs] + SignExtImm (2) addu R R[rd] = R[rs] + R[rt] And and R R[rd] = R[rs] & R[rt] And Immediate andi I Branch On Equal beq I Branch On Not Equal bne I j J Jump And Link jal J R[31]=PC+8;PC=JumpAddr Jump Register jr ll R PC=R[rs] R[rt]={24’b0,M[R[rs] I +SignExtImm](7:0)} R[rt]={16’b0,M[R[rs] I +SignExtImm](15:0)} I R[rt] = M[R[rs]+SignExtImm] Load Upper Imm. lui I R[rt] = {imm, 16’b0} Load Word lw I R[rt] = M[R[rs]+SignExtImm] Nor nor R R[rd] = ~ (R[rs] | R[rt]) Or or R R[rd] = R[rs] | R[rt] Or Immediate ori I Set Less Than slt R R[rd] = (R[rs] < R[rt]) ? 1 : 0 Set Less Than Imm. slti Set Less Than Imm. sltiu Unsigned Set Less Than Unsig. sltu 9hex 0 / 24hex Jump lhu 8hex 0 / 21hex R[rt] = R[rs] & ZeroExtImm if(R[rs]==R[rt]) PC=PC+4+BranchAddr if(R[rs]!=R[rt]) PC=PC+4+BranchAddr PC=JumpAddr Load Halfword Unsigned Load Linked OPCODE / FUNCT (Hex) (1) 0 / 20hex I Add Unsigned Load Byte Unsigned lbu ARITHMETIC CORE INSTRUCTION SET 1 (3) chex (4) 4hex (4) (5) (5) 5hex 2hex 3hex 0 / 08hex (2) (2) (2,7) 24hex 25hex 30hex fhex (2) 23hex 0 / 27hex 0 / 25hex R[rt] = R[rs] | ZeroExtImm (3) dhex 0 / 2ahex FLOATING-POINT INSTRUCTION FORMATS R[rt] = (R[rs] < SignExtImm)? 1 : 0 (2) ahex R[rt] = (R[rs] < SignExtImm) bhex I ?1:0 (2,6) 0 / 2bhex R R[rd] = (R[rs] < R[rt]) ? 1 : 0 (6) 0 / 00hex R R[rd] = R[rt] << shamt I Shift Left Logical sll Shift Right Logical srl Store Byte sb Store Conditional sc Store Halfword sh Store Word sw R R[rd] = R[rt] >> shamt M[R[rs]+SignExtImm](7:0) = I R[rt](7:0) M[R[rs]+SignExtImm] = R[rt]; I R[rt] = (atomic) ? 1 : 0 M[R[rs]+SignExtImm](15:0) = I R[rt](15:0) I M[R[rs]+SignExtImm] = R[rt] Subtract sub R R[rd] = R[rs] - R[rt] Subtract Unsigned subu 28hex (2,7) 38hex (2) (2) 31 31 rs 26 25 opcode I 31 rs 26 25 opcode J 31 rt 21 20 29hex 2bhex (1) 0 / 22hex 0 / 23hex rd 16 15 shamt 11 10 rt 21 20 funct 6 5 0 immediate 16 15 0 address 26 25 ft 21 20 fmt 26 25 fs 16 15 ft 21 20 fd 11 10 funct 6 5 16 15 REGISTER NAME, NUMBER, USE, CALL CONVENTION PRESERVED ACROSS NAME NUMBER USE A CALL? $zero 0 The Constant Value 0 N.A. $at 1 Assembler Temporary No Values for Function Results $v0-$v1 2-3 No and Expression Evaluation $a0-$a3 4-7 Arguments No $t0-$t7 8-15 Temporaries No $s0-$s7 16-23 Saved Temporaries Yes $t8-$t9 24-25 Temporaries No $k0-$k1 26-27 Reserved for OS Kernel No $gp 28 Global Pointer Yes $sp 29 Stack Pointer Yes $fp 30 Frame Pointer Yes $ra 31 Return Address Yes 0 Copyright 2009 by Elsevier, Inc., All rights reserved. From Patterson and Hennessy, Computer Organization and Design, 4th ed. 0 immediate PSEUDOINSTRUCTION SET NAME MNEMONIC OPERATION blt if(R[rs]<R[rt]) PC = Label Branch Less Than bgt if(R[rs]>R[rt]) PC = Label Branch Greater Than ble if(R[rs]<=R[rt]) PC = Label Branch Less Than or Equal bge if(R[rs]>=R[rt]) PC = Label Branch Greater Than or Equal li R[rd] = immediate Load Immediate move R[rd] = R[rs] Move R R[rd] = R[rs] - R[rt] (1) May cause overflow exception (2) SignExtImm = { 16{immediate[15]}, immediate } (3) ZeroExtImm = { 16{1b’0}, immediate } (4) BranchAddr = { 14{immediate[15]}, immediate, 2’b0 } (5) JumpAddr = { PC+4[31:28], address, 2’b0 } (6) Operands considered unsigned numbers (vs. 2’s comp.) (7) Atomic test&set pair; R[rt] = 1 if pair atomic, 0 if not atomic opcode 31 fmt 26 25 opcode FI BASIC INSTRUCTION FORMATS R opcode FR 0 / 02hex (2) OPCODE / FMT /FT FOR/ FUNCT NAME, MNEMONIC MAT OPERATION (Hex) Branch On FP True bc1t FI if(FPcond)PC=PC+4+BranchAddr (4) 11/8/1/-Branch On FP False bc1f FI if(!FPcond)PC=PC+4+BranchAddr(4) 11/8/0/-div R Lo=R[rs]/R[rt]; Hi=R[rs]%R[rt] 0/--/--/1a Divide divu Divide Unsigned R Lo=R[rs]/R[rt]; Hi=R[rs]%R[rt] (6) 0/--/--/1b add.s FR F[fd ]= F[fs] + F[ft] 11/10/--/0 FP Add Single FP Add {F[fd],F[fd+1]} = {F[fs],F[fs+1]} + add.d FR 11/11/--/0 Double {F[ft],F[ft+1]} 11/10/--/y FP Compare Single c.x.s* FR FPcond = (F[fs] op F[ft]) ? 1 : 0 FP Compare FPcond = ({F[fs],F[fs+1]} op c.x.d* FR 11/11/--/y Double {F[ft],F[ft+1]}) ? 1 : 0 * (x is eq, lt, or le) (op is ==, <, or <=) ( y is 32, 3c, or 3e) FP Divide Single div.s FR F[fd] = F[fs] / F[ft] 11/10/--/3 FP Divide {F[fd],F[fd+1]} = {F[fs],F[fs+1]} / div.d FR 11/11/--/3 Double {F[ft],F[ft+1]} 11/10/--/2 FP Multiply Single mul.s FR F[fd] = F[fs] * F[ft] FP Multiply {F[fd],F[fd+1]} = {F[fs],F[fs+1]} * mul.d FR 11/11/--/2 Double {F[ft],F[ft+1]} 11/10/--/1 FP Subtract Single sub.s FR F[fd]=F[fs] - F[ft] FP Subtract {F[fd],F[fd+1]} = {F[fs],F[fs+1]} sub.d FR 11/11/--/1 Double {F[ft],F[ft+1]} lwc1 I F[rt]=M[R[rs]+SignExtImm] Load FP Single (2) 31/--/--/-Load FP F[rt]=M[R[rs]+SignExtImm]; (2) ldc1 I 35/--/--/-Double F[rt+1]=M[R[rs]+SignExtImm+4] mfhi R R[rd] = Hi 0 /--/--/10 Move From Hi mflo R R[rd] = Lo 0 /--/--/12 Move From Lo 10 /0/--/0 Move From Control mfc0 R R[rd] = CR[rs] mult R {Hi,Lo} = R[rs] * R[rt] 0/--/--/18 Multiply Multiply Unsigned multu R {Hi,Lo} = R[rs] * R[rt] (6) 0/--/--/19 sra R R[rd] = R[rt] >>> shamt 0/--/--/3 Shift Right Arith. swc1 I M[R[rs]+SignExtImm] = F[rt] Store FP Single (2) 39/--/--/-Store FP M[R[rs]+SignExtImm] = F[rt]; (2) sdc1 I 3d/--/--/-Double M[R[rs]+SignExtImm+4] = F[rt+1] 2 0 IEEE 754 FLOATING-POINT STANDARD 4 IEEE 754 Symbols Exponent Fraction Object 0 0 ±0 0 ≠0 ± Denorm 1 to MAX - 1 anything ± Fl. Pt. Num. ±∞ MAX 0 MAX ≠0 NaN S.P. MAX = 255, D.P. MAX = 2047 (-1)S × (1 + Fraction) × 2(Exponent - Bias) where Single Precision Bias = 127, Double Precision Bias = 1023. IEEE Single Precision and Double Precision Formats: S 31 Exponent 23 22 S 63 Fraction 30 0 Exponent 62 Fraction 52 51 0 MEMORY ALLOCATION $sp 7fff fffchex $gp 1000 8000hex STACK FRAME ... Argument 6 Argument 5 $fp Saved Registers Stack Stack Grows Dynamic Data Static Data Local Variables 1000 0000hex pc Higher Memory Addresses $sp Text 0040 0000hex Lower Memory Addresses Reserved 0hex DATA ALIGNMENT Double Word Word Word Halfword Halfword Halfword Halfword Byte Byte Byte Byte Byte Byte Byte Byte 0 1 2 3 4 5 6 7 Value of three least significant bits of byte address (Big Endian) EXCEPTION CONTROL REGISTERS: CAUSE AND STATUS B Interrupt Exception D Mask Code 31 15 8 Pending Interrupt 15 8 6 2 U M E I L E 4 1 0 BD = Branch Delay, UM = User Mode, EL = Exception Level, IE =Interrupt Enable EXCEPTION CODES Number Name Cause of Exception Number Name Cause of Exception 0 Int Interrupt (hardware) 9 Bp Breakpoint Exception Address Error Exception Reserved Instruction 4 AdEL 10 RI (load or instruction fetch) Exception Address Error Exception Coprocessor 5 AdES 11 CpU (store) Unimplemented Bus Error on Arithmetic Overflow 6 IBE 12 Ov Instruction Fetch Exception Bus Error on 7 DBE 13 Tr Trap Load or Store 8 Sys Syscall Exception 15 FPE Floating Point Exception SIZE PREFIXES (10x for Disk, Communication; 2x for Memory) PREPREPREPRESIZE FIX SIZE FIX SIZE FIX SIZE FIX 10-3 milli- 10-15 femto103, 210 Kilo- 1015, 250 Peta6 20 18 60 Mega- 10 , 2 Exa10-6 micro- 10-18 atto10 , 2 9 30 21 70 10 , 2 Giga- 10 , 2 Zetta- 10-9 nano- 10-21 zepto1012, 240 Tera- 1024, 280 Yotta- 10-12 pico- 10-24 yoctoThe symbol for each prefix is just its first letter, except µ is used for micro. Copyright 2009 by Elsevier, Inc., All rights reserved. From Patterson and Hennessy, Computer Organization and Design, 4th ed. MIPS Reference Data Card (“Green Card”) 1. Pull along perforation to separate card 2. Fold bottom side (columns 3 and 4) together 3 OPCODES, BASE CONVERSION, ASCII SYMBOLS MIPS (1) MIPS (2) MIPS Hexa- ASCII Hexa- ASCII DeciDeciopcode funct funct Binary deci- Chardeci- Charmal mal (31:26) (5:0) (5:0) mal acter mal acter sll 00 0000 0 0 NUL 64 40 @ add.f (1) sub.f 00 0001 1 1 SOH 65 41 A j srl mul.f 00 0010 2 2 STX 66 42 B jal sra div.f 00 0011 3 3 ETX 67 43 C beq sllv sqrt.f 00 0100 4 4 EOT 68 44 D bne abs.f 00 0101 5 5 ENQ 69 45 E blez srlv mov.f 00 0110 6 6 ACK 70 46 F bgtz srav neg.f 00 0111 7 7 BEL 71 47 G addi jr 00 1000 8 8 BS 72 48 H addiu jalr 00 1001 9 9 HT 73 49 I slti movz 00 1010 10 a LF 74 4a J sltiu movn 00 1011 11 b VT 75 4b K andi syscall round.w.f 00 1100 12 c FF 76 4c L ori break trunc.w.f 00 1101 13 d CR 77 4d M xori ceil.w.f 00 1110 14 e SO 78 4e N lui sync floor.w.f 00 1111 15 f SI 79 4f O mfhi 01 0000 16 10 DLE 80 50 P mthi (2) 01 0001 17 11 DC1 81 51 Q mflo movz.f 01 0010 18 12 DC2 82 52 R mtlo movn.f 01 0011 19 13 DC3 83 53 S 01 0100 20 14 DC4 84 54 T 01 0101 21 15 NAK 85 55 U 01 0110 22 16 SYN 86 56 V 01 0111 23 17 ETB 87 57 W mult 01 1000 24 18 CAN 88 58 X multu 01 1001 25 19 EM 89 59 Y div 01 1010 26 1a SUB 90 5a Z divu 01 1011 27 1b ESC 91 5b [ 01 1100 28 1c FS 92 5c \ 01 1101 29 1d GS 93 5d ] 01 1110 30 1e RS 94 5e ^ 01 1111 31 1f US 95 5f _ lb add cvt.s.f 10 0000 32 20 Space 96 60 ‘ lh addu cvt.d.f 10 0001 33 21 ! 97 61 a lwl sub 10 0010 34 22 " 98 62 b lw subu 10 0011 35 23 # 99 63 c lbu and cvt.w.f 10 0100 36 24 $ 100 64 d lhu or 10 0101 37 25 % 101 65 e lwr xor 10 0110 38 26 & 102 66 f nor 10 0111 39 27 ’ 103 67 g sb 10 1000 40 28 ( 104 68 h sh 10 1001 41 29 ) 105 69 i swl slt 10 1010 42 2a * 106 6a j sw sltu 10 1011 43 2b + 107 6b k 10 1100 44 2c , 108 6c l 10 1101 45 2d 109 6d m swr 10 1110 46 2e . 110 6e n cache 10 1111 47 2f / 111 6f o ll tge c.f.f 11 0000 48 30 0 112 70 p lwc1 tgeu c.un.f 11 0001 49 31 1 113 71 q lwc2 tlt c.eq.f 11 0010 50 32 2 114 72 r pref tltu c.ueq.f 11 0011 51 33 3 115 73 s teq c.olt.f 11 0100 52 34 4 116 74 t ldc1 c.ult.f 11 0101 53 35 5 117 75 u ldc2 tne 11 0110 54 36 6 118 76 v c.ole.f c.ule.f 11 0111 55 37 7 119 77 w sc 11 1000 56 38 8 120 78 x c.sf.f swc1 57 39 9 121 79 y c.ngle.f 11 1001 swc2 11 1010 58 3a : 122 7a z c.seq.f c.ngl.f 11 1011 59 3b ; 123 7b { c.lt.f 11 1100 60 3c < 124 7c | sdc1 11 1101 61 3d = 125 7d } c.nge.f sdc2 11 1110 62 3e > 126 7e ~ c.le.f c.ngt.f 11 1111 63 3f ? 127 7f DEL (1) opcode(31:26) == 0 (2) opcode(31:26) == 17ten (11hex); if fmt(25:21)==16ten (10hex) f = s (single); if fmt(25:21)==17ten (11hex) f = d (double)