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
maior
Exemplo 2
Entrada:
11
14
menor
Exemplo 3
Entrada:
15
15
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
13
Exemplo 2
Entrada:
11
14
19
19
Exemplo 3
Entrada:
01
09
07
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
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