2010-04-22 30 views
8

Cuando uso ADC para exmaple:instrucción ADC en ASM 8086

AL = 01 and BL = 02, and CF = 1 

cuando hago esto:

ADC AL,BL 

Se AL ser 3 o 4? (Con la adición CF o sin?)

+4

Intenta adquirir el hábito de probar estas cosas por ti mismo, es una excelente forma de aprender. –

+0

+1 Paul R. Tal, aprenderá mucho más rápido y obtendrá resultados mucho más precisos si prueba estas cosas por su cuenta. En el tiempo que le tomó ingresar esta pregunta y aclarar las cosas en las diversas respuestas a continuación, podría haber probado todos los escenarios y haber tenido una respuesta definitiva, todo mientras aprendía algunas cuestiones fundamentales sobre las CPU, los registros y las banderas. –

Respuesta

3

AL habrá 4. ADC significa add with carry, así que por supuesto el acarreo se resume en. CF consigue el sistema de nuevo a 0, ya que no hay proyectos para las de la suma en pregunta.

+0

y qué pasa si hago esto: AX = FF, BX = FF, CF = 1 y ADC AX, BX ¿Qué pasará? Quiero decir, ¿dónde almacenará la computadora el byte extra? ¡¡Gracias!! – Tal

+1

@Tal, AX y BX son totalmente capaces de almacenar más de un byte (¡ya que no está usando registros de un byte como AL y BL aquí!) Por lo que el resultado será '1FF' en AX y, nuevamente, CF a 0. –

3

Será 4. ADC (agregar con acarreo) agrega en un extra 1 si el indicador de acarreo (CF) es 1. Consulte la descripción completa del código de operación here.

9

algunas cosas acerca de la instrucción 8086ADC:

Syntax: adc dest, src 
dest: memory or register 
src: memory, register, or immediate 
Action: dest = dest + src + CF 

Es evidente que la acción dice que el indicador de acarreo (CF) se incluirá en la adición por lo que el resultado será 4 no 3.

+0

y qué pasa si hago esto: AX = FF, BX = FF, CF = 1 y ADC AX, BX ¿Qué pasará? Quiero decir, ¿dónde almacenará la computadora el byte extra? ¡Gracias! – Tal

+0

@Tal: Si haces eso, AX será 0x01FF y CF será 0. No hay bytes adicionales. –

3

No es diferente que la adición de la base 10.

 
99 
+11 

9+1 is zero carry the 1 
9+1+carry is 1 carry the 1 

El resultado de los cálculos decimales anterior es 10 con un acarreo de 1, o 110 si desea pensar de esa manera.

Para el arranque binario con un sumador de un bit, aquí es una tabla de verdad:

 
000 0 0 
001 0 1 
010 0 1 
011 1 0 
100 0 1 
101 1 0 
110 1 0 
111 1 1 

la columna izquierda de tres bits son las combinaciones de entrada, dos operandos y llevar en, la segunda columna es llevar a cabo y la tercera columna es el resultado

modo 1 + 1 sin equipaje es 110 en la columna izquierda y el resultado es 0 llevan el 1.

no

diferente de las matemáticas decimal anterior simplemente mucho más simple, cuando usted agrega una columna en decimal, operando a, operando b, carry. El resultado es la respuesta módulo 10 y el acarreo es el resultado/10. copia el acarreo a la parte superior de la siguiente columna y repite para siempre. como se demostró con 99 + 11 o 999 + 111, etc.

Para los dos bits más simples agregar sin acarrear, el resultado es el xor de las entradas y el resultado es el y de las dos entradas. Podría implementar agregar con acarreo usando dos agregar sin transportar sumadores encadenados o hacerlo directamente. El resultado se establece cuando hay un número impar de onces o paridad impar, que son dos xors r = a xor b xor carry in. La ejecución con la que estoy luchando en este momento tal vez alguien puede ayudar.

para que en 8 bits 0xFF 0xFF + con el sistema de transporte dará

 
     1 
11111111 
+11111111 

Esto demuestra 0xFF 0xFF + con un "llevar a la" llegando antes de empezar.

mirada en ella una columna a la vez desde la derecha al igual que las matemáticas decimal

 
1+1+1 = 1 carry the 1 
next column 
1+1+1 = 1 carry the 1 
... 

esto continúa y termina con 0xFF con el bit de acarreo establecer

Así que si sólo tenía una Agregue 8 bits con acarreo, podría sumar dos números tan grandes como tenga memoria.

Veamos un 16 bits complemento:

 
0x1234 
+0xABCD 

Se podía hacer la matemáticas con un poco añadir 16, 0xBE01.

o con un sumador de 8 bits:

 
clear the carry bit 
add with carry 0x34+0xCD result 0x01 carry set 
add with carry 0x12+0xAB result 0xBE carry clear 

así que la respuesta es 0xBE01

O usando un sumador de 4 bits si todo lo que tienes es un poco 4 alu

 
clear the carry bit 
add with carry 0x4+0xD = 0x1 carry bit set 
add with carry 0x3+0xC = 0x0 carry bit set 
add with carry 0x2+0xB = 0xE carry bit clear 
add with carry 0x1+0xA = 0xB carry bit clear 

nuevo el resultado 0xBE01 carry bit clear

podríamos hacer esto con bits individuales también o un sumador de 3 bits, tan largo como es binario, es trivial.

Todos los procesadores útiles deben tener alguna forma de agregar el bit de acarreo para que pueda ensanchar el alu. A veces hay add-add y adc, algunos son un paso adicional o el más doloroso sería un add sin carry y usar una branch si carry clear con un add immediate debajo de él.

Esta es la razón por la que los cambios o rotaciones giran a través de la barra de transporte, por lo que puede hacer un cambio de bit más ancho que el ancho de una ubicación de registro/memoria.

multiplicación binaria es dolorosamente simple en comparación con el decimal, pero le ahorraré ese y le permitirá pensar en ello.

Sí, podría haber escrito un programa para probarlo. Y aún puedo, podría estar intencionalmente guiándote por un camino de desinformación.