Lenguaje ensamblador: ¿Por qué las instrucciones INC y DEC no establecen la bandera de acarreo?

Varias razones que conozco y he usado, la mayoría implican trabajar con “bignums” enteros, enteros mucho más grandes que el tamaño de los datos nativos (por ejemplo, números de 2048 bits en una máquina de 32 bits), pero también se aplican a lazos y lógica más generales. casos:

  1. Al configurar O y Z, INC y DEC efectivamente le dan el estado C, por lo que sería duplicativo tocarlo realmente. Puede realizar su acarreo / préstamo en sus operandos más grandes basados ​​en O / Z cuando está trabajando en 1. Debido a que +/- 1 es una operación tan común incluso con “bignums”, a menudo personaliza esta ruta de código con un bucle especial, así que tienes una ruta general muy rápida para aumentar o disminuir un “bignum”
  2. Al no tocar C, puede usar INC / DEC para los bucles de cierre que representan cosas como (a) el tamaño (a menudo variable) de su “bignum” durante la suma / resta o (b) el recuento de interacciones durante “bignum “multiplicación y división (o pow o shift, etc.) – y los bucles no afectarán la lógica de acarreo necesaria para la suma / resta principal – realizas un ADD o SUB (o shift), que establece C / B y luego el Los INC o DEC necesarios para administrar sus bucles solo tocan O / Z y dejan a C solo. Luego, prueba para ver si has terminado con el bucle y sale o reinicia / vuelve a contar si es así antes de utilizar C / B en el siguiente elemento de tu “bignum”.
  3. Hasta donde sé, este no es el caso en las primeras CPU que ya tenían este diseño para INC / DEC y, por lo tanto, creo que surgió de 1. y 2. arriba, pero más tarde cuando ADD / SUB podría tomar varios ciclos y había tuberías. , y C no se establecería en el próximo ciclo si quisiera ramificarse en él, resulta útil poder poner el INC / DEC de su ciclo justo después de ADD / SUB para mantener la tubería llena. Relacionado con ambos 2. y 3. aquí, estos bucles muy importantes tienen menos lógica de ramificación y son simplemente más pequeños y más rápidos debido a este diseño.
  4. Hay otros casos en los que compila / codifica C para construcciones de bucles while mientras este efecto también es útil en relación con posibles bloqueos de canalización. Debido a que INC / DEC solo tiene el impacto O / Z, tienen menos restricciones de movimiento y son más fáciles de usar para llenar la tubería.

No sé si estas son las razones específicas de Bryant y O’Hallaron, pero son lo suficientemente esotéricas y universales como para sospechar que son la razón por la que esto surgió originalmente y luego se ha quedado.

supongamos que la operación Incremento afecta la bandera de acarreo, pero ¿cuál es el número posible en el que la operación de incremento afectará la bandera de transporte?

Adivina qué solo hay uno de esos números (supongamos que es un número de 16 bits):

FFFF o 1111 1111 o (-1).

Incrementarlo produciría cero y, por lo tanto, ZF se establecerá en 1. (¿Todavía necesita CF?)

en todos los demás casos, la bandera de transporte no se verá afectada, por lo que no es necesario producir un indicador duplicado. Por lo tanto, teniendo en cuenta la optimización, el diseño de 8086 se realiza de manera que la operación INC no afecte la bandera de transporte.