🧪 Laboratório 5 - Calculado Ráiz Quadrada
📝 Descrição - Peso 2
Escreva um programa em linguagem de montagem RISC-V que calcule a hipotenusa aproximada de um triângulo retângulo.
Para realizar a leitura e escrita de dados do/para o terminal, você deve usar as chamadas de sistema read e write (similarmente aos lab anteriores, mas agora em linguagem de montagem).
Exemplo de read:
li a0, 0 # file descriptor = 0 (stdin)
la a1, input_address # buffer to write the data
li a2, 1 # size (reads only 1 byte)
li a7, 63 # syscall read (63)
ecall
input_address: .skip 0x10 # buffer
Exemplo de write:
li a0, 1 # file descriptor = 1 (stdout)
la a1, string # buffer
li a2, 19 # size
li a7, 64 # syscall write (64)
ecall
string: .asciz "Hello! It works!!!\n"
Entrada
Três pontos com coordenadas X e Y de 2 dígitos em formato (coordX coordY), seguidos por um caractere de nova linha ('\n')
. O input completo ocupa 24 bytes.
Formato da string - "(DD DD) (DD DD) (DD DD)\n"
Sendo a primeira coordenada (A) o ponto com ângulo reto, a segunda (B) um ponto a sua direita e a terceira (C) um ponto acima da primeira.
Observação: todas as entradas formam obrigatoriamente um triângulo retângulo em que A está no mesmo Y de B e no mesmo X de C.
D: um dígito decimal (0-9)
Saída
Você deve calcular os catetos e o valor aproximado da hipotenusa, e escrever seu valor para STDOUT usando 3 dígitos. Ou seja, sua saída deverá estar no formato "DDD\n".
D: um dígito decimal (0-9)
📥 Exemplo
Input | Output |
---|---|
(00 00) (15 00) (00 12) | 019 |
Input | Output |
---|---|
(80 40) (99 40) (80 75) | 039 |
Input | Output |
---|---|
(00 00) (99 00) (00 99) | 140 |
Input | Output |
---|---|
(12 37) (13 37) (12 39) | 002 |
💡 Dicas
- É recomendado o uso do método babilônico com 10 iterações. Considerando que queremos calcular a raiz quadrada de um número y, a ideia básica deste método é:
- Calcular uma estimativa inicial para a raiz quadrada
- Aproxime sua estimativa, k, para o valor real da raiz quadrada aplicando a seguinte equação
k = y / 2
- Cada vez que a equação abaixo é aplicada é considerada "uma iteração"
k' = (k + y/k)/2
- Para este exercício, soluções aproximadas são aceitas. Soluções com um erro absoluto menor que 10 serão consideradas corretas
- Outros métodos de aproximação de raiz quadrada podem ser usados, contanto que:
- Sejam usados apenas números inteiros.
- Números de ponto flutuante ou a instrução de raiz quadrada RISC-V não podem ser usados.
- Sugestão de estrutura inicial de arquivo .s:
.globl _start
_start:
jal main
li a0, 0
li a7, 93 # exit
ecall
main:
# Código aqui
read:
li a0, 0 # file descriptor = 0 (stdin)
la a1, input_address # buffer
li a2, 24 # size - Reads 24 bytes.
li a7, 63 # syscall read (63)
ecall
ret
write:
li a0, 1 # file descriptor = 1 (stdout)
la a1, result # buffer
li a2, 4 # size - Writes 4 bytes.
li a7, 64 # syscall write (64)
ecall
ret
.bss
input_address: .skip 0x18 # buffer
result: .skip 0x4
Entrega
O código deve ser testado no seguinte link o report gerado deve ser submetido no Classroom com o nome de lab5_ra.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