En los procesadores de ordenador, el indicador de acarreo (normalmente indicado como indicador C ) es un bit único en un registro de estado del sistema /registro de indicadores utilizado para indicar cuándo se ha generado un acarreo o un préstamo aritmético a partir de la posición de bit más significativa de la unidad lógica aritmética (ALU). El indicador de acarreo permite sumar o restar números mayores que el ancho de una ALU al llevar (sumar) un dígito binario desde una suma o resta parcial a la posición de bit menos significativa de una palabra más significativa. Esto normalmente lo programa el usuario del procesador en el nivel de código ensamblador o de máquina, pero también puede ocurrir internamente en ciertos procesadores, a través de lógica digital o microcódigo , donde algunos procesadores tienen registros e instrucciones aritméticas más amplios que las ALU (combinatorias o "físicas"). [1] También se utiliza para ampliar los desplazamientos de bits y las rotaciones de manera similar en muchos procesadores (a veces se hace a través de un indicador dedicado). Para las operaciones sustractivas, se emplean dos convenciones (opuestas), ya que la mayoría de las máquinas activan el indicador de acarreo al tomar prestado, mientras que algunas máquinas (como la 6502 y la PIC ) en cambio restablecen el indicador de acarreo al tomar prestado (y viceversa).
El indicador de acarreo se ve afectado por el resultado de la mayoría de las instrucciones aritméticas (y, por lo general, de varias instrucciones de bits) 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 los lenguajes ensambladores, estas instrucciones se representan mediante mnemónicos como ADD/SUB
, ADC/SBC
( ADD/SUB
incluyendo acarreo), SHL/SHR
( desplazamientos de bits ), ROL/ROR
(rotación de bits), RCR/RCL
(rotación mediante acarreo), etc. [2] El uso del indicador de acarreo de esta manera permite operaciones de suma, resta, desplazamiento y rotación de varias palabras .
Un ejemplo es lo que sucede si uno suma 255 y 255 utilizando registros de 8 bits . El resultado debería ser 510, que es el valor de 9 bits 111111110
en binario. Los 8 bits menos significativos que siempre se almacenan en el registro serían 11111110
binarios (254 decimal), pero como hay un acarreo del bit 7 (el octavo bit), el acarreo se establece, 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.
Para un tamaño de ALU x86 de 8 bits, una interpretación de complemento a dos de 8 bits, la operación de suma 11111111
+ 11111111
da como resultado 111111110
, Carry_Flag
establecer, Sign_Flag
establecer y Overflow_Flag
borrar.
Si 11111111
representa el entero con signo en complemento a dos −1 ( ADD al,-1
), entonces la interpretación del resultado es -2 porque Overflow_Flag
es clara y Carry_Flag
se ignora. El signo del resultado es negativo, porque Sign_Flag
está establecido. 11111110
es la forma de complemento a dos del entero con signo −2.
Si 11111111
representa el número binario entero sin signo 255 ( ADD al,255
), entonces la interpretación del resultado sería 254, lo cual no es correcto, porque el bit más significativo del resultado se encuentra en Carry_Flag
, por lo que no se puede ignorar. Se ignoran Overflow_Flag
y .Sign_Flag
Otro ejemplo puede ser un registro de 8 bits con el patrón de bits 01010101
y el indicador de acarreo establecidos; si ejecutamos una instrucción de rotación a la izquierda a través del acarreo , el resultado sería 10101011
con el indicador de acarreo borrado porque el bit más significativo (bit 7) fue rotado al acarreo mientras que el acarreo fue rotado al bit menos significativo (bit 0).
Los primeros microprocesadores Intel 4004 e Intel 8008 tenían instrucciones específicas para establecer y restablecer explícitamente el indicador de acarreo. Sin embargo, los posteriores Intel 8080 (y Z80 ) no incluían un código de operación de restablecimiento explícito del acarreo, ya que esto se podía hacer con la misma rapidez mediante una de las instrucciones AND, OR o XOR bit a bit (que no utilizan el indicador de acarreo).
El indicador de acarreo también se utiliza a menudo después de instrucciones de comparación, que normalmente se implementan mediante operaciones sustractivas, para permitir que se tome una decisión sobre cuál de los dos valores comparados es menor que (o mayor o igual que) el otro. Las instrucciones de bifurcación que examinan el indicador de acarreo suelen estar representadas por mnemónicos como BCC
y BCS
para bifurcar si el acarreo está libre, o bifurcar si el acarreo está establecido respectivamente. Cuando se utiliza de esta manera, el indicador de acarreo proporciona un mecanismo para comparar los valores como números enteros sin signo. Esto contrasta con el indicador de desbordamiento que proporciona un mecanismo para comparar los valores como valores enteros con signo.
Si bien la bandera de acarreo está bien definida para la suma, hay dos formas de uso común de utilizar la bandera de acarreo para operaciones de resta.
El primero utiliza el bit como un 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 resta con instrucción borrow ( SBB
) calculará a − b − C = a −( b + C ), mientras que una resta sin borrow( SUB
) actúa como si el bit de préstamo estuviera borrado. Las familias 8080 , 6800 , Z80 , 8051 , x86 [2] y 68k (entre otras) utilizan un bit de préstamo.
El segundo utiliza la identidad que − x = ( no 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 adición, y restar con acarreo calcula a +no( b )+ C , mientras que restar 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 System/360 , [3] 6502 , MSP430 , COP8 , ARM y PowerPC 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é establecido antes de cada operación de resta donde no se requiere un préstamo. [4]
Lo más común es que la primera alternativa se denomine "restar con préstamo", mientras que la segunda se denomina "restar con acarreo". Sin embargo, existen excepciones en ambas direcciones; las arquitecturas VAX , NS320xx y Atmel AVR utilizan la convención de bits de préstamo, pero denominan a su operación a − b − CSBWC
"restar con acarreo" ( , SUBC
y SBC
). Las arquitecturas PA-RISC y PICmicro utilizan la convención de bits de acarreo, pero denominan a su operación a +not( b )+ C "restar con préstamo" ( SUBB
y SUBWFB
).
Los microcontroladores ST6 de 8 bits son quizás los más confusos de todos. Aunque no tienen ningún tipo de instrucción de "restar 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 de "acarreo", mientras que los procesadores ST62 y ST63 utilizan la convención de "tomar prestado". [5]