# # Um programa que chama uma subrotina não-folha # (soma3) que por sua vez chama uma subrotina # folha (soma) # Autor: Ney Laert Vilar Calazans # # main() # { # int A=21; # int B=48; # int C=55; # int D; # # D = soma3(A, B, C); # printf ("O resultado da soma é: %d",C); # } # # int soma3 (int X, int Y, int Z) # { # return(soma(soma(X,Y),Z)); # } # # int soma (int X, int Y) # { # return(X+Y); # } .data A: .word 21 B: .word 48 C: .word 55 D: .word 0 texto: .asciiz "O resultado da soma é: " .text main: la $t0,A lw $t0,0($t0) # Lê valor de A para $t0 la $t1,B lw $t1,0($t1) # Lê valor de B para $t1 la $t2,C lw $t2,0($t2) # Lê valor de C para $t2 addi $sp,$sp,-16 # Aloca lugar na pilha para 4 palavras (4x4 bytes) sw $t0,12($sp) # Empilha A na 1ra posição alocada sw $t1,8($sp) # Empilha B na 2da posição alocada sw $t2,4($sp) # Empilha C na 3ra posição alocada sw $ra,0($sp) # Empilha end retorno para SO na 4a posição alocada jal soma3 # Salta para subrotina soma3, salvando endereço # da próxima instrução em $ra (implicitamente referenciado) lw $ra,0($sp) # Na volta de soma3, recupera end retorno para SO lw $t0,4($sp) # Recupera valor da soma que soma3 deixou abaixo do topo da pilha addi $sp,$sp,16 # Desaloca espaço de 4 palavras da pilha la $t1,D # Obtém endereço de D sw $t0,0($t1) # escreve resultado da soma em D # Agora vem a execução de printf li $v0,4 # Carrega código de serviço impressão de cadeia no # registrador de controle de syscall ($v0) la $a0,texto # Carrega endereço da cadeia no # parâmetro de dados de syscall ($a0) syscall # Chamada do Sistema em si li $v0,1 # Carrega código de serviço impressão de inteiro no # registrador de controle de syscall ($v0) move $a0,$t0 # Carrega valor a ser impresso no # parâmetro de dados de syscall ($a0) syscall # Chamada do Sistema em si li $v0,10 # Carrega código de serviço sai do programa no # registrador de controle de syscall ($v0) syscall # Chamada do Sistema em si # # Código da subrotina não-folha soma3 # Autor: Ney Laert Vilar Calazans # soma3: lw $t0,12($sp) # Lê valor do parâmetro formal X da pilha para $t0 lw $t1,8($sp) # Lê valor do parâmetro formal Y da pilha para $t1 addi $sp,$sp,-12 # Aloca lugar na pilha para 3 palavras (3x4 bytes) sw $t0,8($sp) # Empilha X na 1ra posição alocada sw $t1,4($sp) # Empilha Y na 2da posição alocada sw $ra,0($sp) # Empilha end retorno para main na 3ra posição alocada jal soma # Salta para subrotina soma, salvando endereço # da próxima instrução em $ra (implicitamente referenciado) lw $t0,4($sp) # Recupera resultado da soma da pilha (soma(X,Y)) lw $ra,0($sp) # Recupera end retorno para main da pilha addi $sp,$sp,12 # Desaloca espaço de 3 palavras da pilha # Prepara segunda chamada de soma (mais externa) lw $t1,4($sp) # Lê valor do parâmetro formal Z da pilha para $t1 addi $sp,$sp,-12 # Aloca lugar na pilha para 3 palavras (3x4 bytes) sw $t0,8($sp) # Empilha soma(X,Y) na 1ra posição alocada sw $t1,4($sp) # Empilha Z na 2da posição alocada sw $ra,0($sp) # Empilha end retorno para main na 3ra posição alocada jal soma # Salta para subrotina soma, salvando endereço # da próxima instrução em $ra (implicitamente referenciado) lw $t0,4($sp) # Recupera resultado da soma da pilha (soma(soma(X,Y),Z)) lw $ra,0($sp) # Recupera end retorno para main da pilha addi $sp,$sp,12 # Desaloca espaço de 3 palavras da pilha sw $t0,4($sp) # Escreve resultado de soma3 abaixo do topo da pilha jr $ra # Retorna para quem chamou (no caso, main). # # Código da subrotina folha soma # Autor: Ney Laert Vilar Calazans # soma: lw $t0,8($sp) # Recupera primeiro argumento a somar da pilha lw $t1,4($sp) # Recupera segundo argumento a somar da pilha addu $t0,$t0,$t1 # Realiza a soma dos argumentos e coloca resultado em $t0 sw $t0,4($sp) # Escreve resultado da soma logo abaixo do topo da pilha jr $ra # Retorna para quem chamou.