Programmation Assembleur x86/Les flags

Un livre de Wikibooks.

Programmation Assembleur x86

Les flags (ou indicateurs en français) sont des bits stockés dans un registre spécifique nommé F, FLAGS ou EFLAGS. Chaque bit correspond à différents tests sur les derniers opérandes utilisés durant la dernière opération effectuée (opération arithmétique, comparaison, ...).

L'opération de comparaison de deux valeurs effectue une soustraction entre les deux opérandes sans stocker le résultat. Le positionnement des indicateurs donne le résultat de la comparaison.

Ces différents indicateurs ont tous un nom court de deux lettres dont la deuxième est F signifiant Flag.

Sections

[modifier] Le registre F

Le registre EFLAGS (extended flags) contient un mot de 32 bits qui sont les suivants :

bit   31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16
flag   0   0   0   0   0   0   0   0   0   0  ID  VIP VIF AC  VM  RF
bit   15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
flag   0  NT   IOPL   OF  DF  IF  TF  SF  ZF   0  AF   0  PF   1  CF

Le registre FLAGS correspond au 16 bits de poids faibles du registre EFLAGS.

[modifier] Zero Flag (ZF)

Cet indicateur est positionné à 1 si les deux opérandes utilisés sont égaux, sinon positionné à 0. Son nom vient de la différence nulle entre les deux opérandes.

[modifier] Overflow Flag (OF)

Cet indicateur est positionné à 1 si le dernier résultat a débordé de la taille du registre,sinon à 0 .

[modifier] Carry Flag (CF)

Cet indicateur est positionné à 1 si la dernière opération a générée une retenue (mode non signé),sinon à 0 .

[modifier] Auxiliary carry Flag (AF)

Cet indicateur est positionné à 1 si la dernière opération a générée une retenue du bit numéro 3 vers le bit numéro 4, à 0 sinon.

[modifier] Sign Flag (SF)

Cet indicateur est positionné à 1 si la dernière opération a générée un résultat négatif, à 0 s'il est positif ou nul.

[modifier] Parity Flag (PF)

Cet indicateur est positionné à 1 si la dernière opération a générée un résultat impair, à 0 s'il est pair.

[modifier] Interrupt Flag (IF)

Cet indicateur est positionné à 1 si les interruptions sont autorisées, à 0 sinon.

[modifier] Direction Flag (DF)

Cet indicateur est positionné à 1 si le transfert de données se fait en décrémentant les offsets, à 0 sinon (incrémentation des offsets). Cet indicateur modifie le comportement des instructions REP* et LOOP*.

[modifier] Trap Flag (TF)

Cet indicateur est positionné à 1 pour exécuter les instructions en mode pas à pas. Avant chaque instruction, l'interruption 1 (INT 1) est appelée. Cette interruption est utilisée par les débogueurs.


[modifier] Empiler et dépiler les indicateurs

Le registre des indicateurs est copié sur la pile (empilé) par l'instruction PUSHF, et lu depuis la pile (dépilé) par l'instruction POPF.