Skip to content

🧪 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