Skip to content

Laboratório 6

Objetivo

Escreva um programa em linguagem de montagem RISC-V que calcule a raiz quadrada aproximada de números inteiros.

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

Quatro números decimais de 4 dígitos separados por espaços (' '), seguidos por um caractere de nova linha (\n). O input completo ocupa 20 bytes. Formato da string - "DDDD DDDD DDDD DDDD\n" D: um dígito decimal (0-9)

Saída

Para cada número de 4 dígitos lido, você deve calcular sua raiz quadrada aproximada e escrever seu valor para STDOUT usando 4 dígitos, sendo que cada raiz quadrada deve ser separada por um espaço (' ') e a última delas é seguida por um caractere de nova linha (\n), então a saída também ocupará 20 bytes. Formato da string - "DDDD DDDD DDDD DDDD\n" D: um dígito decimal (0-9)

Exemplo

Input Output
0400 5337 2240 9166 0020 0073 0047 0095

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
    • Cada vez que a equação acima é aplicada é considerada "uma iteração"
  • Para este exercício, soluções aproximadas são aceita. 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_adress # buffer
        li a2, 20           # size - Reads 20 bytes.
        li a7, 63           # syscall read (63)
        ecall
        ret
    
    write:
        li a0, 1            # file descriptor = 1 (stdout)
        la a1, result       # buffer
        li a2, 20           # size - Writes 20 bytes.
        li a7, 64           # syscall write (64)
        ecall
        ret
    
    
    .bss
    
    input_address: .skip 0x20  # buffer
    
    result: .skip 0x20
    

Entrega

  • O código deve ser testado no seguinte link o report gerado deve ser submetido no Classroom com o nome de {SeuRA}_lab6.report
  • O report deve ser submetido até 18/04 as 23:59

Warning

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