Section courante

A propos

Section administrative du site

Assembleur 80x86

POP

INTEL 8088+ Pop Value Of Stack

Syntaxe

POP opérande

Paramètres

Nom Description
opérande Ce paramètre permet d'indiquer l'opérande, pouvant être un registre ou une adresse mémoire, allant recevoir la valeur de la pile.

Description

Cette instruction permet de désempiler de la pile un mot, un double mot ou un quadruple mot et la met dans une opérande.

Algorithme

SI taille de l'adresse de pile = 32 bits ALORS
   SI taille de opérande = 32 bits ALORS
      opérande ← SS:ESP
      ESP ← ESP + 4
   SINON
      opérande ← SS:ESP
      ESP ← ESP + 2
   FIN SI
SINON
   SI taille de l'opérande = 16 bits ALORS
      opérande ← SS:SP
      SP ← SP + 2
   SINON
      opérande ← SS:SP
      SP ← SP + 4
   FIN SI
FIN SI

Mnémonique

Instruction Opcode Description
POP reg/mem16 8Fh /0 Désempile du sommet de la pile une valeur et la met dans un emplacement mémoire ou registre 16 bits.
POP reg/mem32 8Fh /0 Désempile du sommet de la pile une valeur et la met dans un emplacement mémoire ou registre 32 bits. Il n'y a pas de préfixe en mode 64 bits.
POP reg/mem64 8Fh /0 Désempile du sommet de la pile une valeur et la met dans un emplacement mémoire ou registre 64 bits.
POP reg16 58h +rw Désempile du sommet de la pile une valeur et la met dans le registre 16 bits.
POP reg32 58h +rd Désempile du sommet de la pile une valeur et la met dans un registre 32 bits. Il n'y a pas de préfixe en mode 64 bits.
POP reg64 58h +rq Désempile du sommet de la pile une valeur et la met dans un registre 64 bits.
POP DS 1Fh Désempile du sommet de la pile une valeur et la met dans le registre DS. Invalide en mode 64 bits.
POP ES 07h Désempile du sommet de la pile une valeur et la met dans le registre ES. Invalide en mode 64 bits.
POP SS 17h Désempile du sommet de la pile une valeur et la met dans le registre SS. Invalide en mode 64 bits.
POP FS 0Fh A1h Désempile du sommet de la pile une valeur et la met dans le registre FS.
POP GS 0Fh A9h Désempile du sommet de la pile une valeur et la met dans le registre GS.

Exceptions

Message Mode réel Virtuel 8086 Mode protégé Description
#UD(Opcode invalide)     X Les instructions «POP DS», «POP ES» ou «POP SS» sont exécutés en mode 64 bits.
#NP(Sélecteur)     X Les registres DS, ES, FS ou GS sont chargés dans un sélecteur de segment non-nulle et le segment est marqué non présent.
#SS(Pile) X X X Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique
#SS(Sélecteur) X X X Le registre SS est chargé avec un sélecteur non-nulle et le segment est marqué non présent.
#GP(Protection général) X X X Une adresse mémoire dépasse la limite du segment de données ou n'est pas canonique
    X L'opérande de destination n'est pas dans un segment non écrivable
    X Un segment de données nulle est utilisé comme référence mémoire
#GP(Sélecteur)     X Un registre de segment est chargé, mais le descripteur de segment dépasse la limite de la table du descripteur.
    X Un registre de segment est chargé et le bit TI de sélecteur de segment est fixé, mais le sélecteur LDT est un sélecteur nulle.
    X Le registre SS est chargé avec un sélecteur de segment nulle dans un mode non 64 bits ou avec CPL = 3.
    X Le registre SS est chargé et le sélecteur de segment RPL et le descripteur de segment DPL n'est pas égale au CPL.
    X Le registre SS est chargé et le segment pointe dans un segment de données non écrivable.
    X Le registre DS, ES, FS ou GS est chargé et le segment pointe sur des données ou un segment de code non-conforme, mais le RPL ou CPL est supérieur au DPL.
    X Le registre DS, ES, FS ou GS est chargé et le segment ne pointe pas sur un segment de données ou un segment de code en lecture.
#PF(Faute de page)   X X Une faute de page résultat de l'exécution de l'instruction
#AC(Vérifie l'alignement)   X X Un désalignement de la référence mémoire est effectué quand une vérification d'alignement est activé

Exemple

Voici un exemple en Turbo Pascal 7 montrant une utilisation de cette instruction :

  1. Program AsmPopSamples;
  2.  
  3. Var _AX:Word;
  4.  
  5. BEGIN
  6.  ASM
  7.   MOV AX,4
  8.   MOV BX,7
  9.   PUSH AX
  10.   PUSH BX
  11.   POP AX
  12.   POP BX
  13.   PUSH AX
  14.    MOV AX,3
  15.    MOV BX,AX
  16.   POP AX
  17.   ADD AX,BX
  18.   MOV _AX,AX
  19.  END;
  20.  WriteLn('AX = ',_AX);
  21. END.

on obtiendra le résultat suivant :

AX = 10

Voir également

Langage de programmation - Assembleur 80x86 - Instruction PUSH
Langage de programmation - Structure de données - Structures récursives linéaires - Pile

Références

Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 825
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 412
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z, Edition Intel, Mars 2010, Publication No. 253667-034US, page 222 à 228.
AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Edition Advanced Micro Devices, Revision 3.14, September 2007, Publication No. 24594, page 185 à 186.

Dernière mise à jour : Lundi, le 1 septembre 2014