ppt - Universidad de Sonora

Download Report

Transcript ppt - Universidad de Sonora

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
bgtz $r, L
Si r > 0 goto L
Universidad de Sonora
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)
; Restaura $s0
lw $t0, 4($sp)
; Restaura $t0
lw $t1, 8($sp); Restaura $t1
addi $sp, $sp, 12
; Ajusta la pila
jr $ra
; Brinca al llamador
Universidad de Sonora
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
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
$s1, $s2, $s3
if ($s2 < $s3) $s1 = 1;
else $s1 = 0
Compare less than; for beq, bne
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
set on less than
slt
set less than
immediate
slti
jump
jump register
jump and link
j
jr
jal
Universidad de Sonora
$s1 = 100 * 2
16
$s1, $s2, 100 if ($s2 < 100) $s1 = 1;
Comments
Loads constant in upper 16 bits
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