# # Um programa que chama uma subrotina folha # Author: Ney Laert Vilar Calazans # # main() # { # int A=21; # int B=48; # int C; # # C = soma(A, B); # printf ("O resultado da soma é: %d",C); # } # # soma (int X, int Y) # { # return(X+Y); # } .data A: .word 21 B: .word 48 C: .word 0 texto: .asciiz "O resultado da soma é: " .text main: la $t0,A # Coloca em $t0 o endereço de A lw $a0,0($t0) # Coloca em $a0 (argumento de chamada) o valor de A la $t1,B # Coloca em $t1 o endereço de B lw $a1,0($t1) # Coloca em $a1 (argumento de chamada) o valor de B jal soma # Salta para subrotina, salvando endereço da próxima # instrução em $ra (implicitamente referenciado) la $t0,C # Recupera endereço de C sw $v1,0($t0) # Escreve o resultado da soma em C, lembrando # que a subrotina colocou resultado da soma em $v1 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,$v1 # 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 folha soma # Author: Ney Laert Vilar Calazans # soma: addu $v1,$a0,$a1 # Realiza a soma dos argumentos e coloca resultado # no registrador de retorno de valor $v1 jr $ra # Retorna para quem chamou.