Lista de Exercício - MC404 2025
First, Solve the Problem. Then, Write the Code. - John Johnson
Exercício 1
O objetivo é que você exercite o processo de escrita em RISC-V. Dessa forma, você será submetido a uma sequência de desafios.
1.1 Testando a porta de saída com um caracter
Você precisa testar se um único caractere pode ser enviado à tela. Utilize a syscall write para imprimir apenas a letra A
.
.data
caractere: .asciz "A\n"
.text
.globl _start
_start:
la a1, caractere
li a2, 2
# chamada de sistema aqui
li a0, 0
li a7, 93
ecall
1.2 Hello world! em RISC-V
Você é um desenvolvedor de hardware testando um novo processador recém-implementado. Após realizar diversas validações bem-sucedidas, falta apenas um último teste essencial: verificar se a chamada de sistema write (código 64) está funcionando corretamente.
Sua missão é completar o código abaixo para que ele utilize essa chamada e imprima, por meio do simulador ALE, a palavra secreta na saída padrão. Esse teste garantirá que o subsistema de escrita está operacional.
.data
msg: .asciz "Hello world!"
.text
.globl _start
_start:
la a1, msg # Carrega o endereço do output
# Chamada write aqui
#Saída do programa
li a0, 0 # Descreve o código de saída
li a7, 93 # código de saída
ecall
1.3 Escrevendo um poema (ou quase isso)
Sua missão é exibir uma mensagem artística no terminal. Utilize a chamada write para imprimir a frase RISC-V é poesia em bits\n
.
.data
poema: .asciz "RISC-V é poesia em bits\n"
.text
.globl _start
_start:
# Seu código aqui
li a0, 0
li a7, 93
ecall
1.4 Depuração ao estilo RISC-V
Durante o desenvolvimento, você quer saber se o código chegou até certo ponto. Para isso, exiba no terminal DEBUG: ponto alcançado\
usando a syscall write.
.data
debug_msg: .asciz "DEBUG: ponto alcançado\n"
.text
.globl _start
_start:
la a1, debug_msg
li a2, 24
# chamada de sistema aqui
li a0, 0
li a7, 93
ecall
Exercício 2
Você se saiu bem utilizando a chamada de sistema write (64). Agora você será apresentado a chamada de função de leitura.
2.1 Testando o canal de entrada
Como um desenvolvedor de hardware testando um novo processador. Após confirmar que ele consegue exibir mensagens, seu próximo passo é validar se o subsistema de entrada está funcionando corretamente.
Sua tarefa é completar o código abaixo para que o processador leia 2 caracteres digitados no teclado e armazene no buffer input e depois mostre na tela para garantir que está sendo armazenado corretamente.
.data
input: .skip 3
.text
.globl _start
_start:
li a0, 0 # file descriptor = 0 (stdin)
la a1, input # buffer
li a2, 3 # size
# Adicione aqui a chamada de sistema read
# Aqui sua chamada de sistema write
li a0, 0
li a7, 93
ecall
2.2 Interagindo com o usuário
Você está desenvolvendo um prompt interativo para um programa embarcado. A primeira funcionalidade é permitir que o usuário digite os dois primeiros caracteres do nome dele.
Complete o código abaixo para capturar essa entrada e mostre para o usário verificar se está correto.
.data
nome: .skip 3
.text
.globl _start
_start:
# Adicione aqui a chamada de sistema read
# Chamada write aqui
li a0, 0
li a7, 93
ecall
2.3 Leitura da temperatura externa
Você está desenvolvendo o firmware de um sensor inteligente que deve coletar dados digitados manualmente por um técnico de campo. Para o protótipo, a entrada será digitada pelo teclado e armazenada na memória.
Sua tarefa é capturar os dois primeiros caracteres da temperatura externa fornecida (ex: 25, -3, 41) e armazená-los no buffer temp e mostrar na tela para o técnico.
.data
temp: .skip 3
.text
.globl _start
_start:
# syscall de leitura aqui
# Chamada write
li a0, 0
li a7, 93
ecall
2.4 Captura de comando
Você está testando um microcontrolador que responde a comandos simples. Seu sistema deve capturar os dois primeiros caracteres do comando digitado para interpretá-lo e mostrar na tela o comando.
Adapte o código abaixo para isso!
.data
comando: .skip 3
.text
.globl _start
_start:
# syscall de leitura aqui
# syscall write aqui
li a0, 0
li a7, 93
ecall
Exercício 3
Você já consegue ler e escrever caracteres usando RISC-V. Agora está preparado para desafios maiores, você ira ter que usar operações matemáticas para manipular os dados lidos.
3.1 Soma básica
Você está desenvolvendo uma calculadora básica para um sistema embarcado. Ela deve ler dois números (1 dígito cada), somá-los e mostrar o resultado na tela. Sua saída sempre deve ter dois digitos, ou seja, para valores menores que 10, você deve colocar um caracter "0" na frente. Por exemplo: - Exemplo 1
input: 2 3 output: 05
- Exemplo 2
input 4 3
output: 07
.data
num1: .skip 2
num2: .skip 2
.text
.globl _start
_start:
# Leitura do primeiro número
# Leitura do segundo número
# Soma e exibição aqui
li a0, 0
li a7, 93
ecall
3.2 Soma com incremento
Você precisa testar um componente de entrada somando sempre 5 ao número que o usuário digitar. O número digitado será de 1 dígito (entre 0 e 9). Sua saída sempre deve ter dois digitos, ou seja, para valores menores que 10, você deve colocar um caracter "0" na frente. Por exemplo: - Exemplo 1
input: 2
output: 07
- Exemplo 2
input 4
output: 09
.data
entrada: .skip 2
.text
.globl _start
_start:
# Leitura do número
li a0, 0
la a1, entrada
li a2, 2
li a7, 63
ecall
# Cálculo e exibição aqui
li a0, 0
li a7, 93
ecall
3.3 Subtraindo dois números digitados
Crie um programa que leia dois números de 1 dígito cada, subtraia o segundo do primeiro e exiba o resultado na tela. Lembre-se de que o resultado pode ser negativo!
Lembre-se que seu output deve ser sempre conter o sinal do número.
Output de exemplo: -2\n ou +2\n
.data
num1: .skip 2
num2: .skip 2
.text
.globl _start
_start:
# Leitura dos numeros
# Subtração e saída aqui
li a0, 0
li a7, 93
ecall
3.4 Quanto falta para 9?
Seu programa precisa descobrir quanto falta para o número 9, subtraindo o valor digitado pelo usuário (entre 0 e 9). A resposta deve ser mostrada na tela.
.data
entrada: .skip 2
msg: .asciz "Falta: "
.text
.globl _start
_start:
# Leitura do número
# Subtração e impressão aqui
li a0, 0
li a7, 93
ecall
Exercício 4
Você se saiu muito bem, mas agora vamos complicar um pouco.
4.1 Engenharia reversa de um sistema de autenticação
Um firewall digital protege a entrada de um sistema bancário. Para desbloquear o acesso, você precisa reproduzir a lógica de autenticação baseada em dois códigos de acesso que são multiplicados internamente.
Seu objetivo é completar o programa para:
- Ler os dois dígitos secretos do usuário;
- Multiplicá-los;
- Exibir o resultado na tela como "Token de acesso: X"
.
.data
code1: .skip 2
code2: .skip 2
msg: .asciz "Token de acesso: "
.text
.globl _start
_start:
# Entrada do primeiro código
# Entrada do segundo código
# Sua código aqui...
li a0, 0
li a7, 93
ecall
Sua saída sempre deve ter dois digitos, ou seja, para valores menores que 10, você deve colocar um caracter "0" na frente. Por exemplo: - Exemplo 1
input: 2 e 3
output: 06
- Exemplo 2
input 2 4
output: 08
4.2 Distribuindo dados em setores via divisão
Você está tentando extrair dados de um disco criptografado. O sistema divide os dados em setores fixos e só libera as informações se o número de bytes for perfeitamente distribuído. As entradas sempre terão no máximo 2 digitos.
Seu trabalho é:
- Ler o número de bytes do arquivo;
- Ler o número de setores disponíveis;
- Dividir os bytes igualmente entre os setores e imprimir: "Bytes por setor: X"
.
.data
bytes: .skip 2
setores: .skip 2
msg: .asciz "Bytes por setor: "
.text
.globl _start
_start:
# Entrada de número de bytes
# Entrada de número de setores
# Sua código aqui
li a0, 0
li a7, 93
ecall
Caso de Teste 1: Divisão Exata
Entrada:
3
2
Bytes por setor: 1
Caso de Teste 2: Divisão sem resto
Entrada:
10
2
Bytes por setor: 25
Caso de Teste 3: Divisão com resto
Entrada:
7
3
Bytes por setor: 2