Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Foros > Ensamblador > Ayuda con este pequeño programa chicos! :)
-Foros de debate

Ensamblador
Lista de foros | Lista de mensajes de este foro

Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.

Ayuda con este pequeño programa chicos! :)
Enviado por Laura el día 4 de septiembre de 2005

En teoria tiene q contar el numero de teclas pulsadas.
Al dar a la tecla escape se para y saca por pantalla el numero de teclas que hemos pulsado...

Pero no me funciona y me estoy volviendo loca porque no encuentro el error :( Gracias de antemano
es para el 8086:

PILA segment STACK 'stack'
db 128 dup (?)
PILA ends

DATOS SEGMENT
cuenta db 0
bcd db 5 dup(?),'$'
tecla db ?
guarda_ip dw ?
guarda_cs dw ?
DATOS ends

INTER SEGMENT AT 0
org 4*9
vector_ip dw ?
vector_cs dw ?
INTER ends

CODIGO SEGMENT
ASSUME cs:codigo, ds:datos, ss:pila, es:inter

ppal proc far
push ds
xor ax, ax
push ax
mov ax, datos
mov ds, ax
mov ax, inter
mov es, ax
call cambia
bucle: test tecla, 27h ; mientras no pulsemos escape seguimos contando
jnz bucle
call restituye
mov al, cuenta

mox ax, cuenta
push ax
mov ax, offset bcd
push ax
call to_bcd
mov dx, offset cuenta
mov ah,09
int 21h
retf
ppal endp

to_bcd proc
push ax
push bx
push dx
push bp
push si
push di

mov bp,sp
mov ax,10h[bp]
mov di,0eh[bp]
mov bx,5
mov si,0ah
bucle2: xor dx,dx
div si
add dl,'0'
dec bx
mov [di][bx],dl
jnz bucle2

pop di
pop si
pop bp
pop dx
pop bx
pop ax
ret 4
to_bcd endp

cambia proc
cli
mov ax, vector_ip
mov guarda_ip, ax
mov ax, vector_cs
mov guarda_cs, ax
mov vector_ip, offset rutina
mov vector_cs, cs
sti
ret
cambia endp
restituye proc
cli
mov ax, guarda_ip
mov vector_ip, ax
mov ax, guarda_cs
mov vector_cs, ax
sti
ret
restituye endp

rutina proc
cli
in al, 60h ; leemos de teclado
mov tecla, al
test al, 80H
jz fin
mov al, cuenta
inc ax
mov cuenta, al
fin: mov al, 20h
out 20h, al
sti
iret
rutina endp

CODIGO ends

end ppal

 
Re: Ayuda con este pequeño programa chicos! :)
Enviado por dusty2 el día 4 de septiembre de 2005

Hola Laura, no he podido cargar tu programa en mi MASM... ¿con que ensamblador lo escribiste y para que SO? Pero es que a parte de eso, no le veo pies ni cabeza (con perdón). Vamos a ver, ¿donde se le asigna el valor a la variable "tecla"?, porque en el procedimiento principal veo un bucle infinito que dejara al procesador colgado:

bucle: test tecla, 27h ; mientras no pulsemos escape seguimos contando (contando ¿que?)
jnz bucle (bucle infinito)

A lo mejor es que estoy tonto, pero no lo entiendo...

Bueno, ya me lo aclararas

Un amigo

P.D. Por cierto, me encanta el nombre de Laura (Sic!)

 
Re: Re: Ayuda con este pequeño programa chicos! :)
Enviado por Laura el día 4 de septiembre de 2005

Bueno pues se va contando el numero de teclas pulsadas.

Es un bucle finito, acaba cuando la tecla pulsada es el escape.
Eso esta dentro de la rutina.

Es para el 8086 :(

 
Re: Re: Re: Ayuda con este pequeño programa chicos! :)
Enviado por Laura el día 4 de septiembre de 2005

Bueno despues del call restituye sobra la linea
mov al, cuenta

y luego es mov ax, cuenta

 
Re: Re: Re: Re: Ayuda con este pequeño programa chicos! :)
Enviado por dusty2 el día 4 de septiembre de 2005

Vaya, que rápida!!

Vamos a ver, según veo yo la variable "tecla" siempre tendrá el valor "0", cuando la CPU llega a ese bucle, se repetirá indefinidamente porque no hay ninguna llamada en medio al procedimiento que lee el teclado ¿no?
A lo mejor es que no entiendo bién esa sintaxis, pero si el punto de entrada del programa es el procedimiento ppal, entonces está claro...

 
Re: Re: Re: Re: Re: Ayuda con este pequeño programa chicos! :)
Enviado por Laura el día 4 de septiembre de 2005

Bueno, a mi tp me gusta mucho como esta hecho, pero nos lo enseñaron asi :(

Se su pone q llamas a cambia antes del bucle.
En cambia se llama a la rutina q se ejecuta cada vez q se produce una interrupcion.
De ahi el bucle para que este todo el rato esperando interrupciones...

Luego ya se hace todo en rutina, se lee la tecla, se le asigna a tecla y se incrementa el contador...

Si no no te preocupes xq ya me esta dando muchos dolores de cabeza :) Muchisimas gracias por contestar tan rapido :D

 
Re: Re: Re: Re: Re: Re: Ayuda con este pequeño programa chicos! :)
Enviado por dusty2 el día 4 de septiembre de 2005

Ah, es un programa para el modo real del 8086! La idea es parchear el vector de interrupciones del teclado ¿no? Pues la variable vector_ip por ejemplo no esta inicializada, así que no estás parcheando las interrupciones... creo que ahí está el problemilla...

 
Re: Re: Re: Re: Re: Re: Re: Ayuda con este pequeño programa chicos! :)
Enviado por Laura el día 4 de septiembre de 2005

Sip es para las interrupciones de teclado :)

Pero tengo mas ejercicios y no la inicializo no se...
La verdad q es q no me esta cogiendo nada del teclado :(

 
Re: Re: Re: Re: Re: Re: Re: Re: Ayuda con este pequeño programa chicos! :)
Enviado por dusty2 el día 4 de septiembre de 2005

Si, la idea es sobreescribir la tabla de interrupciones con la dirección de tu rutina para que cada vez que se pulse una tecla, el SO redirija el IP a tu rutina de lectura y luego vuelva a su rutina normal. La cuestión es que tu no estas reescribiendo esa tabla de interrupciones (no me acuerdo muy bien en que dirección está, yo ya sólo programo ensamblador bajo windows) y cuando se pulsa una tecla la ejecución del programa no se bifurca a tu procedimiento... Vaya! yo tambien me tengo que ir. A hacer un programa de futbol, pero un programa de TV! Odio el futbol! Mañana miraré a ver si lo has resuelto...

 









Tienda
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network