MIPS Intermedio Seudo-instrucciones Son instrucciones que el ensamblador reconoce pero que no existen en la definición del hardware. 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 ensamblador Universidad de Sonora Arquitectura de Computadoras 2 Seudo-instrucciones Por ejemplo, la seudo-instrucción li (load immediate): li $t0, 0x12345678 se traduce a: lui $t0, 0x1234 ori $t0, 0x5678 Universidad de Sonora Arquitectura de Computadoras 3 Seudo-instrucciones Lista de algunas seudo-instrucciones: Nombre Sintaxis Significado Valor absoluto abs $r, $t $r = abs ($t) Carga dirección la $r, L $r = L Carga inmediata li $r, C $r = C Brinca si mayor que bgt $r, $t, L Si r > t goto L Brinca si menor que blt $r, $t, L Si r < t goto L Brinca si mayor que o igual bge $r, $t, L Si r >= t goto L Brinca si menor que o igual ble $r, $t, L Si r <= t goto L Brinca si mayor que sin signo bgtu $r, $t, L Si r > t goto L Brinca si mayor que cero Si r > 0 goto L Universidad de Sonora bgtz $r, L Arquitectura de Computadoras 4 Registros Nombre Número Uso ¿Salvado por el llamado? $zero 0 Constante cero No aplica $at 1 Reservado No $v0-$v1 2-3 Valores de retorno de funciones No $a0-$a3 4-7 Argumentos de funciones No $t0-$t7 8-15 Temporales No $s0-$s7 16-23 Temporales salvados Si $t8-$t9 24-25 Temporales No $k0-$k1 26-27 Reservados por el kernel del S.O. No $gp 28 Apuntador global Si $sp 29 Stack pointer Si $fp 30 Frame pointer Si $ra 31 Dirección de retorno No aplica Universidad de Sonora Arquitectura de Computadoras 5 Registros Los registros $at (1), $k0 (26), y $k1 (27) están reservados por el ensamblador y el sistema operativo y no deben ser usados por programas. Los registros $a0–$a3 (4–7) se usan para pasar los primeros cuatro argumentos a las rutinas (los demás argumentos se pasan en la pila). Los registros $v0 y $v1 (2, 3) se usan para regresar valores de funciones. Los registros $t0–$t9 (8–15, 24, 25) son registros salvados por el llamador que se usan para guardar cantidades temporales que no necesitan ser preservados entre llamadas. Universidad de Sonora Arquitectura de Computadoras 6 Registros Los registros $s0–$s7 (16–23) son registros salvados por el llamado que se usan para guardar cantidades temporales que si necesitan ser preservados entre llamadas. El registro $gp (28) es un apuntador global que apunta a la mitad de un bloque de memoria de 64K en el segmento de datos estáticos. El registro $sp (29) es el stack pointer, que apunta al tope de la pila. El registro $fp (30) es el frame pointer. La instrucción jal escribe en el registro $ra (31) la dirección de retorno de una llamada a procedimiento. Universidad de Sonora Arquitectura de Computadoras 7 Llamadas a procedimiento En lenguajes de alto nivel (C, Java) las llamadas a procedimiento son transparentes al usuario. En ensamblador, el programador debe implementar las llamadas y retorno de procedimiento. Las llamadas y regreso de procedimiento involucran un bloque de memoria llamado procedure call frame. Como en la mayoría de los lenguajes las llamadas a procedimiento siguen un orden LIFO (last-in, firstout), a estos bloques también se les conoce como stack frames. Universidad de Sonora Arquitectura de Computadoras 8 Stack frame El stack frame guarda: Argumentos (a partir del quinto) al procedimiento. Los registros que se deben preservar. Las variables locales al procedimiento. El procedimiento llamado utiliza el frame pointer para accesar la memoria. lw $v0, 0($fp) Universidad de Sonora ; $v0 = Memoria[$fp] Arquitectura de Computadoras 9 Stack frame … Alta memoria Argumento 6 Argumento 5 $fp Registros salvados La pila crece Variables locales $sp Universidad de Sonora Arquitectura de Computadoras Baja memoria 10 Stack frame Por convención, el tamaño mínimo de un stack frame es 24 bytes. 16 bytes para guardar $a0-$a3. 8 bytes para guardar $ra alineada a doble palabra. Por convención, el stack pointer también se mantiene alineado a doble palabra, es decir, $sp se incrementa de 8 en 8 bytes. Universidad de Sonora Arquitectura de Computadoras 11 Antes de la llamada El llamador hace lo siguiente: 1. Pasar argumentos. Por convención, los primeros 4 argumentos van en $a0-$a3. Los demás argumentos se pasan en la pila. 2. Guarda los registros. No hay garantía que $a0-$a3 ni $t0-$t9 mantengan su valor después de la llamada. Si el llamador espera usar alguno de esos registros, debe salvarlos en la pila. 3. Ejecuta una instrucción jal. La dirección de regreso se guarda en $ra automáticamente. Universidad de Sonora Arquitectura de Computadoras 12 Después de la llamada El llamado, antes de correr, hace lo siguiente: 1. Reservar espacio para el frame, restándole al stack pointer el tamaño del frame. 2. Salvar los registros $s0-$s7 si es que se usan en el procedimiento. $fp debe salvarse y $ra solo en caso de que el procedimiento haga a su vez una llamada. 3. Dejar a $fp apuntando al comienzo del frame, sumando al stack pointer el tamaño del frame menos 4. Universidad de Sonora Arquitectura de Computadoras 13 Antes de regresar al llamador Antes de regresar, el llamado hace lo siguiente: 1. Si el llamado regresa un valor, guardar el valor en $v0. 2. Restaurar los registros que se salvaron al comienzo. 3. Eliminar (pop) el stack frame sumándole el tamaño del frame al stack pointer. 4. Brincar a la dirección almacenada en $ra. Universidad de Sonora Arquitectura de Computadoras 14 Ejemplo 1 Traducir a MIPS la siguiente función hecha en C: int foo (int g, int h, int i, int j) { int f; f = (g + h) – (i + j); return f; } Universidad de Sonora Arquitectura de Computadoras 15 Ejemplo 1 Reservar espacio en la pila para el frame. Salvar los registros que se van a usar: $s0, $t0 y $t1. foo: addi $sp, $sp, -12 sw $t1, 8($sp) sw $t0, 4($sp) sw $s0, 0($sp) Universidad de Sonora ; El frame ocupa 12 bytes ; Guarda $t1 ; Guarda $t0 ; Guarda $s0 Arquitectura de Computadoras 16 Ejemplo 1 Pila del sistema antes y después de guardar el stack frame de foo. Alta memoria sp $t1 $t0 sp $s0 Baja memoria Antes Universidad de Sonora Arquitectura de Computadoras Después 17 Ejemplo 1 Código del procedimiento. Se asume que los argumentos g, h, i, y j están en $a0, $a1, $a2 y $a3, respectivamente. add $t0, $a0, $a1 ; $t0 = g + h add $t1, $a2, $a3 ; $t1 = i + j sub $s0, $t0, $t1 ; $s0 = $t0 - $t1 add $v0, $s0, $zero ; El valor se regresa en $v0 Universidad de Sonora Arquitectura de Computadoras 18 Ejemplo 1 Restaurar los valores de $t0, $t1 y $s0 sacándolos de la pila. Regresar el control al procedimiento llamador. lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp, $sp, 12 jr $ra Universidad de Sonora ; Restaura $s0 ; Restaura $t0 ; Restaura $t1 ; Ajusta la pila ; Brinca al llamador Arquitectura de Computadoras 19 Ejemplo 1 Pila del sistema durante y después de la llamada a foo. Alta memoria sp $t1 $t0 sp $s0 Baja memoria Durante Universidad de Sonora Arquitectura de Computadoras Después 20 Ejemplo 2 Traducir a MIPS el siguiente código en C: main () { printf (“El factorial de 10 es %d\n", fact (10)); } int fact (int n) { if (n < 1) return (1); else return (n * fact (n - 1)); } Universidad de Sonora Arquitectura de Computadoras 21 Ejemplo 2 - main El main reserva 32 bytes para su stack frame. 24 bytes para $a0-$a3 y $ra mas 8 bytes para guardar $fp alineado a doble palabra. main: li $t0, 32 subu $sp, $sp, $t0 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 Universidad de Sonora ; Stack frame es de 32 bytes ; Guarda la dirección de regreso ; Guarda el frame pointer anterior ; Pone el frame pointer Arquitectura de Computadoras 22 Ejemplo 2 - main El main pone el argumento 10 en $a0 y llama a fact. Luego invoca a la función de librería printf. li $a0, 10 jal fact ; Guarda el argumento (10) en $a0 ; Llama a la función factorial la $a0, $LC ; Guarda el string de formato en $a0 move $a1, $v0 ; Mueve el resultado de fact a $a1 jal printf ; Llama a la función para imprimir Universidad de Sonora Arquitectura de Computadoras 23 Ejemplo 2 - main El main restaura los registros y regresa. lw $ra, 20($sp) lw $fp, 16($sp) addiu $sp, $sp, 32 jr $ra ; Restaura $ra ; Restaura el frame pointer ; Saca (pop) el stack frame ; Regresa al llamador $LC: .ascii “El factorial de 10 es %d\n\000” Universidad de Sonora Arquitectura de Computadoras 24 Ejemplo 2 - fact El inicio de fact es parecido. Salva $ra y $fp. Además salva $a0 porque ahí pasa el argumento en las llamadas recursivas. fact: li $t0, 32 subu $sp, $sp, $t0 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) Universidad de Sonora ; Stack frame es de 32 bytes ; Salva la dirección de regreso ; Salva el frame pointer ; Pone el frame pointer ; Salva el argumento (n) Arquitectura de Computadoras 25 Ejemplo 2 - fact Esta parte implementa el cuerpo principal de fact. lw $v0, 0($fp) ; Carga n bgtz $v0, $L2 ; Brinca si n > 0 li $v0,1 ; Regresa 1 jr $L1 ; Brinca para regresar $L2: lw $v1, 0($fp) ; Carga n subu $v0, $v1, 1 ; Calcula n - 1 move $a0, $v0 ; Mueve el valor a $a0 jal fact lw $v1, 0($fp) mul $v0, $v0, $v1 Universidad de Sonora ; Llama a fact ; Carga n ; Calcula fact(n-1) * n Arquitectura de Computadoras 26 Ejemplo 2 - fact Finalmente, fact restaura los registros y regresa. $L1: lw $ra, 20($sp) lw $fp, 16($sp) addiu $sp, $sp, 32 jr $ra Universidad de Sonora ; Resultado está en $v0 ; Restaura $ra ; Restaura $fp ; Pop stack ; Regresa a main Arquitectura de Computadoras 27 Ejemplo 2 – stack frames Durante la llamada a fact (8). $ra $fp Pila crece Universidad de Sonora $a0 $ra $fp main fact (10) $a0 $ra $fp fact (9) $a0 $ra $fp fact (8) Arquitectura de Computadoras 28 Resumen Instrucciones sencillas, todas de 32 bits. Tres formatos de instrucción: R – los operandos son registros. I – un operando es inmediato. J – brinco. Universidad de Sonora Arquitectura de Computadoras 29 Resumen Arquitectura load/store. Los datos deben estar en registros para realizar aritmética. Las únicas instrucciones que accesan la memoria son las instrucciones de transferencia de datos. Byte addressing con memoria alineada. Las palabras comienzan en direcciones múltiplos de 4. 232 bytes con direcciones de 0 a 232 – 1. 230 palabras con direcciones de 0 a 232 – 4. Universidad de Sonora Arquitectura de Computadoras 30 Resumen El registro $zero siempre contiene valor 0. Los registro $at, $k0, $k1 están reservados. Los registros $gp, $sp, $fp y $ra son de propósito especial. En particular $sp, $fp y $ra se usan en las llamadas. Los registros $t0-$t9 son para temporales de vida corta. Los registros $s0-$s7 son para temporales de vida larga. Los registros $a0-$a3 se usan para pasar argumentos. Los registros $v0 y $v1 se usan para regresar valores. Universidad de Sonora Arquitectura de Computadoras 31 add MIPS assembly language Example Meaning add $s1, $s2, $s3 $s1 = $s2 + $s3 Three operands; data in registers subtract sub $s1, $s2, $s3 $s1 = $s2 - $s3 Three operands; data in registers addi $s1, $s2, 100 lw $s1, 100($s2) sw $s1, 100($s2) lb $s1, 100($s2) sb $s1, 100($s2) lui $s1, 100 $s1 = $s2 + 100 Used to add constants $s1 = Memory[$s2 + 100]Word from memory to register Memory[$s2 + 100] = $s1 Word from register to memory $s1 = Memory[$s2 + 100]Byte from memory to register Memory[$s2 + 100] = $s1 Byte from register to memory Loads constant in upper 16 bits $s1 = 100 * 216 beq $s1, $s2, 25 if ($s1 == $s2) go to PC + 4 + 100 Equal test; PC-relative branch branch on not equal bne $s1, $s2, 25 if ($s1 != $s2) go to PC + 4 + 100 Not equal test; PC-relative set on less than slt $s1, $s2, $s3 if ($s2 < $s3 ) $s1 = 1; else $s1 = 0 Compare less than; for beq, bne set less than immediate slti jump jump register jump and link j jr jal Category Arithmetic Instruction add immediate load w ord store w ord Data transfer load byte store byte load upper immediate branch on equal Conditional branch Unconditional jump Universidad de Sonora $s1, $s2, 100 if ($s2 < 100 ) $s1 = 1; Comments Compare less than constant else $s1 = 0 2500 $ra 2500 go to 10000 Jump to target address go to $ra For sw itch, procedure return $ra = PC + 4; go to 10000 For procedure call Arquitectura de Computadoras 32