Laboratório 5
Objetivo
Escreva um programa em linguagem de montagem RISC-V que calcule o Mínimo Múltiplo Comum (MMC) entre dois números inteiros. O cálculo deve ser feito de forma iterativa.
Para realizar a leitura e escrita de dados do/para o terminal, você deve usar as chamadas de sistema read e write (similarmente aos labs 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
Dois números inteiros de 2 dígitos, separados por um espaço em branco e seguidos por um caractere de nova linha \n. O input completo ocupa 6 bytes.
Formato da string - DD DD\n
Tip
- Os números de entrada nunca serão
00. D: um dígito decimal de0a9).
Saída
Você deve calcular o Mínimo Múltiplo Comum (MMC) entre os dois valores lidos e escrever o resultado para STDOUT sempre usando 4 dígitos (adicionando zeros à esquerda se o resultado for menor que 1000), seguido de uma quebra de linha \n.
Ou seja, sua saída deverá estar no formato DDDD\n, sendo D um dígito decimal (0-9)
Exemplo
| Input | Output |
|---|---|
| 15 03\n | 0015\n |
| Input | Output |
|---|---|
| 40 20\n | 0040\n |
| Input | Output |
|---|---|
| 27 18\n | 0054\n |
Dicas
- É recomendado calculcar o MMC a partir do MDC (Máximo Divisor Comum). A relação matemática entre os dois é dada por:
- O método recomendado para calcular o MDC é o Algoritmo de Euclides. A ideia básica deste método iterativo é:
- Dados dois números
AeB - Enquanto
Bfor diferente de0:- Calcule o resto da divisão de
AporB(\(R = A \pmod B\)) - O novo valor de
Apassa a serB - O novo valor de
Bpassa a serR
- Calcule o resto da divisão de
- Quando \(B\) chegar a
0, o valor do MDC será o valor atual deA
- Dados dois números
- 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, 6 # size - Reads 6 bytes. li a7, 63 # syscall read (63) ecall ret write: li a0, 1 # file descriptor = 1 (stdout) la a1, result # buffer li a2, 5 # size - Writes 5 bytes. li a7, 64 # syscall write (64) ecall ret .bss input_address: .skip 0x06 # buffer result: .skip 0x5
Entrega
O código deve ser testado no seguinte link o report gerado deve ser submetido no Classroom com o nome de {SeuRA}_lab5.report
Warning
- Qualquer alteração no arquivo de report será considerado fraude
- O uso de ferramentas de IA deve ser reportado, indicando como foi utilizado e em quais partes do código.
- 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