View
218
Download
0
Category
Preview:
Citation preview
MIPS Intermedio
Universidad de Sonora Arquitectura de Computadoras 2
Seudo-instruccionesSon 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 3
Seudo-instruccionesPor ejemplo, la seudo-instrucción li (load
immediate):li $t0, 0x12345678
se traduce a:lui $t0, 0x1234ori $t0, 0x5678
Universidad de Sonora Arquitectura de Computadoras 4
Seudo-instruccionesLista 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 bgtz $r, L Si r > 0 goto L
Universidad de Sonora Arquitectura de Computadoras 5
RegistrosNombre
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 6
RegistrosLos 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 7
RegistrosLos 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 8
Llamadas a procedimientoEn 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, first-out), a estos bloques también se les conoce como stack frames.
Universidad de Sonora Arquitectura de Computadoras 9
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) ; $v0 = Memoria[$fp]
Universidad de Sonora Arquitectura de Computadoras 10
Stack frame…
Argumento 6
Argumento 5
Registrossalvados
Variableslocales
$sp
$fp
Alta memoria
Baja memoria
La pilacrece
Universidad de Sonora Arquitectura de Computadoras 11
Stack framePor 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 12
Antes de la llamadaEl 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 13
Después de la llamadaEl 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 14
Antes de regresar al llamadorAntes 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 15
Ejemplo 1Traducir 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 16
Ejemplo 1Reservar espacio en la pila para el frame.Salvar los registros que se van a usar: $s0,
$t0 y $t1.
foo: addi $sp, $sp, -12 ; El frame ocupa 12 bytes
sw $t1, 8($sp) ; Guarda $t1sw $t0, 4($sp) ; Guarda $t0sw $s0, 0($sp) ; Guarda $s0
Universidad de Sonora Arquitectura de Computadoras 17
Ejemplo 1Pila del sistema antes y después de guardar
el stack frame de foo.
sp
Alta memoria
Baja memoria
Antes
sp
Después
$t1
$t0
$s0
Universidad de Sonora Arquitectura de Computadoras 18
Ejemplo 1Có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 + hadd $t1, $a2, $a3 ; $t1 = i + jsub $s0, $t0, $t1 ; $s0 = $t0 - $t1add $v0, $s0, $zero ; El valor se
regresa en $v0
Universidad de Sonora Arquitectura de Computadoras 19
Ejemplo 1Restaurar los valores de $t0, $t1 y $s0
sacándolos de la pila.Regresar el control al procedimiento llamador.
lw $s0, 0($sp) ; Restaura $s0lw $t0, 4($sp) ; Restaura $t0lw $t1, 8($sp) ; Restaura $t1addi $sp, $sp, 12 ; Ajusta la pilajr $ra ; Brinca al llamador
Universidad de Sonora Arquitectura de Computadoras 20
Ejemplo 1Pila del sistema durante y después de la
llamada a foo.
sp
Después
Alta memoria
Baja memoria
sp
Durante
$t1
$t0
$s0
Universidad de Sonora Arquitectura de Computadoras 21
Ejemplo 2Traducir 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);
elsereturn (n * fact (n - 1));
}
Universidad de Sonora Arquitectura de Computadoras 22
Ejemplo 2 - mainEl 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, 32subu $sp, $sp, $t0 ; Stack frame es de 32 bytessw $ra, 20($sp) ; Guarda la dirección de regresosw $fp, 16($sp) ; Guarda el frame pointer anterioraddiu $fp, $sp, 28 ; Pone el frame pointer
Universidad de Sonora Arquitectura de Computadoras 23
Ejemplo 2 - mainEl main pone el argumento 10 en $a0 y llama a
fact.Luego invoca a la función de librería printf.
li $a0, 10 ; Guarda el argumento (10) en $a0jal fact ; Llama a la función factorial
la $a0, $LC ; Guarda el string de formato en $a0move $a1, $v0 ; Mueve el resultado de fact a $a1jal printf ; Llama a la función para imprimir
Universidad de Sonora Arquitectura de Computadoras 24
Ejemplo 2 - mainEl main restaura los registros y regresa.
lw $ra, 20($sp) ; Restaura $ralw $fp, 16($sp) ; Restaura el frame pointeraddiu $sp, $sp, 32 ; Saca (pop) el stack framejr $ra ; Regresa al llamador
$LC:.ascii “El factorial de 10 es %d\n\000”
Universidad de Sonora Arquitectura de Computadoras 25
Ejemplo 2 - factEl 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, 32subu $sp, $sp, $t0 ; Stack frame es de 32 bytessw $ra, 20($sp) ; Salva la dirección de regresosw $fp, 16($sp) ; Salva el frame pointeraddiu $fp, $sp, 28 ; Pone el frame pointersw $a0, 0($fp) ; Salva el argumento (n)
Universidad de Sonora Arquitectura de Computadoras 26
Ejemplo 2 - factEsta parte implementa el cuerpo principal de
fact.
lw $v0, 0($fp) ; Carga nbgtz $v0, $L2 ; Brinca si n > 0li $v0,1 ; Regresa 1jr $L1 ; Brinca para regresar
$L2: lw $v1, 0($fp) ; Carga nsubu $v0, $v1, 1 ; Calcula n - 1move $a0, $v0 ; Mueve el valor a $a0jal fact ; Llama a factlw $v1, 0($fp) ; Carga nmul $v0, $v0, $v1 ; Calcula fact(n-1) * n
Universidad de Sonora Arquitectura de Computadoras 27
Ejemplo 2 - factFinalmente, fact restaura los registros y
regresa.
$L1: ; Resultado está en $v0lw $ra, 20($sp) ; Restaura $ralw $fp, 16($sp) ; Restaura $fpaddiu $sp, $sp, 32 ; Pop stackjr $ra ; Regresa a main
Universidad de Sonora Arquitectura de Computadoras 28
Ejemplo 2 – stack framesDurante la llamada a fact (8).
$ra$fp
$a0$ra$fp
$a0$ra$fp
$a0$ra$fp
main
fact (10)
fact (9)
fact (8)
Pila crece
Universidad de Sonora Arquitectura de Computadoras 29
ResumenInstrucciones 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 30
ResumenArquitectura 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 31
ResumenEl 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 32
MIPS assembly language
Category Instruction Example Meaning Commentsadd add $s1, $s2, $s3 $s1 = $s2 + $s3 Three operands; data in registers
Arithmetic subtract sub $s1, $s2, $s3 $s1 = $s2 - $s3 Three operands; data in registers
add immediate addi $s1, $s2, 100 $s1 = $s2 + 100 Used to add constants
load w ord lw $s1, 100($s2) $s1 = Memory[$s2 + 100]Word from memory to register
store w ord sw $s1, 100($s2) Memory[$s2 + 100] = $s1 Word from register to memory
Data transfer load byte lb $s1, 100($s2) $s1 = Memory[$s2 + 100]Byte from memory to register
store byte sb $s1, 100($s2) Memory[$s2 + 100] = $s1 Byte from register to memoryload upper immediate
lui $s1, 100 $s1 = 100 * 216 Loads constant in upper 16 bits
branch on equal beq $s1, $s2, 25 if ($s1 == $s2) go to PC + 4 + 100
Equal test; PC-relative branch
Conditional
branch on not equal bne $s1, $s2, 25 if ($s1 != $s2) go to PC + 4 + 100
Not equal test; PC-relative
branch 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 $s1, $s2, 100 if ($s2 < 100) $s1 = 1; else $s1 = 0
Compare less than constant
jump j 2500 go to 10000 Jump to target address
Uncondi- jump register jr $ra go to $ra For sw itch, procedure return
tional jump jump and link jal 2500 $ra = PC + 4; go to 10000 For procedure call
Recommended