Section courante

A propos

Section administrative du site

Assembleur 80x86

RETF

INTEL 8088+ Return Far

Syntaxe

RETF
RETF 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 ayant lieu avec un appel long (FAR CALL). 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. Ensuite, l'exécution du code se poursuit à l'instruction suivant l'instruction «CALL».

Algorithme

SI ((PE = 0) OU (PE = 1 ET VM = 1)) 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) 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 sélecteur 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
RETF CBh Retour d'un appel de procédure long.
RETF 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
#NP(Sélecteur)     X Le retour de segment de code 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
#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 - Assembleur 80x86 - Instruction RET
Langage de programmation - Structure de données - Structures récursives linéaires - Pile

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