Академический Документы
Профессиональный Документы
Культура Документы
Le 8088 dispose des instructions machine DIV et IDIV qui effectuent une division
entière. Les règles arithmétiques usuelles interdisent toute division par zéro. C'est
pourquoi le processeur déclenche dans ce cas une interruption 0. Lors du lancement du
système, le vecteur associé est dirigé par DOS sur une routine qui affiche un message du
genre "Division par zéro", puis revient par IRET au programme interrompu.
Interruption 1h
Cette interruption est appelée par le processeur à la suite de chaque instruction lorsque le
bit TRAP du registre des indicateurs est à 1. Les débogueurs exploitent ce mode pour
pouvoir suivre l'exécution d'un programme. Ils fournissent alors un gestionnaire pour
cette interruption.
Pour éviter qu'elle ne se déclenche à l'intérieur même de la routine d'interruption (ce qui
conduirait à des appels récursifs en nombre infini et au débordement de la pile), le
processeur annule le bit TRAP au début du gestionnaire. Auparavant comme c'est le cas
pour toutes les interruptions, le registre des indicateurs et notamment le bit TRAP aura
été sauvegardé sur la pile.
Dès que la routine d'interruption se termine par une instruction IRET, le processeur
rétablit automatiquement l'ancien contenu du bit TRAP en récupérant sur la pile le
registre des indicateurs. De ce fait, l'interruption 1 sera à nouveau appelée dès que la
prochaine instruction du programme à surveiller aura été exécutée.
Si le programmeur a recueilli toutes les informations nécessaires sur le programme, le
mode TRAP (autrement dit le bit TRAP) peut être désactivé. Mais comment faire, alors
que le programme suivi ne sait pas qu'il est surveillé et ne peut donc pas contenir
d'instruction propre à mettre à zéro le bit TRAP du registre des indicateurs?
La solution de ce problème se trouve encore dans la routine de l'interruption 1. C'est à
elle d'annuler le bit TRAP mais ce n'est pas si simple car ce bit été systématiquement mis
à 0 à l'entrée dans le programme et il sera rempli à la sortie, lors de la récupération du
registre des indicateurs, par l'ancienne valeur 1. Il faut donc avant de sortir de la routine
d'interruption reprendre le registre des indicateurs sur la pile, y annuler le bit TRAP et
remettre ensuite sur la pile, à son emplacement d'origine, le registre des indicateurs. Au
moment de l'instruction IRET, le processeur récupère le registre des indicateurs comme si
de rien n'était, mais le bit TRAP étant cette fois ci à 0, le programme continue son
exécution dans les conditions normales.
Ces possibilités ne sont guère exploitées dans les applications ordinaires. C'est pourquoi
le BIOS fait pointer le vecteur de l'interruption 1 sur un simple IRET, de sorte qu'il ne se
passera rien de spécial si un programme met par hasard le bit TRAP à 1. Le seul effet
sera un ralentissement de l'exécution puisque après chaque instruction l'interruption 1
sera systématiquement invoquée. L'interruption 1 par contre est très utile dans les
programmes de test du genre DEBUG car elle permet de suivre à la trace des
programmes en inspectant une à une les instructions et leurs conséquences.
Interruption 2h
Cette interruption est désignée par le signe NMI qui veut dire "Non Maskable Interrupt".
En conséquence, son exécution ne peut pas être inhibée par l'instruction CLI qui est en
principe chargée de couper court à toute interruption. Dans un PC, l'interruption NMI est
chargée d'attirer l'attention sur les erreurs en mémoire vive qui laissent présager un défaut
de circuit. Il y urgence car une erreur de ce type peut altérer gravement le fonctionnement
du système, et même l'endommager. C'est pourquoi le système déclenche l'interruption
NMI même si toutes les autres sont inhibées
Au moment de l'initialisation du système, le vecteur d'interruption correspondant reçoit la
référence d'une routine du BIOS charger d'afficher un message d'erreur et d'arrêter le
système.
Interruption 3h
Cette interruption est aussi exploitée par les débogueurs. Par rapport à toutes les autres
interruptions, elle présente la particularité de pouvoir être appelée à l'aide d'une
instruction spéciale qui n'appartient qu'à elle seule. Les autres interruptions sont en effet
appelées par une instruction machine sur 2 octets (premier octet = CDh, second octet =
numéro de l'interruption) alors que l'interruption 3 se déclenche par une instruction
particulière sur un seul octet seulement (le code CCh). Cette interruption convient ainsi
parfaitement pour tester un programme, lorsqu'on désire l'exécuter jusqu'à un endroit
déterminé où il devra s'interrompre et révéler le contenu courant des registres. Dans un
débogueur on obtient ce résultat en insérant un appel à l'interruption 3 à l'endroit du
programme où celui-ci devra être interrompu. Derrière cette interruption se cache en
général un gestionnaire du débogueur qui affiche les contenus des registres et tout ce qu'il
faut.
Vous pourriez objecter qu'à la place de l'interruption 3 toute autre interruption ferait
l'affaire, pourvu que dans le gestionnaire associé on installe une routine d'affichage des
registres. Cette remarque est certes judicieuse mais il ne faut pas oublier que
l'interruption 3 présente l'avantage de tenir sur un seul octet. Pour comprendre la portée
de cet avantage prenons un programme fictif.
Ce programme contient une instruction RET. Cette instruction prend un octet et constitue
la fin d'un sous-programme. Un autre sous-programme se trouve à la suite qui commence
par une instruction machine quelconque. L'utilisateur souhaite examiner les registres à
la fin du premier sous-programme, il disposera donc un point d'arrêt (c'est-à-dire un appel
à l'interruption 3) à la place de l'instruction RET. Il est tout à fait avantageux que cet
appel ne prenne qu'un seul octet. S'il occupait davantage de place, par exemple 2 ou 3
octets, il n'écraserait pas seulement l'instruction RET mais également tout ou partie de la
première instruction du sous-programme qui suit. Si au cours de l'exécution le second
sous-programme est invoqué, il se produirait une erreur capable de planter le système.
Mais en limitant le point d'arrêt à un seul octet, cet incident ne se produit pas car le point
d'arrêt ne peut pas écraser plus d'une seule instruction.
Jusqu'à son exploitation par un programme de mise au point, cette interruption n'a
généralement pas d'application. Le système DOS l'aiguille sur une routine simplement
constituée de l'instruction IRET Interrupt Return) qui rend la main au programme
interrompu sans rien faire.
Interruption 4h
Cette interruption peut être appelée par une certaine instruction liée à une condition. Il
s'agit de l'instruction machine INTO (INTerruption on Overflow) qui ne déclenche
l'interruption 4 que si le bit de débordement (Overflow) du registre des indicateurs est à 1
au moment de son exécution. Ce sera notamment le cas à la suite d'opérations
arithmétiques (par exemple après une multiplication avec l'instruction MUL) si le résultat
de l'opération ne peut plus être représenté avec un nombre déterminé de bits. Cette
interruption peut naturellement également être appelée à l'aide de l'instruction INT
normale mais dans ce cas l'appel ne dépendra pas de l'état d'armement du bit Overflow.
En fait cette interruption est très peu utilisée et DOS la dirige directement sur une
instruction de retour IRET.
Interruption 5h
Bien que classée dans le groupe des interruptions matérielles, l'interruption 5 est
exploitée par le BIOS. Elle est déclenchée par le BIOS chaque fois que la touche "PrtScr"
(sur un clavier américain) ou "Impr" (sur un clavier français) est actionnée. Sa tâche
consiste à envoyer sur l'imprimante le contenu de l'écran, ce qu'on appelle une copie
d'écran ou hard copy. C'est pourquoi le vecteur de cette interruption est initialisé par le
BIOS dans la table des vecteurs d'interruption de façon à pointer sur la routine de copie
d'écran du BIOS qui figure en ROM . Les programmes en assembleur ou en langage
évolué peuvent également recourir à cette interruption, en l'appelant par INT, pour
envoyer au cours de leur exécution une copie d'écran sur l'imprimante.
Interruptions 6h, 7h
Ces interruptions sont pour l'instant réservées à un usage ultérieur par IBM. Elles peuvent
donc être utilisées pour des besoins de programmation individuels.
Interruption 8h
Le timer du PC (un circuit 8253) reçoit 1 193 180 signaux par seconde du coeur du
système constitué par un oscillateur à quartz. Au bout de 65536 de ces signaux, soit
environ 18,2 fois par seconde, il génère un appel à l'interruption 8 qui est transmis au
processeur par l'intermédiaire du 8259. Comme la fréquence d'appel de cette interruption
ne dépend pas de la fréquence d'horloge (variable) du système, cette interruption convient
parfaitement à la mesure du temps puisqu'on sait qu'une seconde s'écoule tous les 18,2
appels. C'est dans cet esprit que l'interruption est exploitée dans un PC. Le BIOS dirige le
vecteur de l'interruption sur une routine qui est donc appelée 18,2 fois par seconde. Cette
routine est chargée de faire avancer un compteur de temps et d'arrêter le moteur du
lecteur de disquette si aucun accès à la disquette ne s'est produit depuis un certain délai.
Une fois ces tâches exécutées, la routine appelle l'interruption 1Ch qui peut être
détournée par un utilisateur qui aurait besoin d'une exploitation dépendant d'un signal
périodique.
Interruption 9h
Le clavier comporte un processeur Intel portant l'appellation 8048 (ou 8042 sur l'AT). Ce
processeur surveille le clavier et enregistre toute pression ou tout relâchement d'une
touche, ou encore tout enfoncement prolongé . Il doit renseigner le processeur central
pour que le système puisse réagir de façon appropriée en lisant le code de la touche
frappée. Il envoie donc un signal au 8259 qui, lorsqu'aucune interruption de priorité
supérieure n'est à prendre en compte, demande au processeur central de déclencher
l'interruption 9. Cette interruption appelle alors une routine du BIOS qui lit le caractère
frappé au clavier et le place le buffer du clavier.
Interruption 10h
Fonction 00h Définir le mode vidéo
Cette fonction permet de sélectionner et initialiser un mode vidéo. L'écran est alors
entièrement effacé. De ce fait, cette fonction peut aussi être appelée pour vider l'écran
d'une façon très simple même lorsqu'on ne souhaite pas changer le mode vidéo.
Entrée :
AH = 00h
AL Mode Résolution Résolution Couleurs Système
T/G texte graphique
Sortie :
aucune sortie
Remarques :
· Les couleurs pour les modes 4, 5 et 6 peuvent être fixées à l'aide de la fonction 11.
· Le contenu des registres BX, CX, DX et des registres SS, CS et DS n'est pas
modifié. Le contenu de tous les autres registres, et notamment celui des registres SI et DI,
peut avoir été modifié
Entrée :
AH = 01h
CH = Ligne de départ du curseur
CL = Ligne de fin du curseur
Sortie :
aucune sortie
Remarques :
·Les valeurs autorisées pour les lignes de départ et de fin dépendent de la carte vidéo
installée. Les valeurs suivantes sont autorisées :
Cartes écran monochromes : 0 - 13
Cartes écran couleur : 0 - 7
·Le BIOS fixe au départ les valeurs suivantes :
Cartes écran monochromes : lignes 11 et 12
Cartes écran couleur : lignes 6 et 7
·Il ne faut pas définir des valeurs non autorisées à l'aide de cette fonction car cela peut
avoir des conséquences imprévisibles (en général, une disparition du curseur).
·Le contenu des registres BX, CX, DX et des registres de segment SS, CS et DS n'est pas
modifié par cette fonction. Le contenu de tous les autres registres, et notamment des
registres SI et DI, peut avoir été modifié.
Entrée :
AH = 02h
BH = Numéro de la page écran
DH = Ligne de l'écran
DL = Colonne de l'écran
Sortie :
aucune sortie
Remarques :
· Le curseur clignotant de l'écran n'est déplacé par cette fonction qu'à condition que
la page écran appelée soit la page actuelle de l'écran.
· La ligne de l'écran est une valeur entre 0 et 24.
· La colonne de l'écran est une valeur comprise entre 0 et 79 (en 80 colonnes) ou
entre 0 et 39 (en 40 colonnes), suivant le mode vidéo fixé.
· Une méthode pour faire disparaître le curseur clignotant consiste à le placer dans
une position hors du champ de l'écran (par exemple colonne 0, ligne 25).
· Le numéro de la page écran dépend aussi du nombre de pages écran disponibles
sur la carte vidéo utilisée.
· Le contenu des registres BX, CX, DX et des registres de segment SS, CS et DS
n'est pas modifié par cette fonction. Le contenu de tous les autres registres, et notamment
des registres SI et DI, peut avoir été modifié.
Entrée :
AH = 03h
BH = Numéro de la page écran
Sortie :
DH = Ligne de l'écran dans laquelle figure le curseur
DL = Colonne de l'écran dans laquelle figure le curseur
CH = Ligne de départ du curseur clignotant de l'écran
CL = Ligne de fin du curseur clignotant de l'écran
Remarques :
· Le numéro de la page écran dépend aussi du nombre de pages écran disponibles
sur la carte vidéo utilisée.
· Les ligne et colonne de l'écran se réfèrent au système de coordonnées de texte.
· Le contenu du registre BX et des registres de segment SS, CS et DS n'est pas
modifié par cette fonction. Le contenu de tous les autres registres, et notamment des
registres SI et DI, peut avoir été modifié.
Entrée :
AH = 04h
Sortie :
AH = 0 : position du crayon optique ne peut être testée pour le moment.
AH = 1 : position du crayon optique a pu être obtenue, auquel cas :
DH = Ligne écran du crayon optique (mode texte)
DL = Colonne écran du crayon optique (mode texte)
CH = Ligne écran du crayon optique (mode graphique)
BX = Colonne écran du crayon optique (mode graphique)
Remarques :
· L'appel de cette fonction doit être répété jusqu'à ce qu'un 1 soit renvoyé dans le
registre AH car ce n'est que dans ce cas que les coordonnées peuvent être lues dans les
autres registres.
· Les coordonnées indiquées se réfèrent naturellement au mode vidéo actuel et à sa
résolution horizontale et verticale.
· Les coordonnées du crayon optique ne peuvent pas être déterminées très
précisément, surtout en mode graphique. La coordonnée Y (ligne) est toujours une valeur
paire de sorte qu'il n'est pas possible de distinguer si le crayon optique se trouve sur la
ligne 8 ou 9. En mode graphique 320*200 points, la coordonnée X (colonne) est toujours
un multiple entier de 4 et en mode graphique 640*200 points toujours un multiple entier
de 8.
· Le contenu du registre CL et des registres de segment SS, CS et DS n'est pas
modifié par cette fonction. Le contenu de tous les autres registres, et notamment des
registres SI et DI, peut avoir été modifié.
Entrée :
AH = 05h
AL = Numéro de la page écran
Sortie :
aucune sortie
Remarques :
· Le numéro de la page écran dépend aussi du nombre de pages écran disponibles
sur la carte vidéo.
· Lorsqu'une nouvelle page écran est activée le curseur clignotant de l'écran est
toujours fixé sur la position du curseur de texte sur cette page.
· Le fait de passer d'une page écran à l'autre n'affecte pas le contenu de ces pages.
· Il n'est pas nécessaire qu'une page écran soit activée pour pouvoir y écrire.
· Le contenu des registres BX, CX, DX et des registres de segment SS, CS et DS
n'est pas modifié par cette fonction. Le contenu de tous les autres registres, et notamment
des registres SI et DI, peut avoir été modifié.
Entrée :
AH = 0Ah
BH = Numéro de la page écran
CX = Nombre d'écritures successives du caractère
AL = Code ASCII du caractère
Sortie :
aucune sortie
Remarques :
· Si le caractère indiqué doit être sorti plusieurs fois (auquel cas la valeur du
registre CX est supérieure à 1), il faut, en mode graphique, que tous les caractères
rentrent dans la page écran actuelle.
· Les codes de commande "bell", "carriage return", etc..., ne sont pas identifiés
comme tels mais sortis comme des codes ASCII normaux.
· Cette fonction permet également de sortir des caractères en mode graphique. Dans
ce cas, les modèles des caractères portant les codes 0 à 127 sont tirés dans une table en
ROM et les modèles des caractères portant les codes 128 à 255 sont tirés d'une table en
RAM qui doit avoir été installée préalablement avec l'instruction GRAFTABL du DOS.
· En mode de texte, le contenu du registre BL définit l'octet d'attribut du caractère.
En mode graphique, il détermine la couleur du caractère. En mode graphique 640*200
points, les valeurs 0 et 1, en mode graphique 320*200 points, les valeurs 0 à 3 sont
possibles pour définir les différentes couleurs de la palette de couleurs sélectionnée.
· Si le mode graphique est activé lors de la sortie de caractères et si le bit 7 du
registre BL est fixé, le modèle de caractère est combiné par un 'ou exclusif' avec les
points graphiques figurant sous ce caractère.
· Cette fonction ne fait pas avancer le curseur vers la prochaine position de l'écran.
Le contenu des registres BX, CX, DX et des registres de segment SS, CS et DS n'est pas
modifié par cette fonction. Le contenu de tous les autres registres, et notamment des
registres SI et DI, peut avoir été modifié.
Fonction 0Bh, Sous-Fct 0 Sélectionner des couleurs de cadre et de fond
Cette fonction sert à sélectionner les couleurs de cadre et de fond pour les modes
graphique et de texte.
Entrée :
AH = 0Bh
BH =0
BL = Couleurs de cadre/de fond
Sortie :
aucune sortie
Remarques :
· En mode graphique, la valeur de couleur transmise définit aussi bien la couleur du
cadre de l'écran que celle du fond de l'écran. En mode de texte, la couleur du fond est
définie séparément pour chaque caractère, de sorte que la valeur de couleur transmise
définit uniquement la couleur du cadre de l'écran.
· La valeur de couleur transmise peut être comprise entre 0 et 15 et peut donc
représenter les 16 couleurs possibles.
· Le contenu des registres BX, CX, DX et des registres de segment SS, CS et DS
n'est pas modifié par cette fonction. Le contenu de tous les autres registres, et notamment
des registres SI et DI, peut avoir été modifié.
Entrée :
AH = 0Bh
BH =1
BL = Numéro de la palette de couleurs
Sortie :
aucune sortie
Remarques :
· Deux palettes de couleurs sont disponibles. Elles portent les numéros 0 et 1 et
contiennent les couleurs suivantes :
Palette 0 : vert, rouge, jaune
Palette 1 : turquoise, magenta, blanc
· Le contenu des registres BX, CX, DX et des registres de segment SS, CS et DS
n'est pas modifié par cette fonction. Le contenu de tous les autres registres, et notamment
des registres SI et DI, peut avoir été modifié.
Fonction 10h, Sous-Fct 02h Définir tous les registres de palette EGA/VGA
Ces fonctions permettent de régler simultanément les 16 registres de palette et le
registre Overscan.
Entrée :
AH = 10h
AL = 02h
ES = adresse de segment de la table de couleurs
DX = adresse d'offset de la table de couleurs
Sortie :
aucune
Remarques :
· La paire de registres ES:BX désigne une table qui doit avoir une longueur de 17
octets. Les 16 premiers octets seront transférés dans les 16 registres de palette du
contrôleur d'attribut alors que le 17ème registre sera copié dans le registre Overscan.
· Le contenu des registres BX, CX, DX, SI, DI et BP ainsi que celui de tous les
registres de segment n'est pas modifié par cette fonction.
Fonction 10h, Sous-Fct 09h Lire le contenu de tous les registres de palette et
Overscan
Lorsque cette fonction est appelée, le contenu des 16 registres de palette ainsi que le
contenu du registre Overscan sont copiés dans un buffer du programme d'appel.
Entrée :
AH= 10h
AL= 09h
ES= Adresse de segment du buffer
DX= Adresse d'offset du buffer
Sortie :
Aucune
Remarques :
·Le buffer doit disposer d'une place d'au moins 17 octets pour pouvoir recevoir le contenu
de tous les registres de palette (octets 0 à 15) et le contenu du registre Overscan (octet
16).
·Le contenu des registres BX, CX, DX, SI, DI et BP ainsi que le contenu de tous les
registres de segment ne sont pas modifiés par cette fonction.
Fonction 10h, Sous-Fct 1Bh Convertir le contenu des registres de couleur DAC
en gris
Cette fonction convertit une section déterminée de la table de couleurs DAC en
nuances de gris correspondantes.
Entrée :
AH= 10h
AL= 1Bh
BX= Numéro du premier registre de couleur DAC à convertir
CX= Nombre de registres de couleur DAC à traiter
Sortie :
Aucune
Remarques :
· La conversion en une nuance de gris s'effectue par une pondération différenciée
des parts de rouge, de vert et de bleu, qui reflète les différences d'intensité entre ces
couleurs fondamentales sur l'écran. Le coefficient appliqué au rouge est 0,3, celui
appliqué au vert 0,59, et celui appliqué au bleu 0,11.
· Le contenu des registres BX, CX, DX, SI, DI et BP ainsi que le contenu de tous
les registres de segment ne sont pas modifiés par cette fonction.
Fonction 11h, Sous-Fct 00h Charger le jeu de caractères défini par l'utilisateur
EGA/VGA
Cette fonction charge un jeu de caractères défini par l'utilisateur de la mémoire
RAM dans l'une des deux tables de caractères EGA/VGA.
Entrée :
AH= 11h
AL= 00h
BH= lignes par caractère (et donc octets par caractère)
BL= table de caractères appelée (0 ou 1)
CX= nombre de caractères dans la table
DX= code ASCII du premier caractère dans la table
ES= adresse de segment de la table de caractères dans la RAM
BP= adresse d'offset de la table de caractères dans la RAM
Sortie :
aucune
Remarques :
· 512 caractères peuvent être chargés au maximum par table de caractères.
· Le jeu de caractères chargé n'est pas activé et les registres du CRTC ne sont pas
non plus programmés de façon à adapter l'affichage des caractères sur l'écran à la taille
des caractères. Les modifications ne sont donc perceptibles sur l'écran que si la table de
caractères dans laquelle sont chargées les définitions de caractères est la table
actuellement activée.
· Le contenu des registres BX, CX, DX, SI, DI et BP ainsi que celui de tous les
registres de segment n'est pas modifié par cette fonction.
Fonction 11h, Sous-Fct 10h Charger et activer un jeu de caractères défini par
l'utilisateur
Cette fonction charge un jeu de caractères défini par l'utilisateur dans l'une des deux
tables de caractères EGA/VGA et l'active en programmant les registres du CRTC.
Entrée :
AH= 11h
AL= 10h
BH= lignes par caractère (et donc octets par caractère)
BL= table de caractères appelée (0 ou 1)
CX= nombre de caractères dans la table
DX= code ASCII du premier caractère dans la table
ES= adresse de segment de la table de caractères dans la RAM
BP= adresse d'offset de la table de caractères dans la RAM
Sortie :
Aucune
Remarques :
· 256 caractères peuvent être chargés au maximum par table de caractères.
· Le nombre de lignes de texte affichées sur l'écran dépend de la hauteur des
caractères. Il est égal au nombre de lignes de l'écran (350 ou 480) divisé par la hauteur de
caractère.
· Les lignes de début et de fin du curseur clignotant de l'écran sont
automatiquement adaptées à la hauteur de la nouvelle matrice de caractère.
· Le contenu des registres BX, CX, DX, SI, DI et BP ainsi que celui de tous les
registres de segment n'est pas modifié par cette fonction.