Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

David Rego

Ajuda para trabalho de assembly

Mensagens Recomendadas

David Rego

Boa noite!

Preciso de fazer um programa em assembly para converter uma imagem bmp para monocromático.

O programa deve abrir um ficheiro de imagem bmp e deve converter e guardar em monocromático.

Alguém me pode ajudar nisto, visto que é a primeira vez que estou a dar assembly :S

Abraço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Triton

Tipo de assembly? :S

Não percebi muito bem, mas trabalhamos para o 8086 da intel...

Quando disse tipo, é a arquitectura, neste caso o 8086.

Quais são as dúvidas que tens?


<3 life

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
David Rego

Boas!

Eu ja tenho o código para abrir o ficheiro, mas agora falta o resto, ou seja, converter a imagem para monocromático e depois fechar o programa. Eu sei mais ou menos os procedimentos, mas não sei muito bem trabalhar com o assembly para fazer isso.

Podes-me ajudar nisso?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cisco

Olá,

Já trabalhei com o assembly do 8086 mas não nenhum pro.

Mas queres converter uma imagem a cores do tipo .bmp para monocromático, é isso? Ou seja, uma imagem a cores para preto e branco?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cisco

É assim, primeiro tens de saber como se converte da escala das cores para a escala de cinzentos.

Depois disto, tens de saber como se organizam os bits do ficheiro em .bmp, e converter esses bits para os bits da tua escala de cinzentos.

Lembro me de fazer isto mas era em matlab. Em assembly tens mesmo de ir bit-a-bit e modificar, neste caso deve ser por linhas, digo eu.

Vê aqui como os pixels se organizam: http://en.wikipedia.org/wiki/BMP_file_format

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
David Rego

Ora bem, vou orientar qualquer coisa para ver se se torna mais fácil ajudarem-me.

Portanto, o programa já contém o nome do ficheiro que vai abrir. Depois da conversão tem que acrescentar as letras BW no inicio do nome do ficheiro.

Para converter tenho que:

- ler as componentes RGB de cada pixel, sendo que cada componente ocupa 1 byte (3 bytes por pixel);

- somar as três componentes de cada pixel, dividir por três;

- retirar a cada componente a média acima calculada, obtendo o monocromático;

Na imagem existe também um header (cabeçalho) que não deve ser alterado na conversão.

vou deixar alguns códigos que o prof disponibilizou para ajudar...

imprimir ficheiro:

.8086
.model small
.stack 2048h

dseg    segment para public 'data'
        Erro_Open       db      'Erro ao tentar abrir o ficheiro$'
        Erro_Ler_Msg    db      'Erro ao tentar ler do ficheiro$'
        Erro_Close      db      'Erro ao tentar fechar o ficheiro$'
        Fich         	db      'ABC.TXT',0
        HandleFich      dw      0
        car_fich        db      ?
dseg    ends



cseg    segment para public 'code'
assume  cs:cseg, ds:dseg

Main    Proc

        mov     ax,dseg
        mov     ds,ax


;abre ficheiro
        xor     si,si
        mov     ah,3dh
        mov     al,0
        lea     dx,Fich
        int     21h
        jc      erro_abrir
        mov     HandleFich,ax
        jmp     ler_ciclo

erro_abrir:
        mov     ah,09h
        lea     dx,Erro_Open
        int     21h
        jmp     sai

ler_ciclo:
        mov     ah,3fh
        mov     bx,HandleFich
        mov     cx,1
        lea     dx,car_fich
        int     21h
jc	erro_ler
cmp	ax,0		;EOF?
je	fecha_ficheiro
        mov     ah,02h
mov	dl,car_fich
int	21h
jmp	ler_ciclo

erro_ler:
        mov     ah,09h
        lea     dx,Erro_Ler_Msg
        int     21h

fecha_ficheiro:
        mov     ah,3eh
        mov     bx,HandleFich
        int     21h
        jnc     sai

        mov     ah,09h
        lea     dx,Erro_Close
        Int     21h
sai:
        mov     ah,4ch
        int     21h
Main    endp
cseg	ends
end     Main           

ABRIR UM FICHEIRO

.8086
.MODEL SMALL
.STACK 2048

DADOS SEGMENT
fname	db	'ABC.TXT',0
fhandle dw	0
buffer	db	'Definicoes de informatica por Murphy:',13,10
	db 	'Software: partes do sistema informatico que nao funcionam.',13,10
	db	'Perifericos: partes do sistema informatico que sao incompativeis com este.',13,10 
	db	'Impressora: parte do sistema informatico que avaria assim que se deixa de olhar.',13,10
	db 	'Cabo: parte do sistema informatico que e sempre demasiado curta.',13,10
	db	'Copia de seguranca: uma operacao que nunca e feita a tempo.',13,10
	db	'Memoria: parte do sistema informatico que e insuficiente.',13,10
	db	'Ficheiro: parte do sistema informatico que nunca pode ser encontrada.',13,10
	db	'Processador: parte do sistema informatico que esta sempre obsoleta.',13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
	db	78 dup ('_'),13,10
