Carry flag

indicador del processador que indica si s'ha produït un desbordament aritmètic sense signar


En els processadors d'ordinadors, la bandera de transport (generalment indicada com la bandera C) és un únic bit en un registre d'estat del sistema/registre de bandera que s'utilitza per indicar quan s'ha generat un transport o prestat aritmètic a partir del bit més significatiu de la unitat lògica aritmètica (ALU). El senyalador de transport permet afegir/retreure nombres més grans que una sola amplada ALU transportant (afegit) un dígit binari d'una suma/resta parcial a la posició de bits menys significativa d'una paraula més significativa. Això sol ser programat per l'usuari del processador a nivell de conjunt o de codi màquina, però també pot passar internament en determinats processadors, mitjançant lògica digital o microcodi, on alguns processadors tenen registres i instruccions aritmètiques d'ALU més amplis (combinatori o "físic").[1]

Generació del bit CARRY : exemple senzill d'unitat lògica aritmètica (ALU) que fa AND, OR, XOR i suma.

També s'utilitza per ampliar els desplaçaments de bits i girar de manera similar en molts processadors (de vegades es fa mitjançant una bandera dedicada). Per a les operacions subtractives, s'utilitzen dues convencions (oposades), ja que la majoria de màquines estableixen el senyalador de transport en préstec, mentre que algunes màquines (com el 6502 i el PIC) en lloc de restablir el senyalador de transport en préstec (i viceversa).[2]

Usos modifica

La bandera de transport es veu afectada pel resultat de la majoria d'instruccions aritmètiques (i normalment de diversos bits) i també s'utilitza com a entrada per a moltes d'elles. Algunes d'aquestes instruccions tenen dues formes que llegeixen o ignoren el transport. En els llenguatges de muntatge, aquestes instruccions es representen per mnemotècniques com ADD/SUB, ADC/SBC (ADD/SUB inclosa la transferència), SHL/SHR (desplaçaments de bits), ROL/ROR (rotació de bits), RCR/RCL (girar mitjançant transport), etcètera.[3] L'ús de la bandera de transport d'aquesta manera permet operacions de suma, resta, desplaçament i rotació de diverses paraules.

Un exemple és el que passa si s'afegeixen 255 i 255 utilitzant registres de 8 bits. El resultat hauria de ser 510, que és el valor de 9 bits 111111110 en binari. Els 8 bits menys significatius emmagatzemats sempre al registre serien 11111110 binaris (254 decimals), però com que hi ha un execució del bit 7 (el vuit bit), el transport està establert, indicant que el resultat necessita 9 bits. El resultat vàlid de 9 bits és la concatenació de la bandera de transport amb el resultat.

Per a la mida ALU x86 de 8 bits, una interpretació de complement a dos de 8 bits, l'operació d'addició 11111111 + 11111111 dóna com a resultat 111111110, Carry_Flag set, Sign_Flag set i Overflow_Flag clear.

Si 11111111 representa el complement de dos enter amb signe −1 (ADD al,-1 ), aleshores la interpretació del resultat és -2 perquè Overflow_Flag és clar i Carry_Flag s'ignora. El signe del resultat és negatiu, perquè Sign_Flag està establert. 11111110 és la forma del complement a dos de l'enter amb signe −2.

Si 11111111 representa el nombre binari sense signe 255 (ADD al,255 ), aleshores la interpretació del resultat seria 254, la qual cosa no és correcta, perquè el bit més significatiu del resultat va entrar a Carry_Flag, que per tant no es pot ignorar. El Overflow_Flag i el Sign_Flag s'ignoren.

Un altre exemple pot ser un registre de 8 bits amb el patró de bits 01010101 i el senyalador de transport establert; si executem una instrucció de rotació a l'esquerra a través del transport, el resultat seria 10101011 amb el senyalador de transport esborrat perquè el bit més significatiu (bit 7) es va girar al transport mentre que el transport es va girar al bit menys significatiu (bit 0).

Els primers microprocessadors Intel 4004 i Intel 8008 tenien instruccions específiques per configurar i restablir la bandera de transport de manera explícita. Tanmateix, el posterior Intel 8080 (i Z80) no va incloure un codi operatiu de reinici explícit, ja que es podia fer amb la mateixa rapidesa mitjançant una de les instruccions AND, OR o XOR (que no utilitzen el senyalador de transport).

La bandera de transport també s'utilitza sovint seguint instruccions de comparació, que normalment s'implementen mitjançant operacions subtractives, per permetre prendre una decisió sobre quin dels dos valors comparats és inferior (o major o igual) que l'altre. Les instruccions de ramificació que examinen la bandera de transport sovint es representen per mnemotècniques com ara BCC i BCS per ramificar-se si l'aportació és clara, o ramificar si la porta està establerta respectivament. Quan s'utilitza d'aquesta manera, la bandera de transport proporciona un mecanisme per comparar els valors com a nombres enters sense signe. Això contrasta amb el senyalador de desbordament que proporciona un mecanisme per comparar els valors com a valors enters amb signe.[4]

Referències modifica

  1. Logan, Author. «Carry Flag vs Overflow Flag (Binary Multiplication)» (en anglès americà), 29-07-2022. [Consulta: 2 desembre 2023].
  2. «Carry Flag» (en anglès americà). [Consulta: 2 desembre 2023].
  3. «Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual» (PDF) (en anglès). [Consulta: 25 octubre 2007].
  4. «Auxiliary Carry Flag in 8086 Microprocessor» (en anglès americà), 01-03-2021. [Consulta: 2 desembre 2023].