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 k=y2
- Cada vez que a equação acima é aplicada é considerada "uma iteração" k′=k+yk2
- 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