Accueil🇫🇷Chercher

RFLAGS

Le registre RFLAGS - aussi dit registre de drapeaux - est le registre d'état 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 permet de fixer et de connaître l'état du processeur à tout moment grâce aux différents 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 plupart 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 toutefois 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 (lorsque le processeur 64 bits exécute du code 32 bits) seul EFLAGS et FLAGS sont accessibles.

Les 64 bits du registre RFLAGS et les noms de ses drapeaux.
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é lorsqu'il est à 1 et désarmé lorsqu'il est à 0.

Catégories de drapeaux

On distingue trois catégories différentes de drapeaux à l'intérieur du registre RFLAGS.

  • Les drapeaux d'Ă©tat.
  • Le drapeau de contrĂ´le.
  • Les drapeaux système.

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Ă© nĂ©gatif. Le drapeau est dĂ©sarmĂ© dans les autres cas (indiquant possiblement un rĂ©sultat non signĂ©, c'est-Ă -dire positif).
  • OF (bit 11) Overflow Flag (Drapeau de dĂ©bordement) : ArmĂ© si le rĂ©sultat constitue 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 :

  • CMC (pour Complement Carry Flag) : Inverse l'Ă©tat du drapeau de retenue.
  • CLC (pour Clear Carry Flag): DĂ©sarme le drapeau de retenue.
  • STC (pour Set Carry Flag) : Arme le drapeau de retenue.

Les instructions suivantes, travaillant 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 le seul drapeau de contrôle (aussi appelé 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. Lorsque 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). Lorsque 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 travaillant sur les chaînes de caractères ou d'octets sont les seules instructions affectées par le drapeau de direction. Ces instructions sont les suivantes :

  • CMPS (pour Compare Strings) : Compare deux chaĂ®nes.
  • LODS (pour Load String) : Charge le prochain mot de la chaĂ®ne dans le registre EAX.
  • MOVS (pour Move Strings) : Transfère un mot de la chaĂ®ne source Ă  la chaĂ®ne cible.
  • SCAS (pour Scan String) : Compare le mot du registre EAX avec le prochain mot de la chaĂ®ne.
  • STOS (pour Store String) : Stocke le mot du registre EAX dans le prochain mot de la chaĂ®ne.

La taille du mot utilisé par ces instructions est un nombre fixe d'octets dépendant du suffixe utilisé (B pour Byte = 1 octet, W pour Word = 2 octets, D pour Double word = 4 octets...).

Instructions modifiant le drapeau de contrĂ´le

Les instructions permettant de modifier directement le drapeau de direction sont les instructions suivantes :

  • CLD (pour Clear Direction Flag) : DĂ©sarme le drapeau de direction.
  • STD (pour Set Direction Flag) : Arme le drapeau de direction.

Les drapeaux système

Les drapeaux système du registre RFLAGS sont contrôlés par le système d'exploitation ou les opérations de surveillance système. En temps normal un programme applicatif ne devrait pas modifier l'état de ces drapeaux. Les bits 12 et 13 ne sont pas considérés comme deux drapeaux, mais comme un champ de 2 bits (le champ IOPL).

  • TF (bit 8) Trap Flag (Drapeau de trappe) : Lorsqu'il est armĂ©, ce drapeau permet le dĂ©bogage en mode pas Ă  pas, c'est-Ă -dire instruction par instruction. Lorsqu'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). Lorsqu'il est armĂ©, le processeur peut rĂ©pondre Ă  toutes les interruptions, dans le cas contraire (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 cours 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 appelĂ©es. Il indique ainsi, lorsqu'il est armĂ©, si la tâche courante est liĂ©e Ă  une tâche parent (la tâche qui s'exĂ©cutait auparavant) via l'instruction CALL ou par le biais d'une interruption. Lorsqu'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 notamment 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) : Lorsque ce drapeau est armĂ© le processeur est en mode virtuel 8086. Lorsqu'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, lorsqu'il est armĂ©, assure une vĂ©rification d'alignement des rĂ©fĂ©rences mĂ©moire. Lorsqu'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) : Lorsqu'il est armĂ© ce drapeau indique qu'une interruption est en attente. Lorsqu'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 a 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 système

D'une manière générale les drapeaux système ne changent pas la manière dont s'exécutent les instructions, ils n'affectent que le fonctionnement général du système d'exploitation. Toutefois, le champ IOPL peut par exemple permettre d'utiliser certaines instructions à différents niveaux de protections.

Instructions modifiant les drapeaux système

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 Ă  7 de RFLAGS sont mis dans le registre AH (opĂ©ration de lecture).
  • SAHF : le contenu du registre AH est placĂ© dans les bits 0 Ă  7 de RFLAGS (opĂ©ration d'Ă©criture).
  • POPF : le mot de 16 bits actuellement sur le haut de la pile est placĂ©e dans les bits 0 Ă  15 de RFLAGS (opĂ©ration d'Ă©criture) - en mode 64 bits, l'instruction nĂ©cessite l'operand size prefix (66h) pour opĂ©rer sur 16 bits.
  • POPFD : le double mot (32 bits) actuellement en haut de la pile est placĂ© dans RFLAGS (opĂ©ration d'Ă©criture) - en mode 64 bits, l'instruction se comporte comme POPFQ.
  • POPFQ : le quadruple mot (64 bits) actuellement en haut de la pile est placĂ© 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 nĂ©cessite l'operand size prefix (66h) pour opĂ©rer sur 16 bits.
  • 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;
}

Voir aussi

Liens

EFLAGS : http://www.lifl.fr/~sedoglav/Archi/TP022.html

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.