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