FORUM DARKERS

Tecnologia & Informática => Programação => ASM => Topic started by: Anonymous on 07 de October , 2006, 03:47:11 PM

Title: Qual é o erro nesse programa
Post by: Anonymous on 07 de October , 2006, 03:47:11 PM
Fiz um programinha pra ler uma tecla digitada: org 0x100 ;onde a memoria nos coloca

mov ah,9 ;ah=9
mov dx,msg1 ;dx=msg1
int 0x21 ;chama interrupção 21,9

mov ah,0 ;ah=0
int 0x16 ;chama interrupção 16,0
mov dl,108 ;dl=108 (l em ascii)
cmp al,dl ;compara AL e DL
je sim ;se forem iguais
jne nao ;se não

sim:
mov ah,9
mov dx,msg2 ;print string msg2
ret ;tchau

nao:
mov ah,9
mov dx,msg3 ;print string msg3
ret ;tchau

;strings
msg1 db 'Digite uma tecla... $',0
msg2 db 'Voce digitou ',34,'l',34,' parabens! $',0
msg3 db 'Voce nao digitou ',34,'l',34,' =[$',0
Até a parte de comparar ele vai bem, depois, ele não compara, não pula para os labels etc, alguém pode me ajudar?
Title: Re: Qual é o erro nesse programa
Post by: Dark_Side on 07 de October , 2006, 10:07:41 PM
Hi,
Você esqueceu de chamar pela interrupção 0x21 após mover para o registrador DX, o ponteiro para string.

O código, portanto, seria:

org 0x100 ;onde a memoria nos coloca

mov ah,9 ;ah=9
mov dx,msg1 ;dx=msg1
int 0x21 ;chama interrupção 21,9

mov ah,0 ;ah=0
int 0x16 ;chama interrupção 16,0
mov dl,108 ;dl=108 (l em ascii)
cmp al,dl ;compara AL e DL
je sim ;se forem iguais
jne nao ;se não

sim:
mov ah,9
mov dx,msg2 ;print string msg2
int 0x21 ; Chama a interrupção
ret ;tchau

nao:
mov ah,9
mov dx,msg3 ;print string msg3
int 0x21 ; Chama a interrupção
ret ;tchau

;strings
msg1 db 'Digite uma tecla... $',0
msg2 db 'Voce digitou ',34,'l',34,' parabens! $',0
msg3 db 'Voce nao digitou ',34,'l',34,' =[$',0 

Bye.
Title: Re: Qual é o erro nesse programa
Post by: Anonymous on 07 de October , 2006, 10:57:12 PM
Ai, é mesmo, heheheh, que falta de atenção minha!!!
Title: Re: Qual é o erro nesse programa
Post by: Anonymous on 07 de October , 2006, 11:50:00 PM
E qual é o problema desta:org 0x100
mov ah,0
int 0x16
mov ah,9
mov dx,msg
int 0x21
ret

msg db 'Codigo de retorno: ',al,'$',0
Não entendo!
Title: Re: Qual é o erro nesse programa
Post by: Dark_Side on 08 de October , 2006, 12:14:58 AM
Hi,
O erro ocorre quando se tenta passar o valor de um registrador (no caso o byte baixo de AX) como um caractere para string, em sua declaração. Você pode mover para uma determinada posição da string o caractere em AL, veja:

org 0x100 ; Origem -> endereço 256
mov ah,0 ; Obtém uma tecla
int 0x16
mov [msg+19],al ; Move para a posição 19 da string, o caractere em AL
mov [msg+20],'$' ; Move para a próxima posição: $ -> finalizar a string

mov ah,9 ; Mostra a string
mov dx,msg
int 0x21
ret

msg db 'Codigo de retorno: ',0  ; Não finalizamos a string com $, pois isso será feito durante a execução do programa.

Note que a string contém 19 caracteres ao ser declarada, e que o último caractere está na posição 18 (a contagem começa do 0). Isso explica porque movemos o caractere para a posição 19 - escrever o caractere após o último na string.

É mais ou menos isso...
Bye :)
Title: Re: Qual é o erro nesse programa
Post by: Anonymous on 08 de October , 2006, 12:49:50 PM
Outra coisa hehehe, tem como passar o valor de um registrador de 8 bits (ex.: al) para um de 32 bits (ex.: eax) ?
Tem como? Tenho tenatado fazer isso mas não obtive sucesso...