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 :

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.

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.

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 :

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, travaillant sur des bits, peuvent copier un bit spécifique directement dans le drapeau CF :

Drapeau de contrôle

Le bit 10 du registre RFLAGS est le seul drapeau de contrôle (aussi appelé drapeau de direction).

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 :

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 :

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).

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) :

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 :

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++

#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

Articles connexes

Liens

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