| 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 :
on obtiendra le résultat suivant :
AX = 10Voir également
Langage de programmation - Assembleur 80x86 - Instruction PUSH
Langage de programmation - Structure de données - Structures récursives linéaires - Pile
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.