Más contenido relacionado Más de Egdares Futch H. (20) Generación de código objeto MIPS1. Universidad Tecnológica Centroamericana
Ingeniería en Sistemas Computacionales
Compiladores I
Prof. Egdares Futch H.
Ejemplo de codificación MIPS
/* Fibonacci:*/ .text
# --------- Funcion -----------
int fib(int n) _fib: # Label de la Funcion
{ # ---------- Inicio Establecer Stack Frame:
if (n<2) sub $sp, $sp, 8 # Push Stack Frame
return n; sw $ra, 4($sp) # Salva Return Address
else sw $fp, 0($sp) # Salva Frame Pointer
return fib(n-1)+fib(n-2); add $fp, $sp, -4 # Establece Frame Pointer
} # ---------- Fin Establecer Stack Frame
lw $t0, 8($sp) # Load n local
void main( ) li $t1, 2 # Load Constante
{ slt $t0, $t0, $t1 # Less than '<'
beq $t0, 0, __Label0 # Inicio If-then-else #0
printfint(fib(scanfint())); lw $t0, 8($sp) # Load n local
} move $v0, $t0 # Asigna Valor de Retorno
# ---------- Inicio Quitar Stack Frame por el Return
lw $fp, 0($sp) # Load Frame Pointer
lw $ra, 4($sp) # Load Return Address
add $sp, $sp, 8 # Pop Stack Frame
jr $ra # Return
# ---------- Fin Quitar Stack Frame por Return
j __Label1 # Salta despues del If-then-
else
__Label0: # Parte Else del If-then-else
#0
lw $t0, 8($sp) # Load n local
li $t1, 1 # Load Constante
sub $t0, $t0, $t1 # Resta '-'
sw $t0, -4($sp) # Argumento
sub $sp, $sp, 4 # Inicio Llamada a funcion
jal _fib #
add $sp, $sp, 4 #
move $t0, $v0 # Copia Valor de Retorno
sw $t0, -4($sp) # Guarda Temporal
lw $t1, 8($sp) # Load n local
li $t2, 2 # Load Constante
sub $t1, $t1, $t2 # Resta '-'
sw $t1, -8($sp) # Argumento
sub $sp, $sp, 8 # Inicio Llamada a funcion
jal _fib #
add $sp, $sp, 8 #
lw $t0, -4($sp) # Lee Temporal
move $t1, $v0 # Copia Valor de Retorno
add $t0, $t0, $t1 # Suma '+'
move $v0, $t0 # Asigna Valor de Retorno
# ---------- Inicio Quitar Stack Frame por el Return
lw $fp, 0($sp) # Load Frame Pointer
lw $ra, 4($sp) # Load Return Address
add $sp, $sp, 8 # Pop Stack Frame
jr $ra # Return
# ---------- Fin Quitar Stack Frame por Return
__Label1: # Fin del If-then-else #0
# ---------- Inicio Quitar Stack Frame
lw $fp, 0($sp) # Load Frame Pointer
lw $ra, 4($sp) # Load Return Address
add $sp, $sp, 8 # Pop Stack Frame
# ---------- Fin Quitar Stack Frame
jr $ra # Return
# --------- Fin de Funcion -----------
.text
# --------- Funcion -----------
main: # Label de la Funcion
# ---------- Inicio Establecer Stack Frame:
sub $sp, $sp, 8 # Push Stack Frame
sw $ra, 4($sp) # Salva Return Address
sw $fp, 0($sp) # Salva Frame Pointer
add $fp, $sp, -4 # Establece Frame Pointer
2. # ---------- Fin Establecer Stack Frame
li $v0, 5 # System Call Code (read_int)
syscall # read_int
move $t0, $v0 # Copia $v0
sw $t0, -4($sp) # Argumento
sub $sp, $sp, 4 # Inicio Llamada a funcion
jal _fib #
add $sp, $sp, 4 #
move $t0, $v0 # Copia Valor de Retorno
# ---------- Inicio de PrintfInt():
li $v0, 1 # System Call Code
(Print_int)
move $a0, $t0 # Argumento a imprimir
syscall # Print_int
# ---------- Fin de PrintfInt()
# ---------- Inicio Quitar Stack Frame
lw $fp, 0($sp) # Load Frame Pointer
lw $ra, 4($sp) # Load Return Address
add $sp, $sp, 8 # Pop Stack Frame
# ---------- Fin Quitar Stack Frame
li $v0, 10 # System Call Code para Exit
syscall # Salir del Programa
.end main # Fin del Programa
# --------- Fin de Funcion -----------