# Subrotinas aninhadas # Author: Fernando Gehm Moraes # # main() # { # x = soma3(a, b, c) # } # # soma3(x, y, z) # { # return( soma( x, soma(y, z))); # } # # soma(x1, x2) # { # return( x1+x2 ); # } # .text .globl main # Declare the label main to be a global one main: la $s1, var_a # inicializa as variáveis lw $s1, 0($s1) la $s2, var_b lw $s2, 0($s2) la $s3, var_c lw $s3, 0($s3) addiu $sp,$sp,-16 # aloca 4 posições na pilha sw $ra, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $s3,12($sp) # empilha o endereço de retorno do `main` e os três parâmetros #jal soma3 la $t0, soma3 ## substituição do jal por jalr jalr $ra, $t0 lw $ra,0($sp) # upon return, retrieve return address from stack lw $s4,4($sp) # resultado da soma3 é recuperado da pilha addiu $sp,$sp,16 # libera as 4 posições alocadas end: j end soma3: lw $t0, 4($sp) lw $t1, 8($sp) # lê da pilha dois parâmetros addiu $sp,$sp,-12 # aloca 3 posições na pilha sw $ra, 0($sp) sw $t0, 4($sp) sw $t1, 8($sp) #jal soma la $t0, soma ## substituição do jal por jalr jalr $ra, $t0 lw $ra,0($sp) # upon return, retrieve return address from stack lw $t0,4($sp) # *** resultado da soma é recuperado da pilha addiu $sp,$sp,12 # libera as 3 posições alocadas lw $t1, 12($sp) # *** pega o terceiro parâmetro addiu $sp,$sp,-12 # aloca 3 posições na pilha sw $ra,0($sp) sw $t0,4($sp) # obtido da chamada anterior sw $t1,8($sp) #jal soma la $t0, soma ## substituição do jal por jalr jalr $ra, $t0 lw $ra,0($sp) # upon return, retrieve return address from stack lw $t0,4($sp) # *** resultado da soma é recuperado da pilha addiu $sp,$sp,12 # libera as 3 posições alocadas sw $t0,4($sp) # RESPOSTA NA PILHA jr $ra # retorna da subrotina soma3. soma: lw $t7,4($sp) lw $t8,8($sp) addu $t7,$t7,$t8 sw $t7,4($sp) jr $ra # and return .data total: .word 0x0 var_a: .word 0x00AA0000 var_b: .word 0x0000BB00 var_c: .word 0x000000CC