RFLAGS
Le registre RFLAGS - aussi dit registre de drapeaux - est un registre spécifique des processeurs de la famille x86-64. Il est compatible avec les registres EFLAGS et FLAGS hérités des familles x86 et précédente.
Recherche sur Google Images :
![]() Source image : american-products.info Cette image est un résultat de recherche de Google Image. Elle est peut-être réduite par rapport à l'originale et/ou protégée par des droits d'auteur. |
Page(s) en rapport avec ce sujet :
- Registre de DRAPEAUX contient drapeaux comme portez le drapeau, drapeau... Les préfixes spéciaux permettent l'inclusion des instructions de 32 bits... bits a fait avant lui (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, DÉCHIRURE).... (source : worldlingo)
- . 5 Chiffrement et intégrité des données et des instructions....... du registre de drapeaux (eflags sur une architecture 32 bits ou rflags sur 64 bits), ... (source : )
Le registre RFLAGS - aussi dit registre de drapeaux - est un registre spécifique des processeurs de la famille x86-64 (64 bits). Il est compatible avec les registres EFLAGS et FLAGS hérités des familles x86 (32 bits) et précédente (16 bits).
Il sert à fixer et de connaître l'état du processeur à tout moment grâce aux divers bits qui le composent. Ce registre permet ainsi d'avoir à tout instant l'état résultant d'une instruction ayant été exécutée par le processeur, la majorité des instructions des processeurs x86 affectant ce registre.
L'état des différents bits (les drapeaux) du registre RFLAGS permet au processeur de prendre des décisions, par exemple au niveau des branchements conditionnels (sauts et boucles) ou après une opération arithmétique (retenue ou débordement, etc. ).
Vue d'ensemble du registre RFLAGS
Le registre RFLAGS est constitué de 64 bits et n'est disponible que sous les processeurs 64 bits (x86-64). Il est cependant compatible rétroactivement avec les registres EFLAGS (disponible sur les processeurs x86 32 bits) et FLAGS (disponible sur les processeurs 16 et 32 bits). Il se compose comme suit :
- RFLAGS : 64 bits, bits 63 à 0.
- EFLAGS : 32 bits, bits 31 à 0.
- FLAGS : 16 bits, bits 15 à 0.
En cas d'exécution en mode de compatibilité 32 bits (quand le processeur 64 bits exécute du code 32 bits) seul EFLAGS et FLAGS sont accessibles.
RFLAGS | |||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bits | 63.. 32 | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13.. 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Drapeaux | - | - | - | - | - | - | - | - | - | - | - | ID | VIP | VIF | AC | VM | RF | 0 | NT | IOPL | OF | DF | IF | TF | SF | ZF | 0 | AF | 0 | PF | 1 | CF |
Nota Bene : Les bits 63 à 32, 31 à 22, 15, 5, 3, 1 (en gris sur le tableau) sont des bits réservés, leur utilisation et fonctionnement est inconnu. Les bits 15, 5, 3, 1 ont une valeur fixe donnée dans le tableau ci-dessus.
L'on dit d'un drapeau qu'il est armé quand il est à 1 et désarmé quand il est à 0.
Catégories de drapeaux
On peut distinguer trois catégories différentes de drapeaux à l'intérieur du registre RFLAGS.
- Les drapeaux d'état.
- Le drapeau de contrôle.
- Les drapeaux dispositif.
Drapeaux d'état
Les bits 0, 2, 4, 6, 7 et 11 du registre RFLAGS indiquent les résultats d'opérations arithmétiques résultant d'instructions telles que ADD, DIV, MUL, SUB, etc.
- CF (bit 0) Carry Flag (Drapeau de retenue) : Ce drapeau est armé si une opération arithmétique génère une retenue sur le bit le plus significatif (bit de poids fort). Le drapeau est désarmé dans les autres cas. Ce drapeau indique ainsi une condition de débordement en arithmétique entière non signée. Il est aussi utilisé pour l'arithmétique en précision multiple.
- PF (bit 2) Parity Flag (Drapeau de parité) : Armé si l'octet de poids faible (octet le moins significatif) du résultat généré après une opération arithmétique contient un nombre pair de bits à 1. Le drapeau est désarmé dans les autres cas.
- AF (bit 4) Adjust Flag (Drapeau d'ajustement) : Armé si le résultat d'une opération arithmétique génère un résultat provoquant une retenue sur le troisième bit. Le drapeau est désarmé dans les autres cas. Ce drapeau n'est utile que dans l'utilisation du codage BCD.
- ZF (bit 6) Zero Flag (Drapeau zéro) : Armé si le résultat d'une opération arithmétique vaut zéro. Le drapeau est désarmé dans les autres cas.
- SF (bit 7) Sign Flag (Drapeau de signe) : Armé si le résultat d'une opération arithmétique possède un bit de poids fort (bit le plus significatif) à 1, indiquant ainsi un nombre signé. Le drapeau est désarmé dans les autres cas (indiquant envisageablement un résultat non signé, c'est-à-dire positif).
- OF (bit 11) Overflow Flag (Drapeau de débordement) : Armé si le résultat forme un nombre positif ou négatif (en excluant le bit de signe) ne pouvant tenir dans l'opérande de destination. Le drapeau est désarmé dans les autres cas. Ce drapeau indique une condition de débordement pour les opérations arithmétiques signées sur les entiers.
Instructions affectées par les drapeaux d'état
Les instructions conditionnelles suivantes utilisent un ou plusieurs des drapeaux d'état comme condition pour les branchements conditionnels, l'armement d'octets ou les conditions de fin de boucle :
- Jcc : Jump on condition code cc (par exemple les instructions JE, JO, JNC, etc. ).
- SETcc : Set on condition code cc (par exemple les instructions SETNE, SETNO, etc. ).
- LOOPcc : Loop on condition code cc (par exemple les instructions LOOPE, LOOPNZ, etc. )
- CMOVcc : Conditional move on condition code cc (par exemple les instructions CMOVNZ, CMOVNO, etc. )
Instructions modifiant les drapeaux d'état
Seul le drapeau CF peut être modifié directement via certaines instructions. Ces instructions sont les suivantes :
Les instructions suivantes, œuvrant sur des bits, peuvent copier un bit spécifique directement dans le drapeau CF :
- BT
- BTC
- BTR
- BTC
Drapeau de contrôle
Le bit 10 du registre RFLAGS est l'unique drapeau de contrôle (aussi nommé drapeau de direction).
- DF (bit 10) Direction Flag (Drapeau de direction) : Ce drapeau est utilisé conjointement avec les instructions opérant sur les chaînes de caractères. Quand le drapeau DF est armé, les adresses des chaînes de caractères sont auto décrémentées (allant ainsi des adresses les plus hautes vers les adresses les plus basses). Quand le drapeau est désarmé, les adresses des chaînes de caractères sont auto incrémentées (allant des adresses les plus basses vers les adresses les plus hautes. Aucun résultat d'opération ne permet d'armer ou de désarmer le drapeau de direction. Seules deux instructions permettent de spécifier explicitement son état.
Instructions affectées par le drapeau de contrôle
Les instructions œuvrant sur les chaînes de caractères sont les seules instructions affectées par le drapeau de direction. Ces instructions sont les suivantes :
- CMPS
- LODS
- MOVS
- SCAS
- STOS
Instructions modifiant le drapeau de contrôle
Les instructions servant à modifier directement le drapeau de direction sont les instructions suivantes :
- STD (pour Set Direction Flag) : Arme le drapeau de direction.
- CLD (pour Clear Direction Flag) : Désarme le drapeau de direction.
Les drapeaux dispositif
Les drapeaux dispositif du registre RFLAGS sont contrôlés par le système d'exploitation ou les opérations de surveillance dispositif. En temps normal un programme applicatif ne devrait pas modifier l'état de ces drapeaux. Les bits 12 et 13 ne sont pas reconnus comme deux drapeaux, mais comme un champ de 2 bits (le champ IOPL).
- TF (bit 8) Trap Flag (Drapeau de trappe) : Quand il est armé, ce drapeau permet le débogage en mode pas à pas, c'est-à-dire instruction par instruction. Quand il est désarmé, le mode pas à pas est inopérant (fonctionnement normal).
- IF (bit 9) Interrupt Flag (Drapeau d'interruption) : Ce drapeau contrôle la façon dont le processeur répond aux requêtes d'interruptions masquables (c'est-à-dire désactivables). Quand il est armé, le processeur peut répondre à l'ensemble des interruptions, dans le cas opposé (drapeau IF désarmé), le processeur ne pourra répondre qu'aux interruptions non masquables.
- IOPL (bits 12 et 13) Input / Output privilege level field (Champ de niveau de privilège d'entrée et de sortie) : Ce champ indique le niveau de privilège en entrée/sortie (E/S) du programme ou de la tâche courante. Le niveau de privilège courant du programme ou de la tâche en cour doit être égal ou inférieur au niveau de privilège d'E/S pour accéder à l'espace d'adressage. Ce champ ne peut être modifié qu'avec un niveau de privilège égal à 0 (niveau de privilège le plus haut). Ce concept de niveaux de privilèges est implémenté au travers des anneaux de protection.
- NT (bit 14) Nested task Flag (Drapeau de tâche chaînée) : Ce drapeau contrôle l'enchaînement des tâches interrompues et nommées. Il indique ainsi, quand il est armé, si la tâche courante est liée à une tâche parent (la tâche qui s'exécutait jusque là) via l'instruction CALL ou par le biais d'une interruption. Quand il est désarmé, ce drapeau indique simplement que la tâche courante n'a pas de tâche parente.
- RF (bit 16) Resume Flag (Drapeau de redémarrage) : Ce drapeau contrôle la réponse du processeur aux exceptions de débogage. Il assure surtout que le débogage en pas à pas (voir drapeau TF) n'intervient qu'une seule fois par instruction.
- VM (bit 17) Virtual-8086 mode Flag (Drapeau de mode virtuel 8086) : Quand ce drapeau est armé le processeur est en mode virtuel 8086. Quand il est désarmé, le processeur revient en mode protégé.
- AC (bit 18) Alignment Check Flag (Drapeau de vérification d'alignement) : Ce drapeau, quand il est armé, assure une vérification d'alignement des références mémoire. Quand il est désarmé, aucune vérification d'alignement n'est effectuée. Ce drapeau nécessite d'armer conjointement le bit AM du registre de contrôle CR0.
- VIF (bit 19) Virtual Interrupt Flag (Drapeau d'interruption virtuelle) : Ce drapeau est une image virtuelle du drapeau IF. Il est utilisé en conjonction avec le drapeau VIP (bit 20).
- VIP (bit 20) Virtual Interrupt Pending Flag (Drapeau d'interruption virtuelle en attente) : Quand il est armé ce drapeau indique qu'une interruption est en attente. Quand il est désarmé ce drapeau indique qu'aucune interruption n'est en attente. Seuls les programmes peuvent armer ou désarmer ce drapeau, le processeur ne fait que le lire. À utiliser conjointement avec le drapeau VIF (bit 19).
- ID (bit 21) Identification Flag (Drapeau d'indentification) : Si un programme à la possibilité d'armer ou de désarmer ce drapeau, cela indique que le processeur supporte l'utilisation de l'instruction CPUID.
Instructions affectées par les drapeaux dispositif
En général les drapeaux dispositif ne changent pas la manière dont s'exécutent les instructions, ils n'affectent que le fonctionnement général du dispositif d'exploitation. Cependant, le champ IOPL peut par exemple permettre d'utiliser certaines instructions à différents niveaux de protections.
Instructions modifiant les drapeaux dispositif
Seul le champ IOPL (bits 12 et 13) peut être affecté directement par des instructions. Ces instructions ne sont utilisables que si le niveau de privilège est le plus élevé (niveau 0) :
- IRET
- POPF
Instructions affectant RFLAGS
Outre les instructions permettant d'armer ou de désarmer un seul bit (voire deux pour le champ IOPL) du registre RFLAGS, certaines instructions permettent de lire voir d'écrire tout ou partie du registre RFLAGS. Ces instructions sont :
- LAHF : les bits 0 à 15 de RFLAGS (c'est-à-dire FLAGS) sont mis dans le registre AH (opération de lecture).
- SAHF : le contenu du registre AH est positionné dans les bits 0 à 15 de RFLAGS (opération d'écriture).
- POPF : le mot de 16 bits aujourd'hui sur le haut de la pile est positionnée dans les bits 0 à 15 de RFLAGS (opération d'écriture) - en mode 64 bits, l'instruction se comporte comme POPFQ.
- POPFD : le double mot (32 bits) aujourd'hui en haut de la pile est positionné dans RFLAGS (opération d'écriture) - en mode 64 bits, l'instruction se comporte comme POPFQ.
- POPFQ : le quadruple mot (64 bits) aujourd'hui en haut de la pile est positionné dans RFLAGS (opération d'écriture).
- PUSHF : les bits 0 à 15 de RFLAGS sont poussés sur la pile (opération de lecture) - en mode 64 bits, l'instruction se comporte comme PUSHFQ.
- PUSHFD : le contenu de RFLAGS (32 bits) est poussé sur la pile (opération de lecture) - en mode 64 bits, l'instruction se comporte comme PUSHFQ.
- PUSHFQ : le contenu de RFLAGS (64 bits) est poussé sur la pile (opération de lecture).
Exemple d'utilisation de RFLAGS
N. B : Ces différents codes ne sont exécutables que sur un processeur de la famille x86-64 (64 bits).
Langages C ou C++
- Microsoft Visual C++
#include <iostream> int main(void) { unsigned long long var_RFLAGS = 0; __asm{ PUSHFQ; // pousse les 64 bits de RFLAGS sur la pile POP var_RFLAGS; // met RFLAGS dans la variable var_RFLAGS } std::cout << std::hex << "Valeur du registre RFLAGS : 0x" << var_RFLAGS; return 0; }
Recherche sur Amazone (livres) : |
Voir la liste des contributeurs.
La version présentée ici à été extraite depuis cette source le 07/04/2010.
Ce texte est disponible sous les termes de la licence de documentation libre GNU (GFDL).
La liste des définitions proposées en tête de page est une sélection parmi les résultats obtenus à l'aide de la commande "define:" de Google.
Cette page fait partie du projet Wikibis.