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