Exemple sur l'implentation d'un isr (interrupt service routines)

Soyez le premier à donner votre avis sur cette source.

Vue 6 101 fois - Téléchargée 284 fois

Description

Ce code demontre la facon d'implenter un ISR sans utiliser le dos.indispensable a savoir si vous voulez devellopper votre propre OS.

Source / Exemple :


;Ecrit par TotalIllusion (Eric Grand Maison)
;ISR veut dire Interrupt Service Routines et c'est indispensable 
;de savoir comment les utiliser si quelqu'un pense
;a concevoire son propre OS ou meme pour modifier un system 
;d'exploitation deja implenter (le dos par exemple)
;En fais c'est vraiment simple il suffit de mettre ladresse 
;de notre routine dans la table des vecteurs
;qui ce trouve a ladresse 0.
;sorry pour le manque de ponctuation mais j'utilise un clavier englais
;Cette exemple a ete compiler avec tasm 5

.model small
.code

LitCaractere     proc far         ;ici on declare notre routine
push ax                           ;Chose indispensable est de 
                                  ;sauvegarder les registre qui seront modifier par 
                                  ;notre ISR
mov ah,0h                         ;on met notre code
int 16h                            
pop ax                            ;On remet le system comme il etais
iret
LitCaractere     endp             ;Voila notre routine terminer

debut:
mov ax,0                          ;Comme je les dit plutot la table des v
                                  ;ecteurs ce trouve a ladresse 0 donc il faut que 
mov es,ax                         ;je set ES a 0 pour y acceder car cest notre seul 
                                  ;registre de libre et utilisable pour cela
pushf                            ;on savegarde le registre des flag
                        
cli                               ;Toujour desactiver les interruption 
                                  ;avance de changer la 
                                  ;table des vecteur

;Ici j'ai decider de mettre comme interruption 88h mais vous pouver 
;mettre celle que vous 
;voulez mais faites attention de 
;ne par modifier un vecteur deja existant du genre de 10h 13h 21h etc 
;car elle ne 
;seront plus accessible apres la ;modification

mov     word ptr es:[88h*4], offset LitCaractere 
                               ;on met notre adresse de routine
mov     word ptr es:[88h*4 + 2], seg LitCaractere 
                                  ;on met ladresse du segment de notre routine
sti                                               ;on remet les interruption a ON 
popf                                             ;on remet le registre des flag comme avant

;Maintenant il ne reste plus qua tester notre ISR pour voir si il fonctionne bien
int 88h             
;En fais notre routine ne fais qu'une seul choses, elle attent que 
;nous pression une touche du clavier
mov ax,4c00h        ;fermeture du programme avec code de fin 0
int 21h             ;appelle au dos
end debut           ;fini

Conclusion :


Ce programme implente un INT 88H qui ne fais pas grand choses mis a part attendre que tu entre un caractere au clavier mais explique bien la structure d'un ISR et son implentation dans la table des vecteurs

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

vaytess
Messages postés
14
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
16 juillet 2009
-
joli travail..c'est très impressionnant
aboulkhir
Messages postés
11
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
18 mai 2008
-
salut
merci pour le code
seulement moi je compile en debug sous DOS et il me donne erreur à l instruction mov word ptr es:[88h*4] est ce ke vous pouvez m 'aider
aparan
Messages postés
3
Date d'inscription
jeudi 8 février 2001
Statut
Membre
Dernière intervention
10 juin 2006
-
pour RM50Man:
En mode réel, le processeur adresse sa mémoire en bloc de 64Ko. Quand on veut accéder à une zone mémoire (pour lecture, ecriture, execution de code ...etc), on doit donc toujours donner deux infos pour l'adresse: le segment (que l'on pourrait considérer comme le numero du bloc de 64K dans lequel se trouve notre adresse), et l'offset (~ le décallage dans ce segment).
L'adresse des différents codes qui gèrent les différents évènements systèmes (exemple appuie d'une touche clavier, arrivée d'une infos sur un port série, signal de l'imprimante pour indiquer une fin de papier etc etc) est stockée dans la zone de mémoire de démarrant au segment 0. In note généralement 0000:0000. Une adresse d'interruption est décrite donc sur 4 octets (2 pour le segment, 2 pour le décallage).
L'adresse d'une interruption peut être calculée donc en faisant N° IRQ * 4 pour l'adresse de l'offset, + 2 octets pour l'adresse de segment. D'où (88h*4) pour l'offset, et (88h*4) + 2 octets pour le segement.
Note: en général, les octets mémoires sont toujours pointés avec les registres DS:SI et ES:DI. D'ou la remise à zéro de ES avec les deux intruction mov ax,0 et mov es,ax.
IMPORTANT: L'auteur se base sur le principe que les interruptions sont rangées dans l'ordre croissant! Cela pourrait ne pas être le cas, et donc il existe une interruption permettant de renvoyer l'adresse d'une interruption directement dans les registres (soit dans ES:DI soit dans DS:SI, je n'ai en tête exactement).
Voilà, j'ai peut-être été long, il y a peut-être des chose que vous saviez déjà. Mais c'est mon défaut.
RM50Man
Messages postés
314
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
20 août 2006
-
mov word ptr es:[88h*4], offset LitCaractere
;on met notre adresse de routine
mov word ptr es:[88h*4 + 2], seg LitCaractere

Pkoi tu fais 88h * 4
et ensuite 88h * 4 + 2
tu peux m'expliquer!!!
Merci pour le code!!!!!!
crazyjoke
Messages postés
147
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
9 janvier 2005
-
Très bien, très utile !! Surtout quand on développe un OS :D !!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (TotalIllusion)