Flag di direzione DF e Trap Flag TF dell'8086: operazioni su stringhe e debug single-step
Due flag speciali nel registro FLAGS
Bit 10 = DF (Direction Flag), Bit 8 = TF (Trap Flag). Controllano la direzione delle stringhe e il tracciamento a livello di istruzione.
Direction Flag (DF)
- DF = 0 (CLD): Le istruzioni stringa auto-incrementano SI/DI (in avanti).
- DF = 1 (STD): Le istruzioni stringa auto-decrementano SI/DI (all'indietro).
- Istruzioni interessate:
MOVS, CMPS, SCAS, LODS, STOS, INS, OUTS(e prefissiREP).
Esempio: copia in avanti poi copia inversa
; Copia 10 byte da src a dst (in avanti) cld ; DF=0 mov si, offset src mov di, offset dst mov cx, 10 rep movsb ; SI,DI incrementano ; Inverte la stringa sul posto (all'indietro) std ; DF=1 mov si, offset dst + 9 mov di, offset dst + 9 mov cx, 10 rep movsb ; SI,DI decrementano
Trap Flag (TF)
- TF = 0: Esecuzione normale.
- TF = 1: Dopo ogni istruzione, la CPU genera INT 1 (Tipo 1) — eccezione single-step.
- Usato dai debugger (DEBUG, Turbo Debugger, WinDbg, GDB) per implementare "Step Into".
- Impostabile tramite
INT 3(breakpoint) oPUSHF / OR word ptr [sp], 100h / POPF. - Il gestore di interruzione può esaminare registri, memoria, poi
IRETper riprendere.
Flusso di lavoro del debugger
- Il debugger imposta TF=1 nei FLAGS salvati nello stack.
- Il codice utente esegue un'istruzione.
- La CPU pusha FLAGS/CS/IP, cancella TF, salta al gestore INT 1 (debugger).
- Il debugger legge lo stato dei registri, aggiorna l'interfaccia.
- Il debugger ripristina TF=1 nei FLAGS salvati,
IRET→ istruzione successiva.
Interazione
- DF e TF sono indipendenti; entrambi in FLAGS.
- Istruzione stringa con TF=1: ogni iterazione (ogni MOVSB) attiva INT 1 — estremamente lento, ma consente l'ispezione per elemento.
Riepilogo
| Flag | Bit | Istruzione per impostare | Istruzione per cancellare | Uso principale |
|---|---|---|---|---|
| DF | 10 | STD | CLD | Direzione stringa (inc/dec SI/DI) |
| TF | 8 | INT 3 / POPF con bit | IRET (auto) / POPF | Debug single-step |