Skip to content

Lista de Exercício 2 - MC404 2025

The only way to learn a new programming language is by writing programs in it. – Dennis Ritchie

Exercício 1

Vamos praticar o controle de fluxo em RISC-V, exercitando uso de saltos.

1.1 Comparar dois números

Você deve implementar um programa que lê dois números e compara eles. Os dois números terão exatamente 2 dígitos (serão prefixados com 0 se menores que 10). O programa deve imprimir "maior" se o primeiro número for maior que o segundo, "menor" se o primeiro número for menor que o segundo e "igual" se os números forem iguais.

Exemplo 1

Entrada:

12
05
Saída esperada: maior

Exemplo 2

Entrada:

11
14
Saída esperada: menor

Exemplo 3

Entrada:

15
15
Saída esperada: igual

.data
msg_maior:     .asciz "maior\n"
msg_menor:     .asciz "menor\n"
msg_igual:     .asciz "igual\n"
num1:          .space 3   # espaço para 2 caracteres + \n
num2:          .space 3

.text
.globl _start

_start:
    # Leitura do primeiro número
    # Leitura do segundo número
    # Comparar e exibir aqui
    # Encerrar programa
    li a0, 0
    li a7, 93
    ecall

1.2 Encontrar o maior entre três números

Vamos dar um leve incremento ao anterior. Você deve implementar um programa que lê três números e imprime o maior deles. Os números terão exatamente 2 dígitos (serão prefixados com 0 se menores que 10).

Exemplo 1

Entrada:

13
06
08
Saída esperada: 13

Exemplo 2

Entrada:

11
14
19
Saída esperada: 19

Exemplo 3

Entrada:

01
09
07
Saída esperada: 09

.data
num1:          .space 3
num2:          .space 3
num3:          .space 3
num_result:    .space 3

.text
.globl _start

_start:
    # Leitura do primeiro número
    # Leitura do segundo número
    # Leitura do terceiro número
    # Encontrar o maior dos três
    # Imprimir maior número

    # Encerrar programa
    li a0, 0
    li a7, 93
    ecall

1.3 Fizz Buzz

Um clássico em entrevistas de emprego: você deve implementar o famoso Fizz Buzz. Você receberá um número inteiro de até 4 dígitos, e imprimir: - "Fizz" se o número for divisível por 3 - "Buzz" se o número for divisível por 5 - "FizzBuzz" se o número for divisível por 3 e 5 - O número caso não seja divisível por 3 ou 5

Note que, desta vez, o número não necessariamente terá exatos 4 dígitos. Você deve descobrir o tamanho em tempo de execução para converter a string em inteiro.

Exemplo 1

Entrada: 1245 Saída esperada: FizzBuzz

Exemplo 2

Entrada: 243 Saída esperada: Fizz

Exemplo 3

Entrada: 55 Saída esperada: Buzz

Exemplo 4

Entrada: 7 Saída esperada: 7

.data
fizz:          .asciz "Fizz\n"
buzz:          .asciz "Buzz\n"
fizzbuzz:      .asciz "FizzBuzz\n"
buffer:        .space 5       # espaço para até 4 dígitos + '\n'

.text
.globl _start

_start:
# Leitura do número
# Converter string para inteiro
# Decidir o que imprimir
# Imprimir

exit:
    li a0, 0
    li a7, 93
    ecall

Exercício 2

Ótimo! Agora vamos praticar o uso de loops em RISC-V.

2.1 Soma de números

Você deve implementar um programa que soma todos os números inteiros positivos digitados pelo usuário. Cada número será digitado em uma linha separada, e terá no máximo 4 dígitos. O programa deve parar quando o usuário digitar 0, e imprimir a soma total dos números digitados.

Exemplo 1

Entrada:

12
34
0
Saída esperada: 46

Exemplo 2

Entrada:

5
2450
300
12
0

Saída esperada: 2767

Exemplo 3

Entrada:

0

Saída esperada: 0

.data
buffer:         .space 5      # até 4 dígitos + '\n'
result_str:     .space 11     # até 10 dígitos + '\n'

.text
.globl _start

_start:
    # Seu código aqui
    # Encerrar
    li a0, 0
    li a7, 93
    ecall

2.2 Tabuada

Você deve implementar um programa que lê um número inteiro positivo e imprime a tabuada desse número. O número terá no máximo 4 dígitos.

Exemplo 1

Entrada: 12

Saída esperada:

12 x 1 = 12
12 x 2 = 24
12 x 3 = 36
12 x 4 = 48
12 x 5 = 60
12 x 6 = 72
12 x 7 = 84
12 x 8 = 96
12 x 9 = 108
12 x 10 = 120

Exemplo 2

Entrada: 5

Saída esperada:

5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50

.data
buffer:      .space 5             # número com até 4 dígitos
line_buf:    .space 32            # buffer para montar cada linha
times_sym:   .asciz " x "
eq_sym:      .asciz " = "

.text
.globl _start

_start:
    # Seu código aqui
    # Encerrar
    li a0, 0
    li a7, 93
    ecall

2.3 - Fibonacci

A série de Fibonacci é uma sequência de números inteiros onde cada número é a soma dos dois anteriores. A sequência começa com 0 e 1, e assim segue: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Você deve implementar um programa que lê um número inteiro positivo e imprime os N primeiros números da sequência de Fibonacci, separados por espaço. O número terá no máximo 2 dígitos.

Exemplo 1

Entrada: 10

Saída esperada:

0 1 1 2 3 5 8 13 21 34

Exemplo 2

Entrada: 5

Saída esperada:

0 1 1 2 3```

Exemplo 3

Entrada: 0

Saída esperada:


.data
space:       .asciz " "
newline:     .asciz "\n"
buffer:      .space 3         # até 2 dígitos + \n
str_buf:     .space 12        # para converter cada número

.text
.globl _start

_start:
    # Seu código aqui
    # Encerrar
    li a0, 0
    li a7, 93
    ecall

2.4 - Fatorial

O fatorial de um número N é o produto de todos os números inteiros positivos menores ou iguais a N. O fatorial de 0 é definido como 1. Você deve implementar um programa que lê um número inteiro positivo e imprime o fatorial desse número. O número terá exatamente 1 dígito.

Exemplo 1

Entrada: 5

Saída esperada: 120

Exemplo 2

Entrada: 0

Saída esperada: 1

Exemplo 3

Entrada: 9

Saída esperada: 362880

Desafio: faça recursivamente, com chamadas de função! É uma boa forma de exercitar o uso de pilha.

.data
newline:    .asciz "\n"
buffer:     .space 2
result_buf: .space 16

.text
.globl _start

_start:
    # Seu código aqui
    # Encerrar
    li a0, 0
    li a7, 93
    ecall

# -----------------------
# factorial(n): a0 = n, retorna em a0
# usa stack para empilhar ra e a0
factorial:
    # implemente aqui a função