Assembleur 80x86 | ENTER |
---|---|
INTEL 80186+ | Enter |
Syntaxe
ENTER taille,niveau |
Description
Cette instruction permet de gérer des langages de programmation de haut niveau. La commande ENTER permet de créer les structures de paramètres nécessaires aux procédures des langages de haut niveau (Pascal, C, C++, C# (C Sharp),...). taille indique le nombre d'octets devant être réserves dans la pile pour la procédure. niveau indique le nombre niveau d'imbrication de la procédure, c'est-à-dire que le nombre de structures de paramètres devant être imbriquées dans la pile.
Remarques
- L'instruction ENTER n'est disponible qu'à partir des microprocesseurs 80186 ou postérieur.
- Le niveau d'imbrication détermine le nombre de pointeurs de cadre copiés dans la «zone d'affichage» du nouveau cadre de pile à partir du cadre précédente. La taille par défaut du pointeur du cadre est l'attribut StackAddrSize, mais peut être remplacé en utilisant le préfixe 66h. Ainsi, l'attribut de taille d'opérande détermine la taille de chaque pointeur de cadre étant copié dans le cadre de pile et les données transférées du registre SP, ESP et RSP dans le registre BP, EBP et RBP.
- Les instructions ENTER et leur instruction compagnon LEAVE sont fournies pour prendre en charge les langages structurés en blocs. L'instruction ENTER (lorsqu'elle est utilisée) est généralement la première instruction d'une procédure et permet de définir un nouveau cadre de pile pour une procédure. L'instruction LEAVE est ensuite utilisée à la fin de la procédure (juste avant l'instruction RET) pour libérer le cadre de la pile.
- Si le niveau d'imbrication est 0, le microprocesseur pousse le pointeur de cadre du registre BP, EBP et RBP sur la pile, copie le pointeur de pile actuel du registre SP, ESP et RSP dans le registre BP, EBP, RBP et charge le registre SP, ESP et RSP avec la valeur actuelle du pointeur de pile moins la valeur dans l'opérande de taille. Pour des niveaux d'imbrication de 1 ou plus, le microprocesseur place des pointeurs de cadre supplémentaires sur la pile avant d'ajuster le pointeur de pile. Ces pointeurs de cadre supplémentaires fournissent à la procédure appelée des points d'accès à d'autres trames imbriquées de la pile.
- L'instruction ENTER provoque une erreur de page chaque fois qu'une écriture utilisant la valeur finale du pointeur de pile (dans le segment de pile actuel) le ferait.
- En mode 64 bits, la taille de l'opération par défaut est de 64 bits. La taille de l'opération 32 bits ne peut pas être codée. L'utilisation du préfixe 66h change la taille de l'opérande du pointeur du cadre en 16 bits.
- Lorsque le préfixe 66h est utilisé et que l'attribut de taille d'opérande est inférieur à StackAddrSize, le logiciel est responsable des éléments suivants : L'instruction compagnon LEAVE doit également utiliser le préfixe 66h, la valeur dans le registre RBP, EBP avant d'exécuter «66H ENTER» doit être comprise dans la même région de 16 Ko du pointeur de pile actuel (RSP/ESP), de sorte que la valeur de RBP/EBP après «66H ENTER» reste une adresse valide dans la pile. Cette situation garantit que «66h LEAVE» peut restaurer 16 bits de données à partir de la pile.
- Cette instruction est simplement une instruction de raccourci pour le cadre de la pile d'un programme, ainsi les instructions suivants :
sont équivalents à (en mode 32 bits) :
ou de ceci (en mode 16 bits) :
Algorithme
MODULE ENTER(Size,NestingLevel) NestingLevel ← NestingLevel ∩ 1Fh SI OperandSize = 64 bits ALORS PUSH RBP FrameTemp RSP SINON SI OperandSize = 32 bits ALORS PUSH EBP FrameTemp ESP SINON PUSH BP FrameTemp SP FIN SI SI NestingLevel > 0 ALORS BOUCLE POUR i ← 1 JUSQU'A (NestingLevel - 1) FAIRE SI OperandSize = 64 ALORS RBP ← RBP - 4 PUSH [RBP] SINON SI OperandSize = 32 ALORS SI StackSize = 32 bits ALORS EBP ← EBP - 4 PUSH [EBP] SINON BP ← BP - 4 PUSH [BP] FIN SI SINON SI StackSize = 32 bits ALORS EBP ← EBP - 2 PUSH [EBP] SINON BP ← BP - 2 PUSH [BP] FIN SI FIN SI FIN BOUCLE POUR SI OperandSize = 64 ALORS PUSH FrameTemp SINON OperandSize = 32 ALORS PUSH FrameTemp SINON PUSH FrameTemp FIN SI FIN SI SI StackSize = 64 bits ALORS RBP ← FrameTemp RSP ← RSP - Size SINON SI StackSize = 32 bits ALORS EBP ← FrameTemp ESP ← EBP - Size SINON BP ← FrameTemp SP ← BP - Size FIN SI |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
ENTER imm16, 0 | C8h iw 00h | Crée une procédure de cadre de pile |
ENTER imm16, 1 | C8h iw 01h | Crée un cadre de pile pour une procédure |
ENTER imm16, imm8 | C8h iw ib | Crée un cadre de pile pour une procédure |
Exceptions
Message | Mode réel | Virtuel 8086 | Mode protégé | Description |
---|---|---|---|---|
#SS(Pile) | X | X | X | Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
#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
L'exemple suivant permet de créer un cadre de pile pour une procédure :
- ENTER 12, 0
Voir également
Instruction assembleur 80x86 - Instruction LEAVE
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 811
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 111 à 112.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Edition Intel, Mars 2010, Publication No. 253666-034US, page 384 à 390.