Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Interruzione N° 28

1 view
Skip to first unread message

Davide

unread,
Sep 29, 2002, 11:57:02 AM9/29/02
to
Ciao..vi scrivo perchè ho un problema con la programmazione delle routine
all'interno della tavola delle interruzioni che ci sta affliggendo da tempo!
In particolare mi riferisco alla programmazione dell'interruzione software
( N°28 ) che ogni 54.9 Ms viene attivato ,richiamato dalla interruzione N°
8..ora spiego come funziona il mio programma:

Innanzitutto vengono salvate in 2 variabili l'indirizzo del cs e ip
originali dell'interruzione n° 28 in modo tale da ripristinarli all'uscita
del programma!
Dopodichè si cambiano dli indirizzi ( all'interno del vettore ) con quelli
del cs e ip corrispondente alla mia routine.
Successivamente viene eseguita ciclicamente un loop nel quale si verifica se
la variabile che dovrebbe essere incrementata dalla routine n° 28, arriva a
5!
Così ogni 54,9 viene eseguita la mia routine che avrà il compito di
verificare quando passa un secondo. A questo punto dopo aver visualizzato un
carattere a schermo...dovrebbe incrementare la variabile di cui ho parlato
prima in modo tale che dopo 5 incrementi ( e quindi aspettato il passaggio
di 5 sec ) il programma dovrà uscire riportando tutto alla normalità e dando
il comando al sistema operativo: Il problema e che la variabile controllo
non viene incrementata: sapete dirmi come mai?!?
Qui vi allego il code...che vi permetterà di capire meglio visto che sto
scrivendo di corsa! Vi ringrazio per l'eventuale aiuto
!


Davide

; codice

Dati segment
sentinella db 00h
vecchio_ip dw (?)
vecchio_cs dw (?)
contatore db (00h)
Dati Ends

Sistema segment stack
dw 100 dup (?)
top label word
sistema ends


codice segment

assume cs:codice, ss:sistema,ds:dati


inizio: mov ax,sistema
mov ss,ax
lea ax,top
mov sp,ax
mov ax,dati
mov ds,ax
mov ax,0000h
mov es,ax


mov ax,word ptr es:0070h ; prende gli indirizzi del cs e ip
mov vecchio_ip,ax ; posti all'interruzione numero 28
mov ax,word ptr es:0072h , e li salva in 2 variabili in modo tale
mov vecchio_cs,ax
mov ax,cs ; da poter essere recuperati
mov word ptr es:0072h,ax ; i vecchi indirizzi vengono cambiati
dal presente cs
lea ax,etichetta ; e dall'ip ( questo corrispondente
all'etichetta "etichetta")
mov word ptr es:0070h,ax

salto: cmp contatore,5d ; questo è il pezzo di code che dovrebbe
essere avviato ;normalmente nel quale
verifica se la variabile arriva a 5
je ripristina
jmp salto

etichetta: inc sentinella ; questa è la routine
cmp sentinella,18d
je mostra
zoza: iret ; che dev'essere eseguita


mostra:mov sentinella,0h
inc contatore ; all'interno della interruzione n° 28
mov dl,'1'
mov ah,02h
int 21h
jmp zoza

ripristina: mov ax,vecchio_ip ; prende il vecchio indirizzo ip dalla
variabile
mov word ptr es:0070h,ax ; e lo pone nella tavola delle interruzioni
mov ax,vecchio_cs ; e precisamente
mov word ptr es:0072h,ax ; all'interruzione numvero 28
mov ax,4c00h ; cede i comandi al sistema operativo
int 21h


codice ends
end inizio


--
=======================
Non approvo ciò che tu dici,
ma difenderò a costo della
mia vita il tuo diritto a dirlo ( Voltaire )
=======================

Albe

unread,
Sep 30, 2002, 8:44:47 AM9/30/02
to
> Così ogni 54,9 viene eseguita la mia routine che avrà il compito di
> verificare quando passa un secondo. A questo punto dopo aver visualizzato
un
> carattere a schermo...dovrebbe incrementare la variabile di cui ho parlato
> prima in modo tale che dopo 5 incrementi ( e quindi aspettato il passaggio
> di 5 sec ) il programma dovrà uscire riportando tutto alla normalità e
dando
> il comando al sistema operativo: Il problema e che la variabile controllo
> non viene incrementata: sapete dirmi come mai?!?

guardando il codice non trovo errori...cmq...sicuro che la variabile che non
viene incrementata sia contatore e non sentinella? In pratica, ti visualizza
almeno una volta un '1' sullo schermo, o proprio niente?


Davide

unread,
Oct 1, 2002, 5:45:28 PM10/1/02
to

"Albe" <-al...@libero.it> ha scritto nel messaggio
news:3HXl9.30756$Eu.6...@twister1.libero.it...


Il problema e che non si ferma proprio! Se avvio da Windows...devo cliccare
sul tasto di Windows in modo da poter chiudere il prompt...altrimenti il
sistema deve essere riavviato!


Davide


Stefano

unread,
Oct 4, 2002, 4:55:13 AM10/4/02
to

Ma chiamateli Interrupt.."interruzione" suona malissimo non trovi?
Interrupt e' una delle parole piu' belle che esistono..solo il nome e'
sinonimo di ..

Assembly..

SG


"Davide" <ediv...@no-spam-inwind.it> ha scritto nel messaggio
news:ipFl9.27412$Eu.6...@twister1.libero.it...

Albe

unread,
Oct 4, 2002, 5:02:50 AM10/4/02
to
> Il problema e che non si ferma proprio! Se avvio da Windows...devo
cliccare
> sul tasto di Windows in modo da poter chiudere il prompt...altrimenti il
> sistema deve essere riavviato!
>

quindi ti visualizza una serie infinita di '1'...eppure io nel tuo codice
non trovo nulla di strano. L'unica cosa che noto è che hai definito
sentinella in questo modo:
sentinella db 00h
mentre contatore l'hai definito in questo modo:
contatore db (00h)
con le parentesi. Ora, io non conosco la sintassi del masm riguardo a questo
genere di cose, quindi probabilmente è una cretinata...però, prova a
definirlo senza le parentesi, non si sa mai.


Albe

unread,
Oct 4, 2002, 5:03:30 AM10/4/02
to
> Ma chiamateli Interrupt.."interruzione" suona malissimo non trovi?
> Interrupt e' una delle parole piu' belle che esistono..solo il nome e'
> sinonimo di ..
>
> Assembly..
>
> SG
>

arg...quoting selvaggio!


Luca

unread,
Oct 19, 2002, 7:53:03 AM10/19/02
to
In un messaggio del Tue, 01 Oct 2002 21:45:28 GMT, "Davide"
<ediv...@no-spam-inwind.it> ha scritto:

>Il problema e che non si ferma proprio! Se avvio da Windows...devo cliccare
>sul tasto di Windows in modo da poter chiudere il prompt...altrimenti il
>sistema deve essere riavviato!

Ho dato un'occhiata veloce al tuo programma, e` probabile che la
chiamata all'int 21h fatta all'interno della tua routine di gestione
dell'int 1Ch causi il crash di sistema (...). Prova a testare il
programma dopo averla rimossa, se il software funziona lo capisci
anche senza la visualizzazione del carattere '1'.
C'e` poi un errore ripetuto due volte che puo` provocare il crash del
DOS: se vuoi impostare un vettore di interrupt andando a scrivere
direttamente nella tabella dei vettori d'interruzione devi prima
azzerare il flag degli interrupt (cli) e ri-settarlo (sti) dopo che
hai impostato il nuovo vettore. Quindi il tuo codice diventa:

.
cli


mov word ptr es:0072h,ax

lea ax,etichetta

mov word ptr es:0070h,ax

sti
.

Spero di esserti stato utile.
Saluti,
Luca

--
Luca, <luca.paoli AT tin.it>

0 new messages