Assembleur 80x86 | PUSH |
---|---|
INTEL 8088+ | Push Value Onto Stack |
Syntaxe
PUSH immédiate | INTEL 80286+ |
PUSH opérande | INTEL 8088+ |
Paramètres
Nom | Description |
---|---|
immédiate | Ce paramètre permet d'indiquer une valeur immédiate à rajouter dans la pile |
opérande | Ce paramètre permet d'indiquer l'opérande dont la valeur est rajouté dans la pile |
Description
Cette instruction permet d'empiler un mot, un double mot ou quadruple mot dans la pile.
Remarques
- L'instruction PUSH décrémente le pointeur de pile, puis entrepose l'opérande source en haut de la pile. Les tailles d'adresse et d'opérande sont déterminées et est utilisées comme suit : taille de l'adresse. Le drapeau D dans le descripteur de segment de code actuel détermine la taille d'adresse par défaut; il peut être remplacé par un préfixe d'instruction (67H).
- La taille de l'adresse est utilisée uniquement lors du référencement d'un opérande source en mémoire. Taille de l'opérande : Le drapeau D dans le descripteur de segment de code actuel détermine la taille d'opérande par défaut; il peut être remplacé par des préfixes d'instruction (66h ou REX.W).
- La taille de l'opérande (16, 32 ou 64 bits) détermine la quantité de décrémentation du pointeur de pile (2, 4 ou 8).
- Si l'opérande source a une taille immédiatement inférieure à la taille de l'opérande, une valeur de signe étendu est poussée sur la pile. Si l'opérande source est un registre de segment (16 bits) et que la taille de l'opérande est de 64 bits, une valeur étendue 0 est poussée sur la pile; si la taille de l'opérande est de 32 bits, soit une valeur étendue 0 est poussée sur la pile, soit le sélecteur de segment est écrit sur la pile à l'aide d'un déplacement de 16 bits. Dans le dernier cas, tous les microprocesseurs Core (Core 2, Core i3, Core i5, Core i7, Core i9, Core M,...) et Atom récents effectuent un déplacement de 16 bits, laissant la partie supérieure de l'emplacement de la pile non modifiée. Taille d'adresse de pile : En dehors du mode 64 bits, le drapeau B dans le descripteur de segment de pile actuel détermine la taille du pointeur de pile (16 ou 32 bits); en mode 64 bits, la taille du pointeur de pile est toujours de 64 bits. La taille de l'adresse de pile détermine la largeur du pointeur de pile lors de l'écriture dans la pile en mémoire et lors de la décrémentation du pointeur de pile. La quantité par laquelle le pointeur de pile est décrémenté est déterminée par la taille de l'opérande. Si la taille de l'opérande est inférieure à la taille de l'adresse de la pile, l'instruction PUSH peut entraîner un pointeur de pile mal aligné (un pointeur de pile n'étant pas aligné sur une limite de double mot ou de quadruple mot).
- L'instruction PUSH ESP empile la valeur du registre ESP telle qu'elle existait avant l'exécution de l'instruction. Si une instruction PUSH utilise un opérande de mémoire dans lequel le registre ESP est utilisé pour calculer l'adresse d'opérande, l'adresse de l'opérande est calculée avant que le registre ESP ne soit décrémenté.
- Si le registre ESP ou SP est 1 lorsque l'instruction PUSH est exécutée en mode adresse réelle, une exception de défaut de pile (#SS) est générée (car la limite du segment de pile est violée). Son émission rencontre une seconde exception de défaut de pile (pour la même raison), provoquant la génération d'une exception de double défaut (#DF). La remise de l'exception de double défaut rencontre une troisième exception de défaut de pile et le processeur logique entre en mode d'arrêt.
- Compatibilité de l'architecture IA-32 : pour les processeurs IA-32 à partir du Intel 80286, l'instruction PUSH ESP empile la valeur du registre ESP telle qu'elle existait avant l'exécution de l'instruction. Cette situation est également vrai pour l'architecture Intel 64, le mode réel et le mode virtuel 8086 de l'architecture IA-32. Pour le microprocesseur Intel 8086, l'instruction PUSH SP pousse la nouvelle valeur du registre SP (c'est-à-dire la valeur après et elle est décrémenté de 2).
Algorithme
SI taille de l'adresse = 32 bits ALORS SI taille de l'opérande = 32 bits ALORS ESP ← ESP - 4 SS:ESP ← opérande SINON ESP ← ESP - 2 SS:ESP ← opérande FIN SI SINON SI taille de l'opérande = 16 bits ALORS SP ← SP - 2 SS:SP ← opérande SINON SP ← SP - 4 SS:SP ← opérande FIN SI FIN SI |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
PUSH reg/mem16 | FFh /6 | Empile le contenu d'une opérande registre ou mémoire 16 bits dans la pile. |
PUSH reg/mem32 | FFh /6 | Empile le contenu d'une opérande registre ou mémoire 32 bits dans la pile. Il n'y a pas de préfixe en mode 64 bits. |
PUSH reg/mem64 | FFh /6 | Empile le contenu d'une opérande registre ou mémoire 64 bits dans la pile. |
PUSH reg16 | 50h +rw | Empile le contenu d'un registre 16 bits dans la pile. |
PUSH reg32 | 50h +rd | Empile le contenu d'un registre 32 bits dans la pile. Il n'y a pas de préfixe en mode 64 bits. |
PUSH reg64 | 50h +rq | Empile le contenu d'un registre 64 bits dans la pile. |
PUSH imm8 | 6Ah ib | Empile le contenu d'une valeur immédiate 8 bits dans la pile. |
PUSH imm16 | 68h iw | Empile le contenu d'une valeur immédiate 16 bits dans la pile. |
PUSH imm32 | 68h id | Empile le contenu d'une valeur immédiate 32 bits dans la pile. Il n'y a pas de préfixe en mode 64 bits. |
PUSH imm64 | 68h id | Empile le contenu d'une valeur immédiate 32 bits dans la pile. Il n'y a pas de préfixe en mode 64 bits. |
PUSH CS | 0Eh | Empile le contenu du registre CS dans la pile. Invalide en mode 64 bits. |
PUSH DS | 1Eh | Empile le contenu du registre DS dans la pile. Invalide en mode 64 bits. |
PUSH ES | 06h | Empile le contenu du registre ES dans la pile. Invalide en mode 64 bits. |
PUSH FS | 0Fh A0h | Empile le contenu du registre FS dans la pile. |
PUSH GS | 0Fh A8h | Empile le contenu du registre GS dans la pile. |
PUSH SS | 16h | Empile le contenu du registre SS dans la pile. Invalide en mode 64 bits. |
Exceptions
Message | Mode réel | Virtuel 8086 | Mode protégé | Description |
---|---|---|---|---|
#UD(Opcode invalide) | X | Les instructions «PUSH CS», «PUSH DS», «PUSH ES» ou «PUSH SS» sont exécutés en mode 64 bits. | ||
#SS(Pile) | X | X | X | Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
#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 | Un segment de données nulle est utilisé comme référence mémoire | |||
#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 = 7Voir également
Langage de programmation - Assembleur 80x86 - Instruction POP
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 826
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 413
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 197.
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 321 à 325.