begin process at 2010 03 20 03:32:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Systeme

 > EXEMPLE SUR L'IMPLENTATION D'UN ISR (INTERRUPT SERVICE ROUTINES)

EXEMPLE SUR L'IMPLENTATION D'UN ISR (INTERRUPT SERVICE ROUTINES)


 Information sur la source

Note :
Aucune note
Catégorie :Systeme Niveau :Expert Date de création :11/05/2003 Date de mise à jour :12/05/2003 00:41:42 Vu / téléchargé :3 649 / 220

Auteur : TotalIllusion

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 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

  • ;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
;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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip UN KERNEL LOADER BIEN SIMPLE ET BIEN DOCUMENTER

 Sources de la même categorie

DÉPLACEMENT D'UN RÉCTANGLE ROUGE A L'AIDE DE LA SOURIS par KIMI1632
Source avec Zip SCHEDULEUR TEST par patatalo
Source avec Zip Source avec une capture LIVE CD OMF par patatalo
Source avec Zip "MORTIMER": UN HOBBY OS par bofur
Source avec Zip Source avec une capture LE SYSTÈME D'EXPLOITATION LOGRAM par steckdenis

Commentaires et avis

Commentaire de marcotte le 02/07/2003 03:50:44

Bravo, tu as l'air d'etre un pro en asm !
Moi je programme depuis 1988 mais avec DEBUG.COM qui est un petit programme inclu dans le vrai dos, et permettant de créer des programmes en point com (.com)  inférieurs à 64Ko.
Ya meme un désassembleur inclu, et on peut faire du pas a pas et voir les registres a chaque fois.
Mais bon c'est dépassé je sais, alors je passe à masm32, bye !

Commentaire de NBhack le 01/08/2003 02:54:43

cool

Commentaire de patatalo le 02/01/2004 16:40:21 administrateur CS

pour les débutants, tu peux preciser que ton code concerne le mode réel du processeur.

le 16 bits est utile pour programmer des loaders d'OS mais depuis le 286, les processeurs sont capables d'utiliser le mode protégé.

a l'heure actuelle, programmer un OS en 16 bits serait un phénoménal retour en arrière. ( environ 20 ans non? )

Commentaire de crazyjoke le 31/08/2004 15:47:44

Très bien, très utile !! Surtout quand on développe un OS :D !!

Commentaire de RM50Man le 28/12/2005 01:22:17

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!!!!!!

Commentaire de aparan le 20/02/2006 13:27:30

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.

Commentaire de aboulkhir le 14/05/2008 13:26:14

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

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales