Porte drapeau - Carry flag

Dans les processeurs informatiques, l' indicateur de report (généralement indiqué par l' indicateur C ) est un seul bit dans un registre d'état du système / registre d' indicateur utilisé pour indiquer quand un report ou un emprunt arithmétique a été généré à partir du bit d' unité arithmétique et logique (ALU) le plus significatif. position. L'indicateur de retenue permet d'ajouter/soustraire des nombres supérieurs à une seule largeur d'ALU en transportant (ajoutant) un chiffre binaire d'une addition/soustraction partielle à la position de bit la moins significative d'un mot plus significatif. Il est également utilisé pour étendre les décalages de bits et les rotations de manière similaire sur de nombreux processeurs (parfois via un indicateur X dédié ). Pour les opérations soustractives, deux conventions (opposées) sont utilisées car la plupart des machines définissent l'indicateur de retenue sur l'emprunt tandis que certaines machines (telles que le 6502 et le PIC ) réinitialisent à la place l'indicateur de retenue sur l'emprunt (et vice versa).

Les usages

L'indicateur de retenue est affecté par le résultat de la plupart des instructions arithmétiques (et généralement sur plusieurs bits) et est également utilisé comme entrée pour bon nombre d'entre elles. Plusieurs de ces instructions ont deux formes qui lisent ou ignorent le report. Dans les langages assembleur, ces instructions sont représentées par des mnémoniques tels que ADD/SUB, ADC/SBC( ADD/SUBy compris carry), SHL/SHR( bit shifts ), ROL/ROR(bit rotates), RCR/RCL(rotate through carry), et ainsi de suite. L'utilisation de l'indicateur de retenue de cette manière permet des opérations d' ajout, de soustraction, de décalage et de rotation de plusieurs mots .

Un exemple est ce qui se passe si l'on additionne 255 et 255 en utilisant des registres de 8 bits . Le résultat devrait être 510 qui est la valeur de 9 bits 111111110en binaire. Les 8 bits les moins significatifs toujours stockés dans le registre seraient 11111110binaires (254 décimaux) mais comme il y a un report du bit 7 (le huit bits), le report est défini, indiquant que le résultat nécessite 9 bits. Le résultat valide sur 9 bits est la concaténation du drapeau de retenue avec le résultat.

Pour une taille d'ALU x86 de 8 bits, une interprétation de complément à deux de 8 bits, l'opération d'addition 11111111+ 11111111aboutit à 111111110, Carry_Flagset, Sign_Flagset et Overflow_Flagclear.

Si 11111111représente l'entier signé en complément à deux -1 ( ADD al,-1), alors l'interprétation du résultat est -2 car elle Overflow_Flagest claire et Carry_Flagest ignorée. Le signe du résultat est négatif, car Sign_Flagest fixé. 11111110est la forme complément à deux de l'entier signé -2.

Si 11111111représente un nombre binaire entier non signé 255 ( ADD al,255), alors l'interprétation du résultat serait 254, ce qui n'est pas correct, car le bit le plus significatif du résultat est entré dans le Carry_Flag, qui ne peut donc pas être ignoré. Le Overflow_Flaget le Sign_Flagsont ignorés.

Un autre exemple peut être un registre à 8 bits avec le modèle de bits 01010101et le drapeau de retenue définis ; si nous exécutons une instruction de rotation à gauche jusqu'au report , le résultat serait 10101011avec le drapeau de report effacé car le bit le plus significatif (bit 7) a été tourné dans le report tandis que le report a été pivoté dans le bit le moins significatif (bit 0).

Les premiers microprocesseurs Intel 4004 et Intel 8008 avaient des instructions spécifiques pour définir et réinitialiser explicitement l'indicateur de portage. Cependant, les derniers Intel 8080 (et Z80 ) n'incluaient pas d'opcode de report de réinitialisation explicite car cela pouvait être fait aussi rapidement via l'une des instructions ET, OU ou XOR au niveau du bit (qui n'utilisent pas l'indicateur de report).

Le drapeau de retenue est également souvent utilisé à la suite d'instructions de comparaison, qui sont généralement mises en œuvre par des opérations soustractives, pour permettre de décider laquelle des deux valeurs comparées est inférieure (ou supérieure ou égale) à l'autre. Les instructions de branchement qui examinent le drapeau de retenue sont souvent représentées par des mnémoniques tels que BCCet BCSpour se brancher si la retenue est libre, ou se brancher si la retenue est définie respectivement. Lorsqu'il est utilisé de cette manière, le drapeau de retenue fournit un mécanisme pour comparer les valeurs en tant qu'entiers non signés. Cela contraste avec l' indicateur de débordement qui fournit un mécanisme pour comparer les valeurs en tant que valeurs entières signées.

Vs. drapeau d'emprunt

Alors que l'indicateur de retenue est bien défini pour l'addition, il existe deux manières courantes d'utiliser l'indicateur de retenue pour les opérations de soustraction.

Le premier utilise le bit comme indicateur d'emprunt, le définissant si a < b lors du calcul de ab , et un emprunt doit être effectué. Si unb , le bit est effacé. Une soustraction avecSBB instruction d' emprunt ( ) calculera abC = a −( b + C ), tandis qu'une soustraction sans emprunt ( SUB) agit comme si le bit d'emprunt était vide. Les familles 8080 , 6800 , Z80 , 8051 , x86 et 68k (entre autres) utilisent un peu d'emprunt.

La seconde utilise l'identité que − x = ( not x )+1 directement (c'est-à-dire sans stocker le bit de retenue inversé) et calcule ab comme a +(not b )+1. Le drapeau de retenue est positionné en fonction de cette addition, et soustraire avec retenue calcule a +not( b )+ C , tandis que soustraire sans retenue agit comme si le bit de retenue était positionné. Le résultat est que le bit de report est réglé si unb , et si clair a < b . Les processeurs System/360 , 6502 , MSP430 , COP8 , ARM et PowerPC utilisent cette convention. Le 6502 est un exemple particulièrement connu car il n'a pas d' opération de soustraction sans opération de report, les programmeurs doivent donc s'assurer que l'indicateur de report est défini avant chaque opération de soustraction où un emprunt n'est pas requis.

Résumé des différentes utilisations du carry flag en soustraction
Porter ou
emprunter un peu
Soustraire sans
porter/emprunter
Soustraire
avec emprunter
Soustraire
avec retenue
C = 0 ab
= a + non( b ) + 1
ab0
= a + non( b ) + 1
ab1
= a + non( b ) + 0
C = 1 ab1
= a + non( b ) + 0
ab0
= a + non( b ) + 1

Le plus souvent, la première alternative est appelée « soustraction avec emprunt », tandis que la seconde est appelée « soustraction avec report ». Cependant, il existe des exceptions dans les deux sens; les architectures VAX , NS320xx et Atmel AVR utilisent la convention de bit d'emprunt, mais appellent leur opération a - b - C " soustraire avec retenue " ( SBWC, SUBCet SBC). Les architectures PA-RISC et PICmicro utilisent la convention des bits de retenue, mais appellent leur opération a +not( b )+ C "soustraire avec emprunt" ( SUBBet SUBWFB).

Les microcontrôleurs ST6 8 bits sont peut-être les plus déroutants de tous. Bien qu'ils n'aient aucune sorte d'instruction "soustraire avec retenue", ils ont un bit de retenue qui est défini par une instruction de soustraction, et la convention dépend du modèle de processeur. Le processeur ST60 utilise la convention « carry », tandis que les processeurs ST62 et ST63 utilisent la convention « emprunt ».

Voir également

Les références

Liens externes