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
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