Section courante

A propos

Section administrative du site

Assembleur 80x86

RET

INTEL 8088+ Return

Syntaxe

RET
RET immédiat

Paramètres

Nom Description
immédiat Ce paramètre permet d'indiquer une valeur immédiatement correspondant à une addition a effectuer dans la pile, afin de retirer des valeurs empilés par l'instruction PUSH par exemple.

Description

Cette instruction permet de quitter une procédure. Ainsi, elle indique au microprocesseur qu'il doit désempiler la valeur du pointeur d'instructions contenu dans la pile et la copier dans les registres CS:IP pour une procédure de type FAR ou dans le registre IP pour une procédure de type NEAR. Ensuite, l'exécution du code se poursuit à l'instruction suivant l'instruction «CALL».

Algorithme

SI instruction = RETN ALORS
   SI opérande de taille = 32 bits ALORS
      SI les 12 octets du haut de la pile sont en dehors de la limite de la pile ALORS
         EXCEPTION #SS(0)
      FIN SI
      EIP ← Pop()
   SINON
      SI les 6 octets du haut de la pile sont en dehors de la limite de la pile ALORS
         EXCEPTION #SS(0)
      FIN SI
      tempEIP ← Pop()
      tempEIP ← tempEIP ∩ 0000FFFFh
      SI tempEIP n'est pas dans limite du segment de code ALORS
         EXCEPTION #GP(0)
      FIN SI
      EIP ← tempEIP
   FIN SI
   SI instruction a une opérande immédiate ALORS
      SI taille de l'adresse de la pile = 32 bits ALORS
         ESP ← ESP + SRC
      SINON
         SP ← SP + SRC
      FIN SI
   FIN SI
FIN SI

SI ((PE = 0) OU (PE = 1 ET VM = 1)) ET instruction RETF ALORS
   SI taille de l'opérande = 32 bits ALORS
      SI les 12 octets du haut de la pile sont en dehors de la limite de la pile ALORS
         EXCEPTION #SS(0)
      FIN SI
      EIP ← Pop()
      CS ← Pop()
   SINON
      SI les 6 octets du haut de la pile sont en dehors de la limite de la pile ALORS
         EXCEPTION #SS(0)
      FIN SI
      tempEIP ← Pop()
      tempEIP ← tempEIP ∩ 0000FFFFh
      SI tempEIP n'est pas dans limite du segment de code ALORS
         EXCEPTION #GP(0)
      FIN SI
      EIP ← tempEIP
      CS ← Pop()
   FIN SI
   SI instruction a une opérande immédiate ALORS
      SP ← SP + (SRC ∩ FFFFh)
   FIN SI
FIN SI

SI (PE = 1 ET VM = 0) ET instruction RETF ALORS
   SI taille de l'opérande = 32 bits ALORS
      SI le deuxième double mot de la pile est en dehors de la limite de la pile ALORS
         EXCEPTION #SS(0)
      FIN SI
   FIN SI
   SI sélecteur de code de retour est nulle ALORS
      EXCEPTION GP(0)
   FIN SI
   SI adresse du sélecteur de retour de code segment est en dehors des limites de la table de descripteur ALORS
      EXCEPTION GP(Sélecteur)
   FIN SI
   Demande le descripteur avec le point du sélecteur de segment de code de retour du descripteur de table
   SI descripteur de retour de code segment n'est pas un code segment ALORS
      EXCEPTION #GP(Sélecteur)
   FIN SI
   SI selecteur de retour de segment de code RPL < CPL ALORS
      EXCEPTION #GP(Sélecteur)
   FIN SI
   SI descripteur retour de code de segment retour est conforme ET retour de segment de code DPL > sélecteur de retour de segment de code RPL ALORS
      EXCEPTION #GP(Sélecteur)
   FIN SI
   SI descripteur de retour segment de code n'est pas présent ALORS
      EXCEPTION #NP(Sélecteur)
   FIN SI
   SI sélecteur de retour de segment de code RPL > CPL ALORS
      ALLER A RETURN-OUTER-PRIVILEGE-LEVEL
   SINON
      ALLER A RETURN-TO-SAME-PRIVILEGE-LEVEL
   FIN SI
FIN SI

RETURN-SAME-PRIVILEGE-LEVEL:
   SI l'instruction de pointeur n'est pas à l'intérieur de la limite de segment de code ALORS
      EXCEPTION #GP(0)
   FIN SI
   SI taille de l'opérande = 32 bits ALORS
      EIP ← Pop()
      CS ← Pop()
      ESP ← ESP + SRC
   SINON
      EIP ← Pop()
      EIP ← EIP ∩ 0000FFFFh
      CS ← Pop()
      ESP ← ESP + SRC
   FIN SI

