- Coloque parâmetros nos registradores
- Desvie a execução para o procedimento
- Ajuste o armazenamento
- Execute o procedimento
- Armazene o resultado nos registradores
- Ajuste o armazenamento
- Retorne ao procedimento chamador
- Ex: Salvar $s0 e $s1 na pilha
# Abrir espaço
addi $sp, $sp, -8 # sp = sp - 8
# Salva na pilha
sw $s0, 0($sp) # M[sp] = s0
sw $s1, 4($sp) # M[sp + 4] = s1
- Ex: Restaurar $s0 e $s1 da pilha
# Restaura os valores
lw $s0, 0($sp) # s0 = M[sp]
lw $s1, 4($sp) # s1 = M[sp + 4]
# Restaura o espaço na pilha
addi $sp, $sp, 8 # sp = sp + 8
- Desvia para o procedimento
jal procedimento
jal = jump and link
ra = return address
- Salva o endereço de retorno em $ra
- Faz o desvio para o rótulo procedimento.
jr $ra
jr = jump register (jump to return address)
- Faz o desvio para o endereço de retorno em $ra
- Exemplo:
int media(int a, int b) {
return (a + b) / 2;
}
int main() {
int a = 1;
int b = 2;
printf("%d\n", media(a, b));
return 0;
}
a = $s0
b = $s1
.data
nl: .asciiz "\n"
.text
main:
li $s0, 1
li $s1, 2
# Carrega args.
move $a0, $s0
move $a1, $s1
# Chama procedimento
jal media
# Carrega resultado
move $s2, $v0
# Imprime resultado
li $v0, 1
move $a0, $s2
syscall
# Imprime nova linha
li $v0, 4
la $a0, nl
syscall
# Finaliza a execução
li $v0, 10
syscall
media:
add $t0, $a0, $a1 # t0 = a + b
srl $v0, $t0, 1 # v0 = t0 / 2
jr $ra
OP | Endereço |
---|---|
6 bytes | 26 bytes |
- É o formato usado para instruções de desvio:
j
,jal
ejr
.
lb
: load byte - carrega um byte da memóriasb
: store byte - armazena um byte na memória
- 11 - imprime caractere
- 12 - lê caractere