2012-04-30 5 views
5

Non riesco a capire come funziona il flag di direzione in x86. Il testo nelle mie lezioni dire che incrementi o decrementi registro fonte o destinazione ma questo non ha senso con il suo nome. Qualcuno può spiegare cosa fa?Flag di direzione in x86

risposta

7

Questo flag viene utilizzato nelle operazioni con le stringhe e specifica se le stringhe iniziano con un indirizzo basso e passano agli indirizzi più alti o viceversa.

Per istruzioni stringa, ECX ha il numero di iterazioni, DS:ESI ha l'indirizzo di origine e ES:EDI ha la destinazione (da qui il s in ESI e d in EDI).

Dopo ogni iterazione, ECX viene decrementato di uno, e ESI e EDI sono o incrementata o decrementata dalla dimensione dell'elemento (1 per operazioni di byte, 2 per le operazioni di word, ecc) secondo EFLAGS.DF.

Se EFLAGS.DF è 0, ESI e EDI vengono incrementati, altrimenti stanno decrementato.

+0

Quindi aumenta o diminuisce la stringa di conseguenza. Se una stringa inizia con un indirizzo più basso, aggiungerebbe ad esso o nell'altro caso eseguire l'opposto, giusto? –

+0

aumenta o diminuisce il ** puntatore ** all'interno della stringa. –

+0

Nathan Fellman, @Jerry Coffin, penso che il comportamento predefinito sia quello di copiare dall'inizio di un blocco di memoria (DF cancellato). In quali casi si vorrebbe copiare un blocco di memoria dalla fine (set DF)? – golem

4

Prendiamo il numero rep movsb come esempio di un'istruzione che dipende dall'indicatore di direzione.

Quando si esegue un rep movsb, si fornisce un indirizzo di origine in esi, un indirizzo di destinazione in edi e conteggio in ecx. Il processore esegue fondamentalmente un ciclo. Nel caso normale (quando il flag di direzione è chiaro) incrementa esi e edi ogni iterazione del ciclo, quindi le inizializzi in modo da puntare all'inizio dei blocchi di origine e destinazione che stai copiando. Durante l'esecuzione di REP MOVSB, il processore incrementa gli indirizzi di origine e destinazione finché non raggiunge la fine del blocco da copiare.

Quando il flag di direzione è impostato, il processore decrementa invece i registri. Ciò significa che devi iniziare con loro puntando allo fine del blocco di memoria che stai copiando. Invece di iniziare dall'inizio e di copiare fino alla fine, inizia alla fine e copia all'indietro fino a quando non arriva all'inizio.