2012-11-01 10 views
7

Sto cercando di capire il comportamento di GAS di .code16. Dal manuale, sembra nella sezione a 16 bit, per gli operandi o le istruzioni a 32 bit, verrà prodotto un prefisso override dell'operando 66H per la codifica dell'istruzione. Significa chePrefisso dimensione operando in modalità 16 bit

.code16 
movw %eax, %ebx 

è legale in tale modalità? Quindi il codice non può essere eseguito su un processore a 16 bit?

+0

Questo non è legale poiché il suffisso 'w' indica uno spostamento di 2 byte. 'movl% eax,% eax' è legale però. – fuz

risposta

10

Queste sono istruzioni legali per 80386+. A partire dall'80386 possiamo usare prefissi operandi- e addresssize- override. Questi prefissi possono essere utilizzati in combinazione con la modalità di indirizzo a 16 bit e con la modalità di indirizzo a 32 bit. Inoltre può essere utilizzato con la modalità indirizzo reale e con la modalità protetta e la modalità 86 virtuale. Questi prefissi invertono l'operando predefinito e/o l'indirizzo per una istruzione nel codesegment. L'operando predefinito e il formato dell'indirizzo sono specificati dal flag D nel descrittore del segmento di codice (o se non c'è GDT/LDT, allora diventiamo la modalità di indirizzo a 16 bit dopo che il processo POST del bios è terminato)

Con la modalità di indirizzo a 16 bit dobbiamo aggiungere quei prefissi, se vogliamo usare operandi a 32 bit e/o indirizzi a 32 bit. Senza questi prefissi possiamo usare solo indirizzi/operandi a 16 bit nella modalità di indirizzo a 16 bit.

Con la modalità di indirizzo a 32 bit dobbiamo escludere questi prefissi dal nostro codice, se vogliamo utilizzare operandi a 32 bit e/o indirizzi a 32 bit. E se aggiungiamo questi prefissi al nostro codice, allora possiamo usare gli indirizzi/operandi a 16 bit nella modalità indirizzo a 32 bit.

Blockquote Intel:

prefissi istruzione può essere utilizzato per ignorare la dimensione e l'indirizzo dimensione predefinita operando di un segmento di codice. Questi prefissi possono essere utilizzati in modalità indirizzo reale, nonché in modalità protetta e in modalità 8086 virtuale. Un prefisso dimensione operando o indirizzo cambia solo la dimensione per la durata dell'istruzione.

I seguenti due prefissi istruzioni permettono miscelazione delle operazioni a 32 bit e 16 bit entro un segmento: • Il prefisso operando dimensioni (66H) • Il prefisso di indirizzo-dimensioni (67H)

Questi prefissi Invertire la dimensione predefinita selezionata dal flag D nel descrittore del segmento di codice. Ad esempio, il processore può interpretare l'istruzione (MOV mem, reg) in uno dei quattro modi: • In un segmento di codice a 32 bit: - Sposta 32 bit da un registro a 32 bit alla memoria utilizzando un efficace a 32 bit indirizzo. -Se preceduto da un prefisso dimensione operando, sposta in memoria 16 bit da un registro a 16 bit utilizzando un indirizzo effettivo a 32 bit. -Se preceduto da un prefisso dimensione indirizzo, sposta 32 bit da un registro a 32 bit in memoria utilizzando un indirizzo effettivo a 16 bit. -Se preceduto sia da un prefisso dimensione indirizzo che da un prefisso dimensione operando, sposta 16 bit da un registro a 16 bit in memoria utilizzando un indirizzo effettivo a 16 bit.

• In un segmento di codice a 16 bit: - Sposta 16 bit da un registro a 16 bit in memoria utilizzando un indirizzo effettivo a 16 bit. -Se preceduto da un prefisso dimensione operando, sposta 32 bit da un registro a 32 bit alla memoria utilizzando un indirizzo effettivo a 16 bit. -Se preceduto da un prefisso dimensione indirizzo, sposta in memoria 16 bit da un registro a 16 bit utilizzando un indirizzo effettivo a 32 bit. -Se preceduto da un prefisso di dimensione dell'indirizzo e un prefisso di dimensione dell'operando, sposta 32 bit da un registro a 32 bit in memoria utilizzando un indirizzo effettivo a 32 bit.

