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 )
=======================
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?
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
Assembly..
SG
"Davide" <ediv...@no-spam-inwind.it> ha scritto nel messaggio
news:ipFl9.27412$Eu.6...@twister1.libero.it...
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.
arg...quoting selvaggio!
>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>