En el procesador de una computadora, una bandera de acarreo (también denominada indicador C o carry flag en inglés) es un bit individual en un registro de estado del sistema de registro de indicadores, que se utiliza para controlar cuándo se ha generado un acarreo o préstamo aritmético a partir de la posición del bit más significativo de la unidad aritmética lógica (ALU). El indicador de acarreo permite sumar/restar números mayores que el ancho de una ALU mediante el acarreo (sumación) de un dígito binario de una suma/resta parcial a la posición del bit menos significativo de una palabra más significativa. Esto normalmente lo programa el usuario del procesador a nivel de ensamblador o código máquina, pero también puede ocurrir internamente en ciertos procesadores, a través de puertas lógicas o de microcódigo, donde algunos procesadores tienen registros e instrucciones aritméticas más amplios que la ALU (combinatoria o física).Los conocidos Z80 y 68000 son ejemplos de este tipo de CPU, entre muchos otros. También se utiliza para extender desplazamientos y rotaciones de manera similar en muchos procesadores (a veces mediante un indicador dedicado). Para las operaciones sustractivas, se emplean dos convenciones (opuestas): la mayoría de las máquinas activan el indicador de acarreo al tomar prestado, mientras que algunos microprocesadores (como el MOS 6502 y el PIC) lo desactivan al tomar prestado (y viceversa).

Utilización El indicador de acarreo se ve afectado por el resultado de la mayoría de las instrucciones aritméticas (y normalmente varias instrucciones bit a bit) y también se utiliza como entrada para muchas de ellas. Varias de estas instrucciones tienen dos formas que leen o ignoran el acarreo. En lenguaje ensamblador, estas instrucciones se representan mediante mnemotécnica, como ADD/SUB, ADC/SBC (ADD/SUB incluyendo el acarreo), SHL/SHR (desplazamiento de bits), ROL/ROR (rotación de bits), RCR/RCL (rotación a través del acarreo), y así sucesivamente. El uso del indicador de acarreo de esta manera permite operaciones de suma, resta, desplazamiento y rotación de varias palabras.

Considérese sumar 255 + 255 (11111111 + 11111111). El resultado debería ser 510, que es el valor de 9 bits 111111110 en binario. Sin embargo, si se utiliza un registro de 8 bits, solo se almacenarán los 8 bits menos significativos en el registro, binario 11111110 (decimal 254). Dado que hay acarreo de salida del bit 7 (el octavo bit), el acarreo está activado, lo que indica que el resultado necesita 9 bits. El resultado válido de 9 bits es la concatenación del indicador de acarreo con el resultado.

Los otros bits comunes del registro de estado de la ALU estarán Sign_Flag activado, Zero_flag desactivado y Overflow_Flag desactivado.

Si 11111111 representa el entero con signo -1 en complemento a dos (instrucción x86 ADD al,-1), la interpretación del resultado es -2 porque Overflow_Flag está desactivado y Carry_Flag se ignora. El signo del resultado es negativo porque Sign_Flag está activado. 11111110 es la representación en complemento a dos del entero con signo -2.

Si 11111111 representa el número binario entero sin signo 255 (instrucción x86 ADD al,255), la interpretación del resultado sería 254, lo cual es incorrecto, ya que el bit más significativo del resultado se encuentra en Carry_Flag, que por lo tanto no puede ignorarse. Las instrucciones Overflow_Flag y Sign_Flag se ignoran.

Otro ejemplo podría ser un registro de 8 bits con el patrón de bits 01010101 y el indicador de acarreo activado. Si se ejecuta una instrucción de rotación a la izquierda a través del acarreo, el resultado sería 10101011 con el indicador de acarreo desactivado, ya que el bit más significativo (bit 7) se rotó hacia el acarreo, mientras que el acarreo se rotó hacia el bit menos significativo (bit 0).

La mayoría de los microprocesadores, desde el Intel 4004 y el Intel 8008, tienen instrucciones específicas para activar y desactivar el indicador de acarreo. Una excepción fue el Intel 8080 (y su derivado Zilog Z80), que no incluía un código de operación explícito para desactivar el acarreo, ya que la operación podía realizarse mediante cualquiera de las instrucciones lógicas bit a bit (AND, OR, XOR), que desactivaban el indicador de acarreo.

El indicador de acarreo también se usa frecuentemente después de instrucciones de comparación, que normalmente se disponen como operaciones de resta, y permite determinar cuál de los dos valores comparados es menor (o mayor o igual) que el otro. Las instrucciones de salto que examinan el indicador de acarreo suelen representarse mediante mnemotécnica, como BCC y BCS, para saltar si el acarreo está desactivado o activado, respectivamente. De esta forma, el indicador de acarreo proporciona un mecanismo para comparar los valores como enteros sin signo. Esto contrasta con la bandera de desbordamiento, que proporciona un mecanismo para comparar los valores como enteros con signo.

Bandera de préstamo Para el caso de la resta se utiliza un bit denominado bandera de préstamo (borrow flag en inglés). Si bien el indicador de acarreo está bien definido para la suma, hay dos formas de uso común de utilizar el indicador de acarreo para operaciones de resta.

El primero utiliza el bit como indicador de préstamo, estableciéndolo si a<b al calcular a-b, y se debe realizar un préstamo. Si a=b, el bit se borra. Una instrucción resta con préstamo (SBB) calculará a-b-C = a-(b+C), mientras que una resta sin préstamo (SUB) actúa como si el bit de préstamo estuviera limpio. Las familias de microprocesadores 6800, 680x0, 8051, intel 8080/Zilog Z80 y x86 (entre otras) utilizan un bit de préstamo.

El segundo usa la identidad x = (not x)+1 directamente (es decir, sin almacenar el bit de acarreo invertido) y calcula a-b como a+(no b)+1. El indicador de acarreo se establece de acuerdo con esta suma, y restar con acarreo calcula a+not(b)+C, mientras que la resta sin acarreo actúa como si el bit de acarreo estuviera establecido. El resultado es que el bit de acarreo se establece si a=b y se borra si a<b. Los procesadores IBM S/360, ARM, POWER/PowerPC, 6502, MSP430, COP8, Am29000, i960 y 88000 utilizan esta convención. El 6502 es un ejemplo particularmente conocido porque no tiene una operación de resta sin acarreo, por lo que los programadores deben asegurarse de que el indicador de acarreo esté configurado antes de cada operación de resta donde no se requiere un préstamo.

+ Resumen de los diferentes usos del bit de acarreo en la resta Bit de acarreo o préstamo Resta sin acarreo/préstamo Resta con préstamo Resta con acarreo C = 0a − b= a + not(b) + 1a − b − 0= a + not(b) + 1a − b − 1= a + not(b) + 0 C = 1a − b − 1= a + not(b) + 0a − b − 0= a + not(b) + 1

Los procesadores enumerados anteriormente, que incluyen los microprocesadores más populares de las últimas décadas, llaman a estas operaciones resta con préstamo y resta con acarreo, respectivamente, pero la nomenclatura está lejos de ser consistente. Las arquitecturas VAX, NS320xx, Fairchild Clipper y AVR utilizan la convención de bits de préstamo, pero llaman a su operación a-b-C resta con acarreo (SBWC, SUBC, SUBWC y SBC). Las arquitecturas PA-RISC y PIC utilizan la convención de acarreo de bits, pero llaman a su operación a+not(b)+C resta con préstamo (SUBB y SUBWFB). Algunos otros, como el H8, llaman al suyo resta extendida (SUBX). El Sun SPARC utiliza la convención de préstamo, el mnemotécnico SUBX y el nombre restar con acarreo.

El Motorola 6809 utiliza la convención de bits de préstamo y ambas nomenclaturas, llamando a la operación restar con préstamo, pero asignándole la abreviatura mnemotécnica SBC.

Los microcontroladores de 8 bits ST6 van en ambos sentidos de una manera diferente. Aunque no tienen ningún tipo de instrucción de resta con acarreo, sí tienen un bit de acarreo que se establece mediante una instrucción de resta, y la convención depende del modelo de procesador. El procesador ST60 utiliza la convención carry, mientras que los procesadores ST62 y ST63 utilizan la convención borrow.

Véase también Sistema binario Bandera de semiacarreo Registro de estado

Referencias

Enlaces externos Bandera de acarreo y Bandera de desbordamiento en aritmética binaria Carry Bit: ¿Cómo funciona?

Categoría:Aritmética computacional