Qual é o erro nesse programa

Started by Anonymous, 07 de October , 2006, 03:47:11 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Anonymous

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?

Dark_Side

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.

Anonymous

Ai, é mesmo, heheheh, que falta de atenção minha!!!

Anonymous

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!

Dark_Side

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 :)

Anonymous

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...