Laboratório 8
Objetivo
Nesta atividade, você deve escrever um programa em linguagem assembly RISC-V que leia uma imagem no formato PGM de um arquivo e a exiba na tela usando o periférico canvas
Entrada
Seu programa deve ler um arquivo chamado 'image.pgm' que estará no mesmo diretório que o arquivo executável. A chamada de sistema open pode ser usada para abrir o arquivo (um exemplo é mostrado na seção de Notas).
Alguns exemplos de imagens PGM podem ser encontrados neste site: Arquivos PGMB - Arquivos Gráficos de Mapa de Tons Cinza Portátil Binário
Para desenvolver a atividade é possível pegar as imagens no link mas serão disponibilizados duas no Classroom
Os testes do report vão consistir em imagems pequenas de tamanho variável (entre 8 e 15) mas sempre com altura e largura iguais
Saída
Seu programa deve exibir a imagem na tela usando chamadas de sistema para o periférico Canvas. O Canvas deve ser ajustado para ter o tamanho da imagem. Para isso deve-se usar das seguintes chamadas de sistema:
Chamada | Input | Descrição |
---|---|---|
setPixel | a0: coordenada x do pixel a1: coordenada y do pixel |
Define a cor de um pixel de um canvas específico. Para escala de cinza, use os mesmos valores para as cores |
a2: cores concatenadas do pixel: R-G-B-A | (R = G = B) e alfa = 255 | |
A2[31..24]: Vermelho | ||
A2[23..16]: Verde | ||
A2[15..8]: Azul | ||
A2[7..0]: Alfa | ||
a7: 2200 (número da chamada de sistema) | ||
setCanvasSize | a0: largura do canvas (valor entre 0 e 512) | Reseta e define o tamanho do canvas. |
a1: altura do canvas (valor entre 0 e 512) | ||
a7: 2201 (número da chamada de sistema) |
Exemplos
Vão ser disponibilizadas duas imagens para se rodar manualmente uma pequena que é a Feep e outra maior que é a Coins, ambas tem tem que ter seu nome trocado para image quando forem submetidas no simulador
- Feep (7x24): Vai ajudar a ver se algo está saindo e se o arquivo está rodando, muito dificil de visualizar no Canvas do simulador por ser muito pequena
- Coins (300x246): maior para visualizar em mais detalhes o que tá sendo impresso, demora em torno de meia hora para rodar
Dicas
- Para testar no simulador, você deve carregar seu programa (arquivo .s) e o arquivo de imagem (nome 'image.pgm') simultaneamente.
- Quando novos arquivos são carregados no simulador, os antigos são apagados, então você deve carregar o programa e os arquivos de imagem juntos todas as vezes.
- Para usar o Canvas, você pode habilitá-lo no simulador. Para fazer isso, vá para a aba 'Hardware' -> tabela 'Dispositivos Externos' -> ícone '+' na linha do Canvas. Uma nova aba aparecerá onde o canvas pode ser visto. O link do teste já vem com ele configurado
- Este exercício usa vários números de
syscall
. Esses valores sempre serão armazenados no registradora7
, e a função ecall terá um comportamento diferente para cada valor. Para verificar asyscall
para uma funcionalidade específica, a tabela do simulador pode ser consultada (note que as syscalls relacionadas a dispositivos externos, como o Canvas, não são mostradas nesta tabela se o dispositivo não estiver habilitado). - Você não receberá imagens maiores que 512x512 (que tipicamente ocupam
262159 bytes
). - Em todas as imagens, o valor máximo (Maxval) será 255.
- O canvas é indexado começando do 0.
- Para ver as imagens sendo geradas é preciso abrir o Canvas, quando estiver rodando manualmente é preciso reseta-lo antes de abrir novamente
Note
Você precisa redimensionar o canvas (syscall setCanvasSize) de acordo com o cabeçalho do arquivo.
-
Exemplo
setPixel
para um pixel:li a0, 100 # x coordinate = 100 li a1, 200 # y coordinate = 200 li a2, 0xFFFFFFFF # white pixel li a7, 2200 # syscall setPixel (2200) ecall
-
Exemplo
open
: A chamada de sistema "open" retorna o descritor de arquivo (fd) para o arquivo ema0
. Esse descritor de arquivo deve ser usado na chamada de sistemaread
para indicar o arquivo do qual o sistema operacional deve ler a fim de obter o conteúdo do arquivo.la a0, input_file # address for the file path li a1, 0 # flags (0: rdonly, 1: wronly, 2: rdwr) li a2, 0 # mode li a7, 1024 # syscall open ecall input_file: .asciz "image.pgm"
Entrega
O código deve ser testado no seguinte link o report gerado deve ser submetido no Classroom com o nome de {SeuRA}_lab8.report
Warning
Esta é uma atividade que deve ser realizada programando-se em linguagem de montagem - A submissão de programas em linguagem de programação de alto nível, como C
, ou de programas gerados por ferramentas de compilação, serão considerados como fraude