Ayuda con este pequeño programa chicos! :)

Laura
04 de Septiembre del 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

dusty2
04 de Septiembre del 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!)

Laura
04 de Septiembre del 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 :(

Laura
04 de Septiembre del 2005
Bueno despues del call restituye sobra la linea
mov al, cuenta

y luego es mov ax, cuenta

dusty2
04 de Septiembre del 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...

Laura
04 de Septiembre del 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

dusty2
04 de Septiembre del 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...

Laura
04 de Septiembre del 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 :(

dusty2
04 de Septiembre del 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...