MIPS Intermedio

32
MIPS Intermedio

description

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. - PowerPoint PPT Presentation

Transcript of MIPS Intermedio

Page 1: MIPS Intermedio

MIPS Intermedio

Page 2: 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

Page 3: MIPS Intermedio

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

Page 4: MIPS Intermedio

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

Page 5: MIPS Intermedio

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

Page 6: MIPS Intermedio

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.

Page 7: MIPS Intermedio

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.

Page 8: MIPS Intermedio

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.

Page 9: MIPS Intermedio

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]

Page 10: MIPS Intermedio

Universidad de Sonora Arquitectura de Computadoras 10

Stack frame…

Argumento 6

Argumento 5

Registrossalvados

Variableslocales

$sp

$fp

Alta memoria

Baja memoria

La pilacrece

Page 11: MIPS Intermedio

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.

Page 12: MIPS Intermedio

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.

Page 13: MIPS Intermedio

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.

Page 14: MIPS Intermedio

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.

Page 15: MIPS Intermedio

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;

}

Page 16: MIPS Intermedio

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

Page 17: MIPS Intermedio

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

Page 18: MIPS Intermedio

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

Page 19: MIPS Intermedio

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

Page 20: MIPS Intermedio

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

Page 21: MIPS Intermedio

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));

}

Page 22: MIPS Intermedio

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

Page 23: MIPS Intermedio

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

Page 24: MIPS Intermedio

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”

Page 25: MIPS Intermedio

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)

Page 26: MIPS Intermedio

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

Page 27: MIPS Intermedio

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

Page 28: MIPS Intermedio

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

Page 29: MIPS Intermedio

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.

Page 30: MIPS Intermedio

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.

Page 31: MIPS Intermedio

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.

Page 32: MIPS Intermedio

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