2012-04-30 13 views
5

No puedo entender cómo funciona la bandera de dirección en x86. El texto en mis conferencias decir que incrementos o decrementos el registro fuente o destino pero eso no tiene sentido con su nombre. ¿Alguien puede explicar lo que hace?Bandera de dirección en x86

Respuesta

7

Este indicador se usa en operaciones de cadena, y especifica si las cadenas comienzan en una dirección baja y proceden a direcciones más altas o viceversa.

Para instrucciones de cadena, ECX tiene el número de iteraciones, DS:ESI tiene la dirección de origen y ES:EDI tiene el destino (de ahí el s en ESI y la d en EDI).

Después de cada iteración, ECX se decrementa por uno, y ESI y EDI son o bien aumentada o disminuida por el tamaño del elemento (1 para las operaciones de byte, 2 para operaciones de palabras, etc.) de acuerdo a EFLAGS.DF.

Si es EFLAGS.DF0, ESIEDI y se incrementan, de lo contrario están decremented.

+0

De modo que aumenta o disminuye la cuerda en consecuencia. Si una cadena comienza con una dirección más baja, se agregaría o en el otro caso se realizaría lo contrario, ¿verdad? –

+0

aumenta o disminuye el ** puntero ** dentro de la cadena. –

+0

Nathan Fellman, @Jerry Coffin, creo que el comportamiento predeterminado es copiar desde el principio de un bloque de memoria (DF borrado). ¿En qué casos uno querría copiar un bloque de memoria desde el final en su lugar (conjunto DF)? – golem

4

Tomemos rep movsb como ejemplo de una instrucción que depende del indicador de dirección.

Cuando hace un rep movsb, proporciona una dirección de origen en esi, una dirección de destino en edi, y cuenta en ecx. El procesador básicamente ejecuta un bucle. En el caso normal (cuando el indicador de dirección es claro) incrementa esi y edi cada iteración del ciclo, por lo que los inicializa para señalar el comienzo de los bloques de origen y destino que está copiando. Mientras ejecuta el REP MOVSB, el procesador incrementa las direcciones de origen y de destino hasta que llega al final del bloque que se está copiando.

Cuando se establece el indicador de dirección, el procesador disminuye los registros en su lugar. Esto significa que debe comenzar señalando el final del bloque de memoria que está copiando. En lugar de comenzar desde el principio y copiar hasta el final, comienza al final y copia hacia atrás hasta que llega al comienzo.