Sezione |
Indirizzi Base
Registri Interni
|
Capitolo 1 |
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:
|
|
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) |
|
Capitolo 1 | PROCESSORE 80x86 11/14 | |||||||
22 di 60 |
|
|
|
|
Home |
|
|||||||
|
Motore Ricerca |
|