En los procesadores de computadora, el indicador de acarreo (generalmente indicado como el indicador C ) es un solo bit en un registro de estado del sistema / registro de indicador que se usa para indicar cuándo se ha generado un acarreo o préstamo aritmético a partir del bit de unidad aritmética lógica (ALU) más significativo posición. La bandera de acarreo permite sumar / restar números mayores que un ancho de ALU simple llevando (sumando) un dígito binario de una suma / resta parcial a la posición de bit menos significativa de una palabra más significativa. También se utiliza para ampliar los cambios de bits. y gira de manera similar en muchos procesadores (a veces se hace a través de una bandera X dedicada ). Para las operaciones sustractivas, se emplean dos convenciones (opuestas) ya que la mayoría de las máquinas establecen el indicador de acarreo en préstamo, mientras que algunas máquinas (como el 6502 y el PIC ), en cambio, restablecen el indicador de acarreo en préstamo (y viceversa).
Usos
La bandera de acarreo se ve afectada por el resultado de la mayoría de las instrucciones aritméticas (y típicamente de varias instrucciones de bits) y también se usa 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 están representadas por mnemónicos como ADD/SUB
, ADC/SBC
( ADD/SUB
incluido acarreo), SHL/SHR
( cambios de bit ), ROL/ROR
(el bit gira), RCR/RCL
(girar a través del acarreo), etc. [1] El uso de la bandera de acarreo de esta manera permite operaciones de suma, resta, desplazamiento y rotación de varias palabras .
Un ejemplo es lo que sucede si se agrega 255 y 255 usando 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 siempre almacenados en el registro serían 11111110
binarios (254 decimal) pero como hay ejecución del bit 7 (el ocho bit), se establece el acarreo, lo que indica que el resultado necesita 9 bits. El resultado válido de 9 bits es la concatenación de la bandera de acarreo con el resultado.
Para el 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 un entero con signo en complemento a dos −1 ( ADD al,-1
), entonces la interpretación del resultado es -2 porque Overflow_Flag
es claro 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 un 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 fue en el Carry_Flag
, que por lo tanto no se puede ignorar. El Overflow_Flag
y el Sign_Flag
se ignoran.
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 acarreo de rotación a la izquierda , el resultado sería 10101011
con la bandera de acarreo borrada porque el bit más significativo (bit 7) se rotó en el acarreo mientras que el acarreo se rotó en el bit menos significativo (bit 0).
Los primeros microprocesadores Intel 4004 e Intel 8008 tenían instrucciones específicas para configurar y restablecer la bandera de acarreo explícitamente. Sin embargo, los últimos Intel 8080 (y Z80 ) no incluyeron un código de operación de transporte de restablecimiento explícito, ya que esto podría hacerse igualmente rápido a través de una de las instrucciones AND, OR o XOR bit a bit (que no usan el indicador de acarreo).
La bandera de acarreo también se usa a menudo siguiendo instrucciones de comparación, que generalmente se implementan mediante operaciones sustractivas, para permitir que se tome una decisión sobre cuál de los dos valores comparados es menor (o mayor o igual) que el otro. Las instrucciones de bifurcación que examinan la bandera de acarreo a menudo se representan mediante mnemotécnicos como BCC
y BCS
para bifurcar si el acarreo es claro, o bifurcar si el acarreo está configurado respectivamente. Cuando se usa de esta manera, la bandera 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 valores enteros con signo.
Vs. tomar prestada la bandera
Si bien la bandera de acarreo está bien definida para la suma, hay dos formas de uso común para usar la bandera de acarreo para operaciones de resta.
El primero usa 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 instrucción de 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 claro. Las familias 8080 , Z80 , 8051 , x86 [1] y 68k (entre otras) usan un bit prestado.
El segundo aprovecha la identidad de que - x = no ( x ) +1 y calcula a - b como a + no ( b ) +1. La bandera de acarreo se establece de acuerdo con esta suma, 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 , [2] 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 requiera un préstamo. [3]
Llevar o pedir prestado un poco | Restar sin llevar / pedir prestado | Restar con pedir prestado | Restar con acarreo |
---|---|---|---|
C = 0 | a - b = a + no ( b ) + 1 | a - b - 0 = a + no ( b ) + 1 | a - b - 1 = a + no ( b ) + 0 |
C = 1 | a - b - 1 = a + no ( b ) + 0 | a - b - 0 = a + no ( b ) + 1 |
Por lo general, la primera alternativa se denomina "restar con préstamo", mientras que la segunda se denomina "restar con acarreo". Sin embargo, existen excepciones en ambas direcciones; los VAX , ns320xx y Atmel AVR arquitecturas utilizan el convenio de préstamo poco, pero llaman a su un - B - C operación "restar con acarreo" ( SBWC
, SUBC
y SBC
). Los PA-RISC y PICmicro arquitecturas utilizan la convención de bit de acarreo, pero llaman a su un + no ( b ) + C operación "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 "resta con acarreo", tienen un bit de acarreo que se establece mediante una instrucción de resta, y la convención depende del modelo del procesador. El procesador ST60 usa la convención de "acarreo", mientras que los procesadores ST62 y ST63 usan la convención de "préstamo". [4]
Ver también
- Aritmética binaria
- Bandera de medio transporte
- Registro de estado
Referencias
- ^ a b "Manual del desarrollador de software de arquitectura Intel, volumen 2: manual de referencia del conjunto de instrucciones" (PDF) . Consultado el 25 de octubre de 2007 . CS1 maint: parámetro desalentado ( enlace )
- ^ IBM System / 360 Principios de funcionamiento (PDF) . pag. 28. Formulario IBM A22-6821-0.
- ^ Tan, BTG (mayo de 1983). "Instrucciones SBC, TSX y TXS del 6800 y 6502" (PDF) . Diario del Dr. Dobb (79): 67–68.
- ^ "Manual de programación de la familia ST6" (PDF) . Revisión 2.0. STMicroelectronics . Octubre de 2004. págs. 21-22, 42 . Consultado el 28 de febrero de 2017 . CS1 maint: parámetro desalentado ( enlace )
enlaces externos
- Carry Flag y Overflow Flag en aritmética binaria
- Carry Bit: ¿Cómo funciona?