Pular para o conteúdo

Exercício 4

Consolidar o uso de desvios condicionais e incondicionais em Assembly RISC-V por meio de um comando if-else com bne e j. A seguinte expressão em C é traduzida para assembly usando bne e j:

if (i == j)
f = g + h;
else
f = g - h;
  1. Abra o simulador de linguagem RISC-V.
  2. No editor de texto do simulador, transcreva o código abaixo:
# Exercício 04
# C expression:
# if (i == j)
# f = g + h;
# else
# f = g - h;
.text
main:
addi s1, zero, 10 # g = 10
addi s2, zero, 20 # h = 20
addi s3, zero, 1 # i = 1
addi s4, zero, 2 # j = 2
bne s3, s4, Else # if (i != j) goto Else
add s0, s1, s2 # f = g + h
j Exit # goto Exit
Else:
sub s0, s1, s2 # f = g - h
Exit:
nop

Com os valores iniciais i = 1 e j = 2, o desvio é tomado e a execução salta para Else, calculando f = g - h.

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 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 x8x9x18x19x20
(s0)(s1)(s2)(s3)(s4)
0x000000000x000000000x000000000x000000000x00000000
0x00400000 addi s1 zero 10 0x0000000A

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

Agora altere a instrução addi que define s4 para atribuir j = 1 (igual a i):

addi s4, zero, 1 # j = 1

Clique em Reset para recarregar o programa e execute passo a passo novamente. Com i = j = 1, o desvio não é tomado e a execução continua normalmente para o add, em seguida salta para Exit via j, ignorando Else.

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 x8x9x18x19x20
(s0)(s1)(s2)(s3)(s4)
0x000000000x000000000x000000000x000000000x00000000
0x00400000 addi s1 zero 10 0x0000000A

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

Compare as duas tabelas e analise a diferença no fluxo de execução (observe a sequência de valores do PC) e o valor final de s0.