msgErrorCreate	db	"Ocorreu um erro na criacao do ficheiro!$"
msgErrorWrite	db	"Ocorreu um erro na escrita para ficheiro!$"
msgErrorClose	db	"Ocorreu um erro no fecho do ficheiro!$"
DADOS ENDS


CODIGO	SEGMENT	para	public	'code'
ASSUME	CS:CODIGO, DS:DADOS
Main proc
MOV	AX, DADOS
MOV	DS, AX

mov	ah, 3ch
mov	cx, 00H
lea	dx, fname
int	21h
jnc	escreve

mov	ah, 09h
lea	dx, msgErrorCreate
int	21h

jmp	fim

escreve:
mov	bx, ax
    	mov	ah, 40h
lea	dx, buffer
    	mov	cx, 1300
int	21h
jnc	close

mov	ah, 09h
lea	dx, msgErrorWrite
int	21h
close:
mov	ah,3eh
int	21h
jnc	fim

mov	ah, 09h
lea	dx, msgErrorClose
int	21h
fim:
MOV	AH,4CH
INT	21H
main	endp
CODIGO	ENDS
END	main

LER TECLA

.model small
.8086
.stack 2048h

dseg	segment
Msg_tecla	db	'A tecla premida foi$'
dseg    ends

cseg	segment para public 'code'
assume  cs:cseg, ds:dseg

Main	proc
mov   ax, dseg
mov   ds, ax

ciclo:
        mov   ah,0bh            ;funcao que le sem tirar do buffer
        int   21h
        cmp   al,0ffh           ;Ve se tem Tecla no Buffer
        jne   ciclo         	;Enquanto não tem tem tecla no buffer,espera
        mov   ah,08h            ;Funcao para ler do teclado/buffer
        int   21h            
        cmp   al,0              ;Ve se a tecla lida=0 (estendida)
        jne   tecla_simples     ;Se nao era estendida trata tecla
        mov   ah,08h            ;sendo estendida volta a ler codigo
        int   21h

tecla_simples:
PUSH	AX
        mov     ah,09h
        lea     dx,Msg_tecla
        int     21h
mov	dl,' '
mov	ah,02h
int	21h
POP	AX
mov	dl,al
mov	ah,02h
int	21h

FIM:
MOV     Ah,4CH ;Terminar programa
INT     21H
Main    endp
cseg    ends
end     Main

CALCULAR A MEDIA DE 2 BYTES

; Programa que usa um procedimento para calcular a
; media de dois bytes, usando registos para implementar
; a passagem de parametros
;
DATA_HERE 	SEGMENT
	lo_num	DB 64h
	hi_num	DB 11001000b
	average DB ?
DATA_HERE	ENDS

STACK_HERE 	SEGMENT STACK
	DW 40 DUP(0)
STACK_HERE	ENDS

CODE_HERE	SEGMENT
	ASSUME CS:CODE_HERE, DS:DATA_HERE, SS: STACK_HERE

Main		Proc
	mov ax, DATA_HERE
	mov ds, ax


	mov al, lo_num 
	mov ah, hi_num
	call MEDIA
	mov average, al
	mov ah, 4ch
	int 21h

Main		endp

MEDIA	PROC 
	pushf
	push bx
	add al, ah
	mov ah, 00h
	adc ah, 00h
	mov bl, 02h
	div bl
	pop bx
	popf
	ret
MEDIA		ENDP

CODE_HERE	ENDS
	END Main

Pronto, espero que ja seja um começo para me poderem ajudar :D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cisco

Não podes arranjar as tabelas dos syscalls?

Basicamente tens de ler de 3 em 3 bytes todo o ficheiro (ou seja, fazes um loop) e calcula-se a média desse 3 bytes certo?

Depois é substituir essa média igual nesses 3 bytes ou colocasse noutro file?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Triton

Alguem me pode dizer como e que se muda o main do exemplo de abrir ficheiro para se poder abrir qualquer imagem bmp?

Não podes arranjar as tabelas dos syscalls?

Se essa plataforma tiver operações para ler linhas da consola, então tens de usar. Senão alteras o nome do ficheiro a ler no código.


<3 life

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
David Rego

Não, não há output para introduzir nome para o ficheiro.

O programa tem que fazer isso automaticamente, ou seja, quando se executa o programa só aparece a janela preta e depois sai.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.