Pular para o conteúdo

Exercício 8

Consolidar o aprendizado da linguagem Assembly RISC-V e compreender como a pilha é utilizada para preservar registradores entre chamadas de procedimento. A mesma expressão em C do Exercício 7 é usada, mas agora leaf_example salva e restaura os registradores t0, t1 e s0 na pilha:

int f = (g + h) - (i + j);
  1. Abra o simulador de linguagem RISC-V.
  2. No editor de texto do simulador, transcreva o código abaixo:
# Exercício 08
# C expression: int f = (g + h) - (i + j);
.text
j main
leaf_example:
addi sp, sp, -12 # ajusta a pilha para 3 registradores
sw t1, 8(sp) # salva t1
sw t0, 4(sp) # salva t0
sw s0, 0(sp) # salva s0
add t0, a1, a2 # t0 = g + h
add t1, a3, a4 # t1 = i + j
sub s0, t0, t1 # f = t0 - t1
add a0, s0, zero # retorno em a0
lw s0, 0(sp) # restaura s0
lw t0, 4(sp) # restaura t0
lw t1, 8(sp) # restaura t1
addi sp, sp, 12 # libera espaço na pilha
jr ra # retorna da função
main:
addi t1, zero, 1
addi t0, zero, 2
addi s0, zero, 3
addi a1, zero, 4 # g = 4
addi a2, zero, 7 # h = 7
addi a3, zero, 2 # i = 2
addi a4, zero, 1 # j = 1
jal leaf_example # chama leaf_example
nop # resultado em a0

Execute o programa passo a passo clicando no botão Run One Step. A cada instrução, preencha a tabela abaixo cada vez que o valor de um registrador ou posição da memória for modificado.

Preencha a tabela abaixo

  • Preencha o PC com o endereço da instrução e copie a coluna Instrução com o conteúdo da coluna Source do simulador. Preencha apenas os campos que forem modificados.
  • Para pseudo-instruções, o simulador exibe a instrução real na coluna Basic e a forma original na coluna Source. Copie o valor Basic na coluna Instrução e o valor Source na coluna Pseudoinstrução. Deixe a coluna de pseudoinstrução em branco para instruções reais.
  • Se precisar de mais linhas, clique em Adicionar linha. A verificação só é realizada quando todas as linhas estiverem preenchidas, se nada aparecer ao clicar em Verificar, significa que ainda há linhas em branco.
Antes Após executar a instrução
PC Instruction Pseudoinstrução x10x11x12x13x14x1x2x5x6x8 0x7FFFEFF0 ... 0x7FFFEFF4 ... 0x7FFFEFF8 ...
(a0 (f))(a1 (g))(a2 (h))(a3 (i))(a4 (j))(ra)(sp)(t0)(t1)(s0) s0 t0 t1
0x000000000x000000000x000000000x000000000x000000000x000000000x7FFFEFFC0x000000000x000000000x00000000 0x00000000 0x00000000 0x00000000
0x00400000 jal x0 56 j main

Dica: no diálogo de impressão, selecione o tamanho A2 para melhor resultado.