Gli esempi precedenti mostrano che qualsiasi istruzione può generare qualsiasi combinazione di dimensioni di operando e dimensione di indirizzo indipendentemente dal fatto che l'istruzione si trovi in ​​un segmento a 16 o 32 bit. La scelta del valore predefinito a 16 o 32 bit per un segmento di codice si basa in genere sui seguenti criteri: • Prestazioni: utilizzare sempre segmenti di codice a 32 bit quando possibile. Funzionano molto più velocemente dei segmenti di codice a 16 bit sui processori della famiglia P6 e un po 'più velocemente sui precedenti processori IA-32. • Il sistema operativo su cui verrà eseguito il segmento di codice: se il sistema operativo è un sistema operativo a 16 bit, potrebbe non supportare i moduli di programma a 32 bit. • Modalità di funzionamento: se il segmento di codice viene progettato per essere eseguito in modalità indirizzo reale, modalità 8086 virtuale o SMM, deve essere un segmento di codice a 16 bit. • Compatibilità con i precedenti processori IA-32 precedenti - Se un segmento di codice deve essere in grado di funzionare su un processore Intel 8086 o Intel 286, deve essere un segmento di codice a 16 bit.

L'indicatore D in un descrittore del codice di un segmento determina la dimensione dell'operando e la dimensione dell'indirizzo predefinite per le istruzioni di un segmento di codice. (In modalità indirizzo reale e modalità 8086 virtuale, che non utilizzano descrittori di segmento, il valore predefinito è 16 bit.) Un segmento di codice con il set di flag D è un segmento a 32 bit; un segmento di codice con il suo flag D chiaro è un segmento a 16 bit.

Segmento di codice eseguibile. Il flag è chiamato D flag e indica la lunghezza predefinita per gli indirizzi effettivi e gli operandi a cui fanno riferimento le istruzioni nel segmento. Se il flag è impostato, si assumono gli indirizzi a 32 bit e gli operandi a 32 o 8 bit; se è chiaro, si assumono gli indirizzi a 16 bit e gli operandi a 16 o 8 bit. Il prefisso di istruzioni 66H può essere utilizzato per selezionare una dimensione dell'operando diversa da quella predefinita e il prefisso 67H può essere utilizzato selezionare una dimensione di indirizzo diversa da quella predefinita.

Il prefisso di operando a 32 bit può essere utilizzato nei programmi in modalità indirizzo reale per eseguire le istruzioni di forma a 32 bit. Questo prefisso consente inoltre ai programmi in modalità indirizzo reale di utilizzare i registri general purpose a 32 bit del processore. Il prefisso di indirizzo a 32 bit può essere utilizzato nei programmi in modalità indirizzo reale, consentendo gli offset a 32 bit.

I processori IA-32 che iniziano con il processore Intel386 possono generare offset a 32 bit utilizzando un prefisso di override dell'indirizzo; tuttavia, in modalità indirizzo reale, il valore di uno scostamento a 32 bit non può superare FFFFH senza causare un'eccezione.

Assembler Utilizzo: Se un segmento di codice che verrà eseguito in modalità indirizzo reale è definito, deve essere impostato su un attributo USE 16. Se un operando a 32 bit viene utilizzato in un'istruzione in questo segmento di codice (ad esempio, MOV EAX, EBX), l'assembler genera automaticamente un prefisso dell'operando per l'istruzione che forza il processore a eseguire un'operazione a 32 bit, anche se il suo l'attributo del codice di default è 16 bit.

Il prefisso di operando a 32 bit consente a un programma in modalità indirizzo reale di utilizzare i registri generici a 32 bit (EAX, EBX, ECX, EDX, ESP, EBP, ESI e EDI).

Quando si spostano i dati in modalità a 32 bit tra un registro di segmento e un registro a scopo generale a 32 bit, il processore Pentium Pro non richiede l'uso di un prefisso di dimensione operando a 16 bit; tuttavia alcuni assemblatori richiedono questo prefisso. Il processore presume che i 16 bit meno significativi del registro generale siano i destinatari di destinazione o di origine. Quando si sposta un valore da un selettore di segmento a un registro a 32 bit, il processore riempie i due byte di ordine superiore di il registro con zero.

Blockquote AMD:

3.3.2. Dimensioni degli indirizzi e degli operandi a 32 bit rispetto a 16 bit Il processore può essere configurato per le dimensioni degli indirizzi e degli operandi a 32 bit o 16 bit. Con le dimensioni degli indirizzi e degli operandi a 32 bit , l'offset o l'offset del segmento massimo è FFFFFFFFF (2^32-1) e le dimensioni degli operandi sono tipicamente di 8 bit o 32 bit. Con le dimensioni degli operandi e degli indirizzi a 16 bit, l'indirizzo lineare massimo o l'offset del segmento è FFFFH (2^16-1) e le dimensioni degli operandi sono tipicamente 8 bit o 16 bit. Quando si utilizza l'indirizzamento a 32 bit, un indirizzo logico (o puntatore remoto) è costituito da un selettore del segmento a 16 bit e uno spostamento a 32 bit; quando si utilizza l'indirizzamento a 16 bit, è costituito da un selettore di segmento a 16 bit e uno spostamento a 16 bit. I prefissi delle istruzioni consentono di eseguire l'override temporaneo dell'indirizzo predefinito e/o delle dimensioni degli operandi da all'interno di un programma. Quando si opera in modalità protetta, il descrittore di segmento per il segmento di codice attualmente in esecuzione definisce l'indirizzo predefinito e la dimensione dell'operando. Un descrittore di segmento è una struttura di dati di sistema non normalmente visibile al codice dell'applicazione. Le direttive Assembler consentono di scegliere l'indirizzo di default e la dimensione dell'operando per un programma. L'assemblatore e altri strumenti quindi impostano sul descrittore di segmento per il segmento di codice in modo appropriato. Quando si opera in modalità indirizzo reale, le dimensioni di indirizzamento e operando predefinite sono 16 bit. Un override della dimensione dell'indirizzo può essere utilizzato in modalità indirizzo reale per abilitare l'indirizzamento a 32 bit; tuttavia, l'indirizzo lineare a 32 bit massimo consentito da è ancora 000FFFFFH (2^20-1).

3.6. ATTRIBUTI DI TAGLIE DI DIMENSIONI DEL FORMATO E DI INDIRIZZO Quando il processore è in esecuzione in modalità protetta, ogni segmento di codice ha un attributo di dimensioni di operando e un attributo di dimensione dell'indirizzo. Questi attributi sono selezionati con il flag D (dimensione predefinita) nel descrittore di segmento per il segmento di codice (consultare Capitolo 3, Memoria in modalità protetta, Gestione, nel Manuale dello sviluppatore del software Intel Architecture, Volume 3). Quando viene impostato il flag D , vengono selezionati gli attributi operad-size e address-size a 32 bit; quando il flag è chiaro, gli attributi di dimensione a 16 bit sono selezionati. Quando il processore è in esecuzione in modalità indirizzo reale, in modalità virtuale 8086 o SMM (modalità di gestione del sistema), gli attributi di dimensione e di indirizzo di default sono sempre 16 bit. L'attributo dimensione operando seleziona le dimensioni degli operandi su cui operano le istruzioni. Quando è in vigore l'attributo dimensione operando a 16 bit , gli operandi possono generalmente essere 8 bit o 16 bit e quando l'attributo dimensione operando a 32 bit è in vigore, gli operandi possono generalmente essere 8 bit o 32 bit. L'attributo dimensione indirizzo seleziona le dimensioni degli indirizzi utilizzati per indirizzare la memoria: 16 bit o 32 bit. Quando l'attributo di dimensione indirizzo a 16 bit è in vigore, gli scostamenti e gli spostamenti di segmento sono 16 bit. Questa restrizione limita la dimensione di un segmento che può essere indirizzato a 64 KByte. Quando è attivo l'attributo di dimensione dell'indirizzo a 32 bit , gli scostamenti e gli spostamenti di segmento sono di 32 bit, consentendo di indirizzare i segmenti fino a 4 GByte. L'attributo dimensione-operando predefinito e/o l'attributo dimensione-indirizzo possono essere sovrascritti per una particolare istruzione aggiungendo un prefisso dimensione operando e/o indirizzo a un'istruzione (vedere "Prefissi istruzioni" nel capitolo 2 del Intel Architecture Software Developer's Manual, Volume 3).L'effetto di questo prefisso si applica solo all'istruzione a cui è collegato. La tabella 3-1 mostra le dimensioni effettive degli operandi e le dimensioni degli indirizzi (quando si esegue in modalità protetta) a seconda delle impostazioni del flag D e dei prefissi dimensione operando e indirizzo.

Dirk

Problemi correlati