IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Les interruptions x86


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Les interruptions x86
    Bonjour à tous

    Je me suis mis récemment à apprendre l'assembleur x86
    et je voudrais en savoir plus sur les interruptions.
    Seulement, je ne trouve pas de documents sur eux et comment les utiliser
    alors je m'inscris sur ce forum afin de vous demander si il vous serait possible de me donner le nom d'un livre ou d'un site web expliquant leur fonction et utilisation.

    Je voudrais également savoir si "vecteur d'interruption" et "interruption" sont la même chose

    merci d'avance

  2. #2
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bonjour

    Regarde Ralf Brown's Interrupt List qui est la Bible en la matière.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  3. #3
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    pour ce qui est de la doc sur les interruptions, RBIL est la reference, mais pour l'utilisation, il s'agit principalement de code et de structures à mettre en oeuvre.

    en mode reel, DOS, BOOT, etc..., les interruptions sont mappées à partir de l'adresse lineaire 0, tout en bas de la mémoire. cette carte s'appele IVT (interruption vector table) et contient 256 vecteurs d'interruptions.
    un vecteur mesure 4 octets, et contient un pointer eloigné (far pointer) du type segment:offset (16:16). soit au total, 1024 octets pour constituer la IVT en mode reel.

    pour le mode protegé, c'est très different, IVT cede la place à IDT (interrupt descriptor table) et est de taille variable, avec une limite de 256 entrées maximum.
    chaque entrée dans la table mesure 8 octets et contient un descripteur d'interruption.
    les descripteurs d'interruption peuvent etre de divers types. tels que trappes (trap), portes(gate) et bien d'autres..

    pour utiliser ces tables, soit le CPU est en mode reel, et il passe par IVT pour traiter les interruptions.
    soit il est en mode protegé, et il passe par IDT (et bien d'autres structures relatives au mode protegé).

    il y a 3 grands types d'interruptions.
    tous lancent l'execution d'un code qui est pointé par le vecteur, ou le descripteur.
    lors de l'execution d'une INT 10h par exemple, le CPU pointe sur l'entrée 10h de la table, et fait un branchement vers la fonction pointée.

    les evenements assynchrones du types interruption materielle sont déclenchés par le controleur d'interruptions (PIC) et tout comme les interruptions logicielles, ces evenement executent la fonction pointée par le vecteur (ou descripteur) correspondant dans la table.

    donc, pour programmer la table d'interruption, il faut installer un vecteur (ou descripteur).
    en mode reel, c'est très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    vecteur=43
    mov ax,0 ;pointer sur IVT
    mov fs,ax ;avec le segment FS
    mov [vecteur*4],int43 ;enregistrer l'offset de int43
    mov ax,cs ;ici le segment de int43 est CS
    mov [vecteur*4+2],ax ;enregister le segment de int43
    jmp main
     
    int43:   ;routine int 43
             ;code de la routine int43
             iret
    main:    ;programme utilisant int 43
            mov ax,323
            int 43
            ....
    en mode protégé, c'est beaucoup plus compliqué.

    pour les interruptions materielles, il faut envoyer un EOI au controleur d'interruption correspondant
    par exemple, pour l'interruption du timer, int 8, le code minimal est le suivant (sans mise à jour du compteur du BIOS)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int8:
              push ax ;ne pas toucher au registre ax
              mov al,20h ;code 20h = EOI
              out 20h,al ;port 20h = PIC maitre
              pop ax ;restaurer le registre ax
              iret ;retour d'interruption
    avant l'execution d'une interruption, le CPU sauve les registres CS, (E)IP et (E)FLAGS. ce qui permet de pouvoir arriver à n'importe quel endroit dans le code sans influencer les calculs en cours.
    il faut veiller à ne pas modifier de registres pendant l'interruption materielle, pour ça, tout registre utilisant dans la routine doit etre sauvegardé au debut, et restauré avant de sortir (iret).
    les interruptions logicielles par contre peuvent utiliser des registres, comme par exemple l'interruption BIOS int10h qui utilise les registres pour passer les paramètres.

    mais la theorie ne vaut pas la pratique, il faut manipuler les interruptions pour comprendre comment ça marche vraiment.
    c'est pas très compliqué au final mais il y a beaucoup de données en jeu.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour, merci pour vos réponses

    c'est encore confus pour moi de programmer et de comprendre un code en asm: je débute à peine !

    En fait, j'utilise ce livre: Assembleur : Une d?couverte pas ? pas: Amazon.fr: Philippe Mercier: Livres@@AMEPARAM@@http://ecx.images-amazon.com/images/I/519KQG7TNBL.@@AMEPARAM@@519KQG7TNBLpour m'initier

    Je cherche d'autres livres plus avancés traitant des interruptions, si vous en connaîssez, je vous serais reconnaîssant de me les proposer

Discussions similaires

  1. Erreur dans BosoKernel pour les interruptions ?
    Par Edouard Kaiser dans le forum Autres architectures
    Réponses: 8
    Dernier message: 05/11/2017, 09h27
  2. Document commandes et interruptions X86
    Par ZIED dans le forum Assembleur
    Réponses: 2
    Dernier message: 14/10/2005, 00h01
  3. Les interruptions + ring 0 ?
    Par MonsieurAk dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 29/09/2003, 08h51
  4. Les interruptions sous Windows et Linux
    Par Descartes dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 07/06/2003, 22h42
  5. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo