|
 |
Il Processore e il Debugger |
PROCESSORE 80x86 11/14
[22 di 60] |
 | La rassegna dei registri del processore
8086 termina con il
registro
dei flag
(o, come piace a me, delle flag,
pensando ad esse per quello che sono, delle bandiere);
a qualcuno di noi verrà in mente qualche polveroso film di guerra, di quelli
di propaganda, in bianco e nero..., con l'omino che, in mezzo alla
pista d'atterraggio di una porta-aerei, si sbraccia con in mano
2 bandierine colorate per aiutare il pilota
a non ...sfasciarsi sulla tolda... |
 | Ecco ... queste sono le (Maritime
Signal) Flags da cui
quei 4 mattacchioni di tecnici Intel hanno tratto l'idea e il nome:
flag = segnalazione! |
 | Si tratta di uno strano registro a 16 bit, dall'impiego completamente diverso da tutti gli altri. |
 | Il suo contenuto non è da utilizzare nella consueta forma
di word, ma in funzione del valore dei
singoli bit in esso contenuti; dei 16 disponibili
solo 9 sono significativi, mentre i
rimanenti 7 sono inutilizzati. Di questi:
 | 6 sono
flag di stato, di solito influenzate
dal risultato delle
istruzioni aritmetico
logiche. |
 | 3 sono
flag di controllo, di solito
controllabili da programma con opportune istruzioni
dedicate. |
|
 |
Il compito di questo registro è straordinariamente
importante: al
lato pratico, il suo contenuto consente al processore
di prendere decisioni! |
 | Come abbiamo
sottolineato in occasione della descrizione delle
istruzioni di salto condizionato la CPU di solito
decide saltando da una parte piuttosto che da un'altra. |
 | Il valore binario di una singola
flag è dunque sufficiente per obbligare il
processore ad eseguire un codice invece di un altro; ne
consegue che non esistono (e sarebbero poco intelligenti) istruzioni che
modifichino in blocco questo registro, sebbene sia possibile
scriverlo (?!) o
leggerlo da o in un altro registro a 16 bit con il solito trucco
(per esempio: con PUSHF/ POP
AX avremo in AX la
copia esatta di tutti e 16 i bit). |
 | In ogni caso è possibile salvarne il valore nello stack
(con PUSHF
) o recuperarlo dallo stack (con POPF
). |
 | In dettaglio ecco l'aspetto di questo registro; ciascuna
delle flag in esso contenuta è da
ritenersi settata se si trova al
valore 1, e
resettata se a 0: |
|
15 |
|
|
|
|
|
|
8 |
7 |
|
|
|
|
|
|
0 |
|
0 |
0 |
0 |
0 |
OF |
DF |
IF |
TF |
SF |
ZF |
0 |
AF |
0 |
PF |
1 |
CF |
 | Analizziamo lo scopo delle 6
flag di stato: |
|
CF |
(Carry Flag,
flag di Riporto):
viene forzata a 1 se una
somma/sottrazione ha prodotto
riporto/prestito; influenza i seguenti
salti condizionati:
JC (salta se CF=1),
JNC (salta se
CF=0),
JB (salta se
CF=1),
JAE (salta se
CF=0),
JA (salta se
CF=0
e ZF=0),
JBE (salta se
CF=1
o ZF=1). |
|
PF |
(Parity
Flag, flag di Parità):
viene forzata a 1 se il risultato di un'operazione contiene un
numero pari di
1. |
|
AF |
(Auxiliary
Flag, flag di Riporto Ausiliario):
viene forzata a 1 se un'operazione ha
prodotto riporto
tra il primo (bit0÷bit3) e il secondo nibble
(bit4÷bit7). |
|
ZF |
(Zero
Flag, flag di Zero):
viene forzata a 1 se un'operazione ha dato risultato nullo; influenza i
seguenti salti condizionati:
JZ (salta se ZF=1),
JNZ (salta se
ZF=0),
JE (salta se
ZF=1),
JNE (salta se
ZF=0),
JG (salta se
ZF=0
e SF=OF),
JLE (salta se
ZF=1
o SF<>OF),
JA (salta se
ZF=0
e CF=0),
JBE (salta se
ZF=1
o CF=1). |
|
SF |
(Sign
Flag, flag di Segno):
viene forzata al valore corrente del bit più
significativo del risultato di un'operazione; come è noto nei numeri
con segno 0 significa
positivo e 1
significa negativo; influenza i seguenti
salti condizionati:
JS (salta se SF=1),
JNS (salta se
SF=0),
JG (salta se
SF=OF
e ZF=0),
JGE (salta se SF=OF),
JL (salta se
SF<>OF),
JLE (salta se
SF<>OF
o ZF=1). |
|
OF |
(Overflow
Flag, flag di Overflow):
viene forzata a 1 se un'operazione ha prodotto trabocco, cioè ha superato
il numero massimo per il registro coinvolto (256=100H a 8bit, 65536=10000H a
16bit, ecc); influenza i seguenti salti condizionati:
JO (salta se OF=1),
JNO (salta se
OF=0). |
 | Parimenti vediamo lo scopo delle
3 flag di controllo: |
|
TF
|
(Trap
Flag, flag di Cattura):
molto utile perchè, se forzata a 1 (di solito con INT
03H ) blocca nel punto predeterminato l'esecuzione di un
programma in ambiente Debug; si presta dunque alla grande per l'esecuzione
passo-passo (single-step)
dei programmi. |
|
IF |
(Interrupt
Flag, flag d'Interruzione Mascherabile):
se forzata a 0 consente di disabilitare (mascherare)
la possibile interruzione da parte di uno dei
dispositivi abilitati a ciò; può essere controllata da software con STI
(che la forza a 1) o CLI
(che la forza a 0). |
|
DF |
(Direction
Flag, flag di Direzione):
indispensabile nella gestione delle stringhe ( MOVS
, STOS
o LODS
) per stabilire se i registri indice coinvolti (DI
o SI) devono essere incrementati (DF=0)
o decrementati (DF=1); può essere controllata
da software con STD
(che la forza a 1) o CLD
(che la forza a 0). |
 | Solo per completezza, a partire
dal 80286 sono disponibili 2 nuove flag e a partire
dal 80386 altre 3; in questo ultimo caso anche questo registro
(come gli altri) è a 32 bit, EFLAG,
aumentando di conseguenza anche il possibile numero di flag: |
|
31 |
|
|
|
|
|
|
24 |
23 |
|
|
|
|
|
|
16 |
15 |
|
|
|
|
|
|
8 |
7 |
|
|
|
|
|
|
0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
VM |
RF |
0 |
NT |
IOPL |
IOPL |
OF |
DF |
IF |
TF |
SF |
ZF |
0 |
AF |
0 |
PF |
1 |
CF |
 |
Le nuove sono: |
|
IOPL
|
(I/O Privilege Level,
livello di privilegio I/O),
disponibile già con 80286,
specifica (con i suoi 2 bit) uno dei 4 diversi livelli di privilegio
richiesti nelle operazioni di input/output |
|
NT |
(Nested Task Flag,
flag di task annidato),
disponibile già con 80286,
controlla il funzionamento di una istruzione IRET ed è normalmente uguale a
0 in modo reale. |
|
RF |
(Resume Flag,
flag di ripresa)
|
|
VM |
(Virtual
Mode Flag,
flag del modo virtuale) |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|