Fonctionnement d`un processeur Assembleur x86

publicité
Mémoire centrale et adresse
Comment est organisée la mémoire centrale?
La mémoire est composée d'une suite d'emplacements numérotés
séquentiellement, et pouvant contenir un nombre codé sur 8 bits
(octet compris entre 0 et 255).
Chaque emplacement peut être lu ou écrit ; pour cela, il faut
connaître son adresse.
Fonctionnement d’un processeur
Assembleur x86
Qu'est-ce qu'une adresse ?
C’est l'endroit où est stockée une donnée.
Selon le micro utilisé, elle peut être un seul nombre qu'on appelle
adresse
ou deux nombres associés : le segment et l'offset, que l'on note
segment:offset.
JeanJean-Luc GOERIG
Novembre 2007 - #071119
1/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
2/36
Fonctionnement d’un processeur
Segment et offset
Registres d’un processeur
Qu'est-ce qu'un 'segment' ?
Qu'est ce qu'un 'registre' ?
Si on imagine que la mémoire est une route, les bornes
kilométriques représentent les segments. Cela signifie que la
mémoire est découpée en morceaux (segments), et que chaque
morceau (segments) contient un certain nombre d'informations.
Il s'agit d'une case mémoire particulière situé dans le processeur
Il contient un certain nombre de bits (généralement 8 pour les petits
microcontrôleurs, 32 voire 64 pour les PC, et encore plus pour
d'autres systèmes
Les données dans ces mémoires sont celles traitées directement par
le processeur. Il peut réaliser diverses actions sur ses registres :
addition, soustraction, décalage, etc.
Chaque instruction en assembleur intervient directement sur le
contenu des registres.
Qu'est ce qu'un 'offset' ?
En anglais, "offset" signifie "décalage".
La mémoire etant décomposée en segments, il faut, pour localiser
une donnée précise, savoir dans quel segment elle se trouve, et le
décalage qu'il y a entre cette donnée et la première donnée du
segment. C'est ce qu'on appelle l’offset.
Novembre 2007 - #071119
3/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Novembre 2007 - #071119
Jean-Luc GOERIG
4/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Principaux registres et UAL
Cycle de fonctionnement
Quels sont les principaux registres d’un processeur ?
Un cycle de fonctionnement du processeur suit toujours la
même séquence d’opérations suivantes:
Le compteur ordinal: il contient toujours l’adresse de la prochaine
instruction à exécuter.
Le registre d’instruction: contient l’instruction à exécuter
1. Lecture du compteur ordinal (qui contient …)
2. Lecture de l’instruction en mémoire centrale et transfert
dans le registre d’instruction.
3. Incrémentation du compteur ordinal.
4. Décodage de l’instruction par le décodeur.
5. Exécution de l’instruction.
6. Retour en 1. pour un nouveau cycle.
L’ Unité Arithmétique et Logique (UAL)
est spécialisé dans les calculs arithmétiques et logiques
possède un registre particulier : l’accumulateur sur lequel s’exécute
directement les opérations
Autres registres:
Le registre indicateur d’états (flags): il donne l’état du processeur à
tous moment, et peut seulement être lu
Le pointeur de pile (SP ou Stack Pointer): c’est le pointeur d’une
zone spéciale de la mémoire appelée pile (stack).
Novembre 2007 - #071119
5/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
6/36
Fonctionnement d’un processeur
Assembleur
Architecture x86
Qu'est ce que l'Assembleur ?
Qu'est-ce qu'un x86 ?
L'Assembleur est le langage de programmation de plus bas niveau.
Cela signifie qu'il est très proche du matériel.
A chaque instruction correspond un code machine, qui est compris
par le microprocesseur. Le code assembleur est donc la version
lisible du code machine.
Jean-Luc GOERIG
x86 fait référence à tous les microprocesseurs de PC, depuis le
8088 (Intel).
Cela inclut les 8008, 8086, 286, 386, 486, 586, 686.
Le numéro est précédé d'un 'i' : i586. Il s'agit d'un problème
d'enregistrement des marques : elles doivent nécessairement
débuter par une lettre.
Pourquoi programmer en Assembleur ?
S'il est de nos jours impensable de programmer entièrement une
application en Assembleur (sauf à des fins d'apprentissage bien sûr),
de nombreuses situations font que l'on doit avoir recours à ce
langage. C'est par exemple le cas lorsque la vitesse est un facteur
critique, et que la moindre microseconde est précieuse, ou encore
pour écrire un gestionnaire de démarrage (Boot-Loader), etc...
Novembre 2007 - #071119
7/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
8/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Registres x86
Registres généraux
Les registres sont donc des cases mémoire situés à
l'intérieur du microprocesseur
Les registres généraux servent à manipuler des données, à
transférer des paramètres lors de l'appel de fonctions DOS
et à stocker des résultats intermédiaires.
au nombre de 14 sur le 8088 (16 bits), mais depuis cette époque
d'autres registres se sont rajoutés (32 et 64 bits)
on ne verra que ces 14 registres (registres généraux).
A l'origine, les registres généraux x86 sont: AX, BX, CX, DX, SI, DI,
SP et BP . Taille = 16 bits.
Sur les nouveaux processeurs, TOUS les registres ont été étendus à
32 bits. On y accéde en ajoutant la lettre E devant le nom du registre
(E pour Extended).
Quatre catégories de registres généraux:
les registres de travail
les registres de segment
les registres d'offset
le registre FLAG
4 registres de travail: (ils ont un usage bien précis)
AX = ACCUMULATEUR
BX = BASE
CX = COMPTEUR
DX = DATA
Novembre 2007 - #071119
9/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
10/36
Fonctionnement d’un processeur
Registres généraux de travail
Registres généraux de travail
AX reste l'accumulateur privilégié
Ils peuvent aussi servir comme zone de stockage de résultats
intermédiaires.
Ces 4 registres peuvent être divisés en deux sous-registres de 8 bits:
Les registres généraux AX, BX, CX, DX peuvent donc être considérés:
Correspondance :
Jean-Luc GOERIG
soit comme deux registres de 8 bits chacun
ils s'appellent alors AH et AL, BH et BL, CH et CL, DH et DL
H pour High , L pour Low
soit comme des registres 16 bits:
ils s'appellent alors AX, BX, CX, DX
soit comme des registres 32 bits (à partir du 80386)
ils s'appellent alors EAX, EBX, ECX et EDX (E pour Extended)
Novembre 2007 - #071119
11/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
12/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Registres généraux de segment
Registres généraux d’offset
Les registres de segment:
Les registres d'offset:
Ces registres contiennent une valeur représentant un offset à
combiner avec une adresse de segment
ils sont au nombre de 5: IP, SI , DI , BP, SP
Ils sont utilisés pour stocker l'adresse de début d'un segment. Il peut
s'agir de l'adresse du début des instructions du programme, du début
des données ou du début de la pile.
CS = CODE SEGMENT : ce registre indique l'adresse du début des
instructions d'un programme ou d'une sous-routine.
DS = DATA SEGMENT : ce registre contient l'adresse du début des
données des programmes. Si le programme utilise plusieurs segments de
données, cette valeur devra être modifiée durant son exécution.
ES = EXTRA SEGMENT : ce registre est utilisé, par défaut, par certaines
instructions de copie de bloc. En dehors de ces instructions, le programmeur
est libre de l'utiliser comme il l'entend.
SS = STACK SEGMENT : il pointe sur une zone appelée la pile.
Novembre 2007 - #071119
13/36
Fonctionnement d’un processeur
Le compteur ordinal: IP
IP = INSTRUCTION POINTER :
ce registre de 16 bits est associé au registre de segment CS (CS:IP)
Il indique toujours l’adresse de la prochaine instruction à
exécuter.
Ce registre ne pourra JAMAIS être modifié directement; il sera
modifié INDIRECTEMENT par les instructions de saut , par les
sous-programmes et par les interruptions .
Novembre 2007 - #071119
Jean-Luc GOERIG
14/36
Fonctionnement d’un processeur
Registres généraux
Registre général d’état (Flag)
Autres registres d'offset:
Le registre FLAG:
SI = SOURCE INDEX : ce registre de 16 bits est principalement
utilisé lors d'opérations sur des chaînes de caractères; il est associé
au registre de segment DS.
DI = DESTINATION INDEX : ce registre de 16 bits est
principalement utilisé lors d'opérations sur des chaînes de
caractères; il est normalement associé au registre de segment DS;
dans le cas de manipulation de chaînes de caractères, il sera
associé à ES.
BP = BASE POINTER : ce registre de 16 bits est associé au registre
de segment SS (SS:BP) pour accèder aux données de la pile lors
d'appels de sous-programmes (CALL)
SP = STACK POINTER : ce registre de 16 bits est associé au
registre de segment SS (SS:SP) pour indiquer le dernier élément de
la pile.
Novembre 2007 - #071119
15/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Remarque : A l'époque, le registre FLAG était un ensemble de 16
bits. A partir du 386, ce registre est devenu Eflag. Il contient
quelques nouveaux Flags de controle (Virtual Mode Flag, Resume
Flag, Alignment Check, ...).
La valeur représentée par ce nombre de 16 bits n'a aucune
signification en tant qu'ensemble: ce registre est manipulé bit par
bit, certains d'entre eux influenceront le comportement du
programme.
Novembre 2007 - #071119
Jean-Luc GOERIG
16/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Registre général d’état (Flag)
Registre général d’état (Flag)
Les bits de ce registre sont appelés "indicateur", on peut les regrouper
en deux catégories:
Les Flags d'état : (CF, PF, AF, ZF ,SF et OF) seront modifiés par
certaines instructions. Il s'agit des instructions arithmétiques, logiques et
des instructions de comparaison (nous les verrons dans le chapitre
suivant). Les instructions de saut conditionnel testent par la suite l'état
des Flags en vue d'effectuer, ou non, un branchement.
Les Flags de contrôle : (TF, IF, DF) donnent au processeur des
indications quant au déroulement du programme. Ils peuvent être
activés ou désactivés par le programme en cours.
Remarques : Lors d'une instruction non arithmétique ou logique, les
indicateurs CF et OF sont remis à 0. Dans certains cas les indicateurs
ne sont pas modifiés, dans certains cas ils le sont et, parfois, ils sont
indéfinis...
CF = Carry Flag (retenue)
PF = Parity Flag (parité)
AF = Auxiliary Flag (retenue auxiliaire)
ZF = Zero Flag (zéro)
SF = Sign Flag (signe)
TF = Trap Flag (exécution pas à pas)
IF = Interrupt Flag (interruption)
DF = Direction Flag (direction)
OF = Overflow Flag (débordement)
IOPL = Input/Output privilege level (286 et plus)
NT = Nested Task Flag (386 et plus)
Novembre 2007 - #071119
17/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
18/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Registre général d’état (Flag)
Instructions arithmétiques
Voici la signification des principaux indicateurs
Une instruction assembleur est également appelé mnémonique.
Instruction MOV:
L'indicateur CF (CARRY ou retenue) : il sera mis à 1 s'il y a eu retenue
lors de la dernière instruction arithmétique.
L'indicateur OF (OVERFLOW ou débordement) : il sera mis à 1 (activé,
set) si le résultat d'une addition de 2 nombres positifs donne un nombre
négatif et inversement. En règle générale, cet indicateur est activé quand le
signe change alors qu'il ne devrait pas... En arithmétique non-signé, la
valeur de cet indicateur n'aura donc pas de signification.
L'indicateur ZF (ZERO) : il sera mis à 1 si le résultat d'une instruction
arithmétique a donné zéro et il le restera jusqu'à la prochaine instruction
arithmétique.
L'indicateur SF (SIGN ou sign) : il sera mis à 1 si le résultat d'une
instruction a donné un nombre négatif (bit de poids fort = 1) il sera mis à
zéro dans le cas contraire.
L'indicateur PF (PARITE) : l'indicateur est mis à 1 si le résultat d'une
opération contient un nombre pair de bits 1.
Note : Les indicateurs OF, CF, ZF ,SF et PF sont appelés indicateurs
"arithmétiques" car ils sont tous affectés par des instructions de ce type.
Novembre 2007 - #071119
19/36
Fonctionnement d’un processeur
But : copie le contenu de l'opérande source dans l'opérande de destination.
Syntaxe :
MOV destination, source
Flags :
aucun flag n'est modifié par cette instruction.
Exemples :
Assembleur:
Effet:
MOV AX,1234
MOV BX,1234H
MOV DX,CX
MOV BX,AX
MOV AX,DX
MOV DX,BX
AX <- 1234
BX <- 123416 = 466010
DX <- CX
Echange les contenus
de AX et DX mais détruit
le contenu de BX.
MOV est l'instruction la plus utilisée en assembleur.
Novembre 2007 - #071119
Jean-Luc GOERIG
20/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Instructions arithmétiques
Instructions arithmétiques
Instruction ADD:
Instruction SUB:
But : ajouter le contenu de l'opérande source au contenu de l'opérande de
destination
Syntaxe :
ADD destination, source
Flags :
ZERO et CARRY (et overflow) modifiés selon le résultat.
Exemples :
Assembleur:
Effet:
ADD AX,1234
AX <- AX + 1234
ADD BX,1234H BX <- BX + 123416
ADD DX,CX
DX <- DX + CX
ADD CX,CX
double le contenu de CX.
MOV AX,8000h
ADD AX,9000h
est un exemple de dépassement de
capacité : AX <- 1000h et CARRY = 1
8000
+9000
=1|1000 [car 16 bits = 4 caractères hexadécimaux]
Novembre 2007 - #071119
21/36
But : soustraire le contenu de l'opérande source au contenu de l'opérande
de destination
Syntaxe : SUB destination, source
Flags :
ZERO et SIGNE modifiés selon le résultat.
Exemples :
Assembleur:
Effet:
SUB AX,1234
AX <- AX – 1234
SUB BX,1234H BX <- BX – 123416
SUB DX,CX
DX <- DX – CX
SUB CX,CX
met CX à zéro.
rem : SUB CX,CX (simple accès à la mémoire) est plus rapide que MOV
CX,0 (double accès à la mémoire).
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
22/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Instructions arithmétiques
Modes d’adressage
Instruction INC:
Quels sont les différents modes d'adressage d'une donnée
?
But : INC incrémente d'une unité l'opérande de destination
Syntaxe : INC destination
(rem : destination ne peut pas être une valeur immédiate!).
Flags :
Si AH = FFh (= -1), INC AH donnera :
Adressage direct : l'adresse de la donnée fait partie de l'instruction :
Exemple:
mov ax,Truc
mov ax,ds:[0020h]
Adressage immédiat : en réalité, ce n'est pas un adressage puisque c'est
la donnée elle-même qui fait partie de l'instruction :
Exemple:
mov ax,20
Adressage indirect : on met dans l'instruction un ou plusieurs élément(s)
qui contie(nne)nt l'adresse de la donnée :
Exemple:
mov ax,[bx]
11111111 <-- retenues
11111111 (-1)
+00000001 ( 1)
00000000 = 0
- SF est mis à 0 car le bit de poids fort = 0.
- CF n'est jamais modifié par cette opération!
- ZF est mis à 1 car le résultat = 0.
- OF est mis à 0 car le résultat peut être installé dans l'opérande destination
(pas de retenue sur les 2 derniers bits).
Novembre 2007 - #071119
23/36
Fonctionnement d’un processeur
Attention ! Seuls les registres suivants peuvent contenir une adresse :
bx (registre de base dans le segment de données);
bp (registre de base dans la pile);
si et di (registres d'index dans le segment de données).
L'instruction suivante est une erreur de syntaxe :
mov ax,[cx]
Novembre 2007 - #071119
Jean-Luc GOERIG
24/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Modes d’adressage
Instructions de branchement
Adressages indirects :
Basé ou indexé simple (avec éventuellement ajout d'un offset) :
Exemple:
mov ax,Truc [bx]
mov ax,[bp]
mov ax,[si]
mov ax,[di]
Basé-indexé (avec éventuellement ajout d'un offset) :
Exemple:
mov ax,[bp][di]
mov ax,Truc [bx][si]
Ce type d'adressage est très utile pour gérer des tableaux.
Les instructions de branchement provoquent un saut à une partie du
programme repérée par un label ou une adresse.
On parlera de rupture de séquence. Ce sont ces instructions qui
modifieront IP et éventuellement CS.
Les instructions de saut conditionnel :
Les sauts conditionnels sont très importants car ils permettent au
programme de faire des choix en fonction des données.
Un saut conditionnel n’est effectué qu’à certaines conditions portant sur les
flags (par exemple : CF = 1 ou ZF = 0).
les sauts de comparaison :
JE (« Jump if Equal ») fait un saut au label spécifié si et seulement si ZF
= 1. Rappelez-vous que ce flag est à 1 si et seulement si le résultat de
l’opération précédente vaut zéro. Comme CMP réalise une soustraction, on
utilise généralement JE pour savoir si deux nombres sont égaux.
Mnémonique équivalent : JZ (« Jump if Zero »)
Novembre 2007 - #071119
25/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
Instructions de branchement
26/36
Jean-Luc GOERIG
Instructions de branchement
JG (« Jump if Greater ») fait un saut au label spécifié si et seulement si ZF
= 0 et SF = OF. On l’utilise en arithmétique signée pour savoir si un nombre
est supérieur à un autre.
JA (« Jump if Above ») fait un saut au label spécifié si et seulement si ZF
= 0 et CF = 0. On l’utilise en arithmétique non signée pour savoir si un
nombre est supérieur à un autre.
Mnémonique équivalent : JNLE (« Jump if Not Less Or Equal »)
Mnémonique équivalent : JNBE (« Jump if Not Below Or Equal »)
JGE (« Jump if Greater or Equal ») fait un saut au label spécifié si et
seulement si SF = OF. On l’utilise en arithmétique signée pour savoir si un
nombre est supérieur ou égal à un autre.
JAE (« Jump if Above or Equal ») fait un saut au label spécifié si et
seulement si CF = 0. On l’utilise en arithmétique non signée pour savoir si
un nombre est supérieur ou égal à un autre.
Mnémonique équivalent : JNL (« Jump if Not Less »)
Mnémonique équivalent : JNB (« Jump if Not Below »)
JL (« Jump if Less ») fait un saut au label spécifié si et seulement si SF
<> OF. On l’utilise en arithmétique signée pour savoir si un nombre est
inférieur à un autre.
JB (« Jump if Below ») fait un saut au label spécifié si et seulement si CF
= 1. On l’utilise en arithmétique non signée pour savoir si un nombre est
inférieur à un autre.
Mnémonique équivalent : JNGE (« Jump if Not Greater Or Equal »)
Mnémonique équivalent : JNAE (« Jump if Not Above Or Equal »)
JLE (« Jump if Less Or Equal ») fait un saut au label spécifié si et seulement
si SF <> OF ou ZF = 1. On l’utilise en arithmétique signée pour savoir si un
nombre est inférieur ou égal à un autre.
JBE (« Jump if Below or Equal ») fait un saut au label spécifié si et
seulement si CF = 1 ou ZF = 1. On l’utilise en arithmétique non signée pour
savoir si un nombre est inférieur ou égal à un autre.
Mnémonique équivalent : JNG (« Jump if Not Greater »)
Novembre 2007 - #071119
27/36
Fonctionnement d’un processeur
Fonctionnement d’un processeur
Mnémonique équivalent : JNA (« Jump if Not Above »)
Novembre 2007 - #071119
Jean-Luc GOERIG
28/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Instructions de branchement
Instructions de branchement
Instruction CMP :
Instruction JMP:
But : comparer (soustraire) le contenu de l'opérande source au contenu de
l'opérande destination.
Syntaxe :CMP destination, source
Flags : ZERO, CARRY, OVERFLOW, SIGNE modifiés selon le résultat.
Pour analyser l'influence de cette instruction sur les indicateur, supposons
que AH=05h et BH=06h,le processeur effectue la soustraction de ces deux
valeurs (CMP AH,BH) :
Si AH = FFh (= -1), INC AH donnera :
111111 <-- retenues
But : "se brancher" inconditionnellement à l'instruction marquée par
label:
Syntaxe : JMP label
Flags :aucun flag n'est modifié.
11111011 (-5)
+00000110 ( 6)
1|00000001
- OF est mis à 0
- SF est mis à 0 car le bit de signe (à gauche) = 0
- ZF est mis à 0 car le résultat est différent de 0.
- CF est mis à 1 car il y a retenue (le résultat est sur 9 bit).
Novembre 2007 - #071119
29/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
30/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Interruptions
Interruptions
Qu'est ce qu'une Interruption ?
Un ordinateur est équipé de toutes sortes de périphériques: le clavier, la souris,
l'écran, les disques, l'imprimante, etc. Pour accèder à ces périphériques, on
utilise des interruptions MS-DOS. A chaque périphérique correspond une
interruption identifiées par un numéro.
Exemple:
int 21h correspond au clavier et à l’écran
Le programme (le code) doit transmettre des paramètres à cette interruption
pour spécifier le type de "service souhaité" (fonction). Ceci se fait par
l'intermédiaire des registres.
Exemple:
mov ah,09h
int 21h
Ici, appel de l'interruption n°21h et la fonction 0 9h: cette interruption va
écrire une chaîne de caractères à l'écran, un peu comme "printf()" en
langage C)
Les interruptions possèdent plusieurs fonctions, par exemple si on aurait mis
0Fh à la place de 09h dans ah, on aurait appelé le service qui ouvre un fichier.
Ces opérations sont éxecutées par MS-DOS, et dans certains cas des
paramètres seront renvoyés aussi par l'intermédiaire des registres. (par exemple
on peut demander à MS-DOS de dire quelle touche du clavier à été enfoncée).
Voir la Liste des fonctions de l’interruption 21
Une interruption est un programme qui est exécuté lorsqu'un
évènement particulier se produit.
On distingue deux types d'interruption :
les interruptions matérielles, qui sont déclenchées lorsqu'un
évènement physique se produit (appuie sur une touche du clavier
par exemple)
les interruptions logicielles, qui sont appelées directement par le
programme.
la notion d'interruption va permettre l'interactivité entre l'utilisateur
et le programme.
Novembre 2007 - #071119
31/36
Fonctionnement d’un processeur
Novembre 2007 - #071119
Jean-Luc GOERIG
32/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Interruptions
Interruptions
Ecrire un caractère à l'écran
int 10h, 09h
L'interruption vous demande entre autre de placer dans BL l'attribut du
caractère.
Voici la signification des huit bits sur un exemple:
0 100 0001
Le bit de gauche précise si le texte clignote ou pas.
Les 3 bits suivants sont la composantes RVB du fond.
Les 4 bits de droites sont la composante RVB de l'avant plan, plus un bit
de précisant l'intensité de la couleur. Dans l'exemple on écrit donc en
bleu foncé sur rouge.
Dans BH la page est 0. (celle en cours)
Dans AL on peut mettre le code ASCII ou le caractere entre guillemet.
(pour A : 65 ou 'A')
Ecrire une phrase à l'écran
Novembre 2007 - #071119
Novembre 2007 - #071119
33/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
int 21h, 09h
Là il va falloir écrire une phrase dans un tableau qui se termine par le
caractère $
Ensuite donner l'adresse de ce tableau dans DX
Attendre qu'une touche soit enfoncée pour continuer.
int 16h, 00h
Vous recevez en retour le code ASCII de la touche enfoncée dans AL
Afficher un pixel.
int 10h, 0Ch
AL = n° de la couleur
BH = n° de la page (0)
CX = n° de la colonne (X)
DX = n° de la ligne (Y)
34/36
Fonctionnement d’un processeur
Pile (stack
(stack))
Pile (stack
(stack))
La pile (Stack en anglais) est une structure (zone mémoire) qui sert à sauver
temporairement des informations;
Elle sert aussi pour la communication entre programmes et sous-programmes (sousroutines ou procédures).
Elle possède les caractéristiques d'une pile d’assiettes, c'est à dire qu'on ne pourra
empiler qu'un élément à la fois et, si la pile possède plusieurs éléments, ils ne pourront
être retirés (désempilés) que dans l'ordre inverse de l'empilage, c'est ce qu'on appelle la
méthode LIFO (last IN, first OUT = le dernier empilé sera le premier désempilé).
La pile LIFO peut être comparée à une pile d'assiettes. On empile et on "désempile" des
assiettes. La dernière assiette empilée est la première prise.
(Remarque : la pile FIFO (first IN, first OUT) est le système inverse et peut être comparée
à une file d'attente à un guichet. Le premier arrivé est aussi le premier servi.
La taille de chaque emplacement est d'un mot (deux octets) parce que c'est la plus petite
valeur que l'on puisse placer sur la pile. (Le pointeur SP ne peut donc jamais être impair.)
C'est donc un ensemble de bytes qui se trouvent dans le segment dont l'adresse est dans
SS (Stack Segment).
Comme le processeur ne peut pas "voir" où on en est dans le remplissage de la pile, il
utilise un autre registre : SP (Stack Pointer) pour indiquer le numéro du dernier élément
(sommet de la pile) : l'adresse de cet élément est donc SS:SP.
Le registre de segment SS pointe sur le début de la pile tandis que le registre SP indique
la position du dernier élément placé sur cette pile.
Les instructions PUSH et POP :
Novembre 2007 - #071119
Novembre 2007 - #071119
35/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Jean-Luc GOERIG
Les deux seules opérations autorisées sont l'empilage (PUSH registre) et le
désempilage (POP registre) d'un seul élément à la fois.
Lorsqu'une instruction PUSH est rencontrée, SP est d'abord décrémenté de
2 (un élément=2bytes) et le contenu du registre spécifié est copié dans
l'élément numéro SP de la pile (adresse SS:SP).
Pour une opération POP, l'élément numéro SP de la pile est copié dans le
registre spécifié puis SP est incrémenté de 2.
Les formes disponibles de ces instructions sont:
PUSH reg
PUSH mem
POP reg
POP mem
où "reg" est un registre de 16 bits et "mem" est une zone mémoire de
16 bits.
Remarque : PUSH AL est impossible! Le compilateur détectera une
erreur. (car AL est un registre 8 bits).
36/36
Fonctionnement d’un processeur
Jean-Luc GOERIG
Téléchargement