Anda di halaman 1dari 5

Pontifcia Universidade Catlica do Rio Grande do Sul Disciplina de Arquitetura de Computadores I Prof.

Eduardo Augusto Bezerra

Relatrio do Trabalho Final

Aluna: Fernanda Gonalves de Azevedo Data de Entrega: 01/12/06

Introduo
Este trabalho consiste na implementao de um programa em assembly do processador 8086 , arquitetura IA32, utilizando obrigatoriamente o sistema operacional Linux, para transformar um arquivo BMP colorido, de 24 bits de resoluo, no compactado, em um arquivo equivalente mas, com a imagem em tons de cinza. A resoluo do problema proposto segue explicada detalhadamente abaixo.

Resoluo
O primeiro processo realizado foi declarar algumas constantes, com os valores padres para as funes do sistema operacional. Na seo de dados foi criado file_in que a referncia para o arquivo de entrada (teste.bmp) e file_out que a referncia para o arquivo que vai ser criado (testesaida.bmp). Na seo de declarao de variveis foram criadas as seguintes: assinatura do formato do arquivo (header), dados do pixel (pixel), descritor do arquivo de entrada (aux1), descritor do arquivo de sada (aux2), altura do arquivo (height), largura do arquivo (width) e nmero de bytes extras (n_extras). A seguir, descrevo os passos para solucionar o problema proposto: 1 Colocar nos registradores os valores padres para realizar a chamada do sistema, para fins de ler o arquivo de entrada; aps a leitura guardado o descritor deste arquivo na varivel aux1. 2 A seguir necessrio verificar se o arquivo um BMP de 24 bits de resoluo, no compactado, para isso, faz-se a leitura dos 54 bytes do arquivo, verificando primeiramente pelo primeiro e segundo byte se realmente um BMP, aps verifica-se se este arquivo de 24 bits, usando para isso o byte 28 do arquivo e por ltimo se o mesmo possui compresso atravs do byte 30, caso em alguma dessas verificaes o desejado no acontea, o programa interrompido, gerando uma mensagem de erro. 3 Caso o arquivo de entrada seja do formato desejado, criado o arquivo de destino, colocando para isso os valores padres para realizar a chamada do sistema nos registradores, aps a criao do arquivo guardado o descritor do arquivo de sada na varivel aux2. 4 Depois de criado um novo arquivo, escrito nele a assinatura do seu formato, ou seja, os 54 bytes lidos do arquivo de origem., usando os valores padres para realizar a chamado do sistema, referente escrita, nos registradores.

5 - Aps necessrio buscar a quantidade de linhas e colunas do arquivo de entrada e guardar nas variveis heighte width, respectivamente. 6 O prximo passo verificar o nmero de bytes extras da figura, ou seja, o lixo no final do arquivo. guardado os valores das variveis height e width que tnhamos do passo anterior nos registradores eax e ebx, respectivamente, multiplicamos esses dois valores e esse resultado multiplicamos por 3 e a esse resultado somamos 54. A multiplicao por 3 refere-se aos 3 bytes contidos em cada pixel e o valor 54 corresponde a quantidade de bytes existentes no header. Subtrai-se o valor do tamanho total do arquivo contido em eax de ebx, colocando-se o resultado em ebx, aps divide-se o valor contido em eax pelo nmero total de linhas (height) e por final coloca-se o valor resultante que encontra-se no registrador eax na varivel (n_extras). Na varivel n_extras, agora temos o valor total de lixo extras no final de cada linha. 7 Prxima etapa inicializar os registradores ecx e edx que vo ser utilizados no loop, que so guardados na pilha. 8 O registrador edx carregado com o valor da varivel height, nmero de linhas, o qual, vai funcionar como loop externo e o registrador ecx carregado com o valor da varivel width que vai funcionar como loop interno, o valor do registrador ecx subtrado da quantidade de bytes extras no final de cada linha, a qual, foi guardado na varivel n_extras, este valor atualizado na pilha. 9 Agora lido os bytes do pixel. Executa-se uma chamada de sistema, definindo anteriormente nos registradores , os valores padres para realizar a leitura de um arquivo. Aplica-se agora a frmula para transformao dos 3 bytes do pixel colorido em tons de cinza, a qual aplicada da seguinte maneira, para cada byte do pixel: 1Antes de realizar os clculos, zerado os registradores que sero utilizados; 2O valor do primeiro byte, responsvel pela cor azul, armazenado na parte baixa de eax e o valor 11 armazenado na parte baixa de ebx, aps multiplica-se esses dois valores e divide-se o resultado por 100. Esse resultado guardado no registrador edx. 3O valor do segundo byte, responsvel pela cor verde, transformado atravs do mesmo processo utilizado para o primeiro byte, sendo que o valor dele multiplicado por 59 e no por 11, esse valor acumulado no registrador edx, o qual no foi zerado para este segundo clculo. 4Para o terceiro byte, responsvel pela cor vermelha, utilizamos novamente o mesmo processo s que multiplicando o valor do mesmo por 3 e finalmente o ltimo valor do pixel guardado na varivel edx.

Ao final desse processo gravado na varivel pixel o valor acumulado no registrador edx. 10 - Aps gravado o pixel j com os valores em tons de cinza no arquivo de sada, usando para isso os valores padres nos registradores para fins de escrita em um arquivo. 11 buscado o valor do registrador ecx na pilha, que corresponde largura da linha e o mesmo decrementado e testado, caso no chegou a zero chama o loop interno novamente e recomea todo o processo desde o item 9. 12 Caso esse registrador j esteja zerado colocado a quantidade de bytes de lixo no registrador eax, se o mesmo for igual a zero o programa chama o loop_continua que faz o descrito no prximo passo, caso seja diferente de zero lido o lixo do arquivo de entrada e gravado no arquivo de sada, isso ocorre para cada final de linha, nessas etapas tambm necessrio carregar os registradores com os valores padres para a leitura do arquivo de entrada e aps para a escrita no arquivo de sada. OBS.: O loop do lixo realizado conforme o nmero de bytes extras no final da linha. 13 Antes de decrementar o registrador edx, que contm a quantidade de linhas do arquivo, necessrio buscar os valores dos registradores na pilha para atualiz-los. 14 Caso o registrador edx no esteja zerado chamado o loop externo, que ir passar para a prxima linha do arquivo, e caso contrrio, ir finalizar o programa.

Concluso
Com o trmino deste trabalho conclu que possvel realizar a converso de arquivo de imagem colorida e transform-lo em outro com uma imagem equivalente em tons de cinza, utilizando pequenas sub-rotinas do assembler, bem como, rotinas usando pilha, que simulam a funcionalidade do comando for.

Bibliografia
http://toledo.inf.pucrs.br/~eduardob/disciplinas/arqi/sem06.2/. http://www.google.com.br/ http://twiki.im.ufba.br/pub/MAT149/WebHome/Parte3.pdf

Anda mungkin juga menyukai