begin process at 2008 09 05 10:40:14
1 237 147 membres
108 nouveaux aujourd'hui
14 312 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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é: 2 886 / 194

Note :
Aucune note

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
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    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 !

  • signaler à un administrateur
    Commentaire de NBhack le 01/08/2003 02:54:43

    cool

  • signaler à un administrateur
    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? )

  • signaler à un administrateur
    Commentaire de crazyjoke le 31/08/2004 15:47:44

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

  • signaler à un administrateur
    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!!!!!!

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS