Introduction à la programmation en assembleur (processeurs 64 bits de la famille 80x86)
8.2 Les interruptions et les exceptions

Il nous manque encore un dispositif qui puisse permettre au processeur de réagir en temps réel à divers évènements, liés aux périphériques (appui d'une touche sur le clavier, clic ou mouvement de la souris, etc) ou à l'état du processeur lui-même (division par zéro, accès à une zone mémoire protégée, etc.). Un simple balayage permanent de ces très nombreuses données gaspillerait un montant considérable de ressources.

Heureusement, tous les processeurs actuels possèdent un jeu d'instructions qui permettent une gestion événementielle de cette problématique. Par exemple, un périphérique, lorsqu'il est sollicité par l'utilisateur, envoie un signal (qu'on appelle interruption) au micro-processeur, qui peut alors interrompre l'exécution du programme courant, exécuter une routine du système d'exploitation et revenir au programme courant lorsque l'interruption a été traitée.

En réalité n'importe quel programme peut générer des interruptions logicielles et des exceptions. Mais nous ne rentrerons pas ici dans des détails qui relèveraient plus d'un cours sur les systèmes d'exploitation que d'un cours sur l'assembleur et le langage machine.

Nous allons limiter cette section à la description de l'instruction int, qui va nous permettre de communiquer avec le système d'exploitation (pour les exemples, nous prendrons GNU/Linux).

Définition

L'instruction int a un comportement similaire à l'instruction call. Le registre rip va être modifié pour permettre l'exécution d'une procédure, mais l'adresse de l'instruction int est mémorisée, de telle sorte qu'à la sortie de la procédure, rip prend pour valeur l'adresse de l'instruction qui suit l'instruction int.

Syntaxe

La syntaxe de l'instruction int est la suivante :

  • int Constante

Constante est un entier qui désigne le numéro du gestionnaire d'interruption à appeler. La valeur de certains registres sera utilisée par le gestionnaire d'interruptions afin de sélectionner la procédure appropriée et de lui transmettre ses paramètres.

Sous GNU/Linux, par exemple, int $0x80 va appeler le gestionnaire d'interruption du système d'exploitation (le gestionnaire de numéro hexadécimal 80, soit 128 en décimal) . Le numéro de fonction système est donné par %eax et les paramètres sont transmis via les registres %ebx,%ecx,%edx,%esi,%edi (dans cet ordre). Lorsqu'il y a plus de 5 paramètres, %ebx contient tout simplement l'adresse des paramètres.

Exemple

Voici par exemple, un petit programme en assembleur, destiné à être assemblé, lié et exécuté sous GNU/Linux :