RETURN-OUTER-PRIVILEGE-LEVEL:
   SI (16 + SRC) octets du haut de la pile sont en dehors de la limite de la pile ET taille de l'opérande = 32 bits OU (8 + SRC) octets du haut de la pile sont en dehors de la limite de la pile ET taille de l'opérande = 16 ALORS
      EXCEPTION #SS(0)
   FIN SI
   Lecture du sélecteur de retour de segment
   SI sélecteur de segment de pile n'est pas nulle ALORS
      EXCEPTION #GP(0)
   FIN SI
   SI index de retour du sélecteur de segment n'est pas dans les limites du descripteur de table ALORS
      EXCEPTION #GP(Sélecteur)
   FIN SI
   Lecture du descripteur de segment pointant sur le retour de sélecteur de segment
   SI sélecteur de segment de pile RPL ≠ RPL du retour de sélecteur de segment de code OU segment de pile n'est pas dans une segment de données écrivable OU descripteur de segment de pile DPL <> RPL de retour de sélecteur de segment de code ALORS
      EXCEPTION #GP(Sélecteur)
   FIN SI
   SI segment de pile n'est pas présent ALORS
      EXCEPTION #SS(Sélecteur de segment de pile)
   FIN SI
   SI pointeur de retour d'instruction n'est pas dans la limite de segment de code ALORS
      EXCEPTION #GP(0)
   FIN SI
   CPL ← Retour du sélecteur de segment de code du RPL
   SI taille de l'opérande = 32 bits ALORS
      EIP ← Pop()
      CS ← Pop()
      CS(RPL) ← CPL
      ESP ← ESP + SRC
      tempESP ← Pop()
      tempSS ← Pop()
      ESP ← tempESP
      SS ← tempSS
   SINON
      EIP ← Pop()
      EIP ← EIP ∩ 0000FFFFh
      CS ← Pop()
      CS(RPL) ← CPL
      ESP ← ESP + SRC
      tempESP ← Pop()
      tempSS ← Pop()
      ESP ← tempESP
      SS ← tempSS
   FIN SI
   BOUCLE POUR chaque registre de segment (ES, FS, GS et DS) FAIRE
      SI registre de segment pointe sur des données ou segment de code est non-conforme ET CPL > descripteur de segment DPL ALORS
         Sélecteur de segment ← 0
      FIN SI
   FIN BOUCLE POUR
   BOUCLE POUR chaque registre de segment ES, FS, GS et DS FAIRE
      SI index de sélecteur de segment est en dehors de la limite du descripteur de table OU descripteur de segment indique que le segment n'est pas dans des données OU lecteur de segment de code si le segment de données OU segment de code non-conforme ET descripteur de segment DPL < CPL OU RPL du sélecteur de segment de code ALORS
         Sélecteur de registre de segment ← Sélecteur nulle
      FIN SI
   FIN BOUCLE POUR
   ESP ← ESP + SRC

Mnémonique

Instruction Opcode Description
RET C3h Retour d'un appel de procédure court.
RET imm16 C2h iw Retour d'un appel de procédure court et spécifie le nombre d'octets à retirer de la pile.
RET CBh Retour d'un appel de procédure long.
RET imm16 CAh iw Retour d'un appel de procédure long et spécifie le nombre d'octets à retirer de la pile.

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
#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
#NP(Sélecteur)     X Le retour de segment de code est marqué non présent.
#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(Sélecteur)     X Le sélecteur de code de retour est un sélecteur nulle.
    X Le sélecteur de retour de pile et de mode de retour n'est pas un mode 64 bits ou CPL vaut 3.
    X Le code de retour ou le descripteur de pile dépasse la limite du descripteur de table.
    X Le code de retour ou le bit TI du sélecteur de pile est fixé mais le sélecteur LDT n'est pas un sélecteur nulle.
    X Le descripteur de segment pour le code retour n'est pas un segment de code.
    X Le RPL du sélecteur du retour de segment de code est inférieur au CPL.
    X Le retour du segment de code n'est pas conforme et le sélecteur de segment DPL n'est pas égale au RPL du sélecteur de segment de code.
    X Le retour du segment de code est conforme et le sélecteur de segment DPL est supérieur au RPL du sélecteur de segment de code.
    X Le descripteur de segment pour le retour de pile n'est pas dans segment de données écrivable.
    X Le descripteur de segment de pile DPL n'est pas égale au RPL du sélecteur de retour de segment de code.
    X Le sélecteur de segment de pile RPL n'est pas égale au RPL du retour de sélecteur de segment de code.
#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é

Voir également

Langage de programmation - Assembleur 80x86 - Instruction CALL
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 830
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 414
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 207.
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 366 à 376.

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