Skip to content

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 feep
  • Coins (300x246): maior para visualizar em mais detalhes o que tá sendo impresso, demora em torno de meia hora para rodar

coins2

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 registrador a7, e a função ecall terá um comportamento diferente para cada valor. Para verificar a syscall 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 em a0. Esse descritor de arquivo deve ser usado na chamada de sistema read 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