Skip to content

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 de 0 a 9).

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 A e B
    • Enquanto B for diferente de 0:
      • Calcule o resto da divisão de A por B (\(R = A \pmod B\))
      • O novo valor de A passa a ser B
      • O novo valor de B passa a ser R
    • Quando \(B\) chegar a 0, o valor do MDC será o valor atual de A
  • 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