Skip to content

Laboratório 10 - Trabalhando com Recursão e ABI

📝 Descrição - Peso 2

Neste laboratório, você irá implementar um programa em linguagem assembly RISC-V que tenha as funções compatíveis com ABI chamadas de int fibonacci_recursive(int num), int fatorial_recursive(int num) e void torre_de_hanoi(int num, char de, char auxiliar, char ate, char* str). Seu código será vinculado a um código em C que chama as três respectivas funções.

Funções Recursivas
  • int fibonacci_recursive(int num)
Descrição Parâmetros Valor de Retorno
int fibonacci_recursive(int num) Número da qual você quer achar o valor de fibonacci O valor de fibonnaci para o número "num"
  • int fatorial_recursive(int num)
Descrição Parâmetros Valor de Retorno
int fibonacci_recursive(int num) Número da qual você quer achar o fatorial O fatorial do número "num"
  • void torre_de_hanoi(int num, char de, char auxiliar, char ate, char* str)

Torre de Hanoi é um jogo que consiste de pegar todos os discos que estão na primeira torre (torre A) e levá-los até a terceira torre (torre C), com as seguintes regras:

  • Um disco maior não pode ficar em cima de um disco menor
  • Um disco apenas pode ser movido por vez

Torre de Hanoi

Pensando nisso, a função torre_de_hanoi deve ser implementada seguindo a ABI e imprimindo a sequência de movimentos que devem ser feitos. Uma string de exemplo com o nome print_hanoi estará disponível para ajudá-los, e o máximo de discos que a sua função deve resolver a torre de hanoi é 9.

IMPORTANTE: As TRÊS funções devem ser implementadas de forma recursivas. Implementá-las de forma serial, resulta em 0 na atividade.

Além delas, você ainda precisará implementar algumas funções utilitárias que serão necessárias para este lab:

Funções
  • void puts ( const char *str )
Descrição Parâmetros Valor de Retorno
puts - C++ String terminando com '\0' Nenhum
  • char *gets ( char *str )
Descrição Parâmetros Valor de Retorno
gets - C++ Buffer a ser preenchido Consulte a documentação da função
  • int atoi (const char *str)
Descrição Parâmetros Valor de Retorno
atoi - C++ String terminada por '\0' Inteiro representado pela string
  • char *itoa ( int value, char *str, int base )
Descrição Parâmetros Valor de Retorno
itoa - C++ Valor a ser convertido, buffer a ser preenchido e base 10 Ponteiro para o buffer
  • void exit(int code)
Descrição Parâmetros Valor de Retorno
Chama a syscall exit para terminar o programa Código de retorno Nenhum
biblio.h
void puts ( const char *str );
char *gets ( char *str );
int atoi (const char *str);
char *itoa ( int value, char *str, int base );
void exit(int code);
int fibonacci_recursive(int num);
int fatorial_recursive(int num);
void torre_de_hanoi(int num, char de, char auxiliar, char ate, char* str);
Entrada

Número do caso de teste e entrada específica dependendo do caso de teste. Segue um exemplo do arquivo que será linkado ao seu pelo assistente de correção:

#include "biblio.h"

char buffer[100];
char print_hanoi[40] = "Mover disco _ da torre _ para a torre _\0";

#define NULL 0

void run_operation(int op){
    int o_quanto_a_equipe_de_404_e_legal = 0;
    switch (op){
        case 0:         // FIBONACCI
            o_quanto_a_equipe_de_404_e_legal = fibonacci_recursive(atoi(gets(buffer)));
            puts(itoa(o_quanto_a_equipe_de_404_e_legal, buffer, 10));
            break;

        case 1:         // FATORIAL
            o_quanto_a_equipe_de_404_e_legal = fatorial_recursive(atoi(gets(buffer)));;
            puts(itoa(o_quanto_a_equipe_de_404_e_legal, buffer, 10));
            break;

        case 2:         // Hanoi
            torre_de_hanoi(atoi(gets(buffer)), 'A', 'B', 'C', print_hanoi);
            break;

        default:
            break;
        }
}

void _start(){
    int operation = atoi(gets(buffer));
    run_operation(operation);
    exit(0);
}
Saída

Saída conforme o caso de teste.

Notas e Dicas
  • Os símbolos devem ser definidos como globais (diretiva .globl) para que o linker resolva referências não definidas.
  • O caractere \0 corresponde ao byte nulo, que tem o valor 0. No entanto, usar li a0, '\0' pode levar a erros porque o montador interpreta o valor como o caractere '0' (que tem um valor ASCII de 48) em vez do byte nulo.
  • Muito importante utilizar a pilha do programa e a manter organizada
  • Você pode testar seu código usando o assistente do simulador a partir deste link. Lembre-se de entregar seu .report para no classroom com o nome raXXXXX.report.

Warning

  • Qualquer alteração no arquivo de report será considerado fraude
  • Esta é uma atividade que deve ser realizada programando-se em linguagem de montagem - A submissão de programas em linguagem de programação de alto nível, como C, ou de programas gerados por ferramentas de compilação, serão considerados como fraude
  • Está é uma atividade individual, o qual deve ser desenvolvido individualmente, qualquer forma de cópia ou plágio será penalizada. Portanto, atividades que apresentarem semelhanças injustificadas serão atribuídas nota zero para todos os envolvidos