2011-11-07 20 views
6

He estado leyendo y con el Conjunto de Instrucciones 8086, dice que un CMP (comparar) puede establecer la Bandera de Transporte. Entiendo que una comparación resta dos operandos, pero me preguntaba si alguien puede dar un ejemplo cuando ese sea el caso.¿Por qué CMP (comparar) a veces establece una bandera de acarreo en el ensamblaje 8086?

Simplemente no puedo comprender la idea de agregar un número y un número negativo establecerá la marca de llevar. He leído en el indicador de préstamo, pero solo necesitaba un ejemplo para aclarar mi comprensión de una instrucción de comparación.

Además, entiendo que si 3 - 5 = -2 configuraría la bandera negativa ... ¿cuándo se establece el transporte?

+0

La afirmación "Necesito hacer un ejemplo" hace que esto suene a tarea. Si solo depura a través de algún código existente, y mira la bandera CY, estoy seguro de que la verás después de algunas instrucciones ADD. –

+0

Bueno, estoy creando mi propia arquitectura de conjunto de instrucciones y estoy leyendo las instrucciones 8086 y preguntándome cómo una comparación (que resta 2 operandos y establece las banderas respectivas) puede establecer el indicador de acarreo.Sé cuando el ADD establece el acarreo, pero soy un poco escéptico en restar/acarrear (no confundir con pedir prestado). – faul

+0

en el 8086 (y muchos otros), el indicador de acarreo tiene una doble función y representa el préstamo en operaciones de resta o comparación. Si hace una comparación donde el valor que se compara es más grande que el que está en el registro, hay un préstamo, por ejemplo, se establece la bandera CY. Si el valor es igual o menor que el registro, no hay préstamos, y CY se borra. – JustJeff

Respuesta

4
  • El indicador de acarreo se establece después de una operación que resultó en un subdesbordamiento o desbordamiento. Por ejemplo, al restar 10 de 6 se producirá un subdesbordamiento y se establecerá la bandera de acarreo. De manera similar, agregar 1 al valor máximo del registro dará como resultado un desbordamiento y establecerá el indicador de acarreo.
  • El indicador de acarreo también se modifica durante una operación de cambio, se establece en en el valor del último bit desplazado fuera del registro de destino.
  • La prueba de bits colocará el valor del bit probado en la marca de transporte . Opcodes que hacen esto: BT, BTC, BTR y BTS.
  • Instrucciones que afectan directamente a la bandera de acarreo: CLC, CMC y STC.
  • Durante una comparación, el indicador de acarreo se establece igual que si se hubieran restado los dos operandos .
  • Durante una negación (NEG), el indicador de acarreo se establece a menos que el operando sea cero, en cuyo caso se borra.
2

El indicador de acarreo normalmente se establece cuando se usa la aritmética sin signo. Por ejemplo, agregar dos números sin firmar (cuyo resultado no encaja en el registro) no elevaría el indicador de desbordamiento, sino que solo llevaría el indicador. Sin embargo, cuando se utiliza aritmética firmada, se establece el indicador de desbordamiento en dicho evento.

1

Puede encontrar ejemplos de cuándo las banderas de acarreo y desbordamiento están configuradas en 0 y 1 luego de sumar o restar números enteros en this answer a una pregunta relacionada.
También puede encontrar allí el código C de muestra emulando el complemento con acarreo y sustracción con instrucciones prestadas para números de 8 bits y puede jugar con eso, tal vez obtener más ejemplos.

El formato de salida no es algo como esto:
127(127) - 255( -1) - 1 = 127(127) CY=1 OV=0
donde cada número se representa como tanto sin firmar y entre paréntesis firmado (complemento a 2) junto a él. El número anterior al = es el indicador de llevar antes de ADC/SBB. CY= y OV= muestran los indicadores de acarreo y desbordamiento después de ADC/SBB.

Comparar hace más o menos lo mismo que restar sin pedir prestado, excepto que solo afecta el carry, overflow, sign y cero flags (y paridad y carry auxiliar, pero no son importantes aquí) sin modificar ningún número en un registro /memoria.

Cuestiones relacionadas