L'architettura IA-32 è compatibile con le precedenti, pertanto è possibile fare funzionare il processore in real-mode. In questa modalità il processore funziona come un 8086 e gestisce la memoria secondo il modello segmentato.
Per la gestione segmentata, il processore usa due registri speciali a 16 bit, chiamati registri segmento, che contengono rispettivamente l'indirizzo base del segmento codice e l'indirizzo base del segmento dati. Questi due registri vengono indicati con CS (Code Segment) e DS (Data Segment).
Per eseguire un programma il SO deve caricare in CS e DS i rispettivi BA dei segmenti codice e dati.Il processore dispone inoltre di un registro a 16 bit, chiamato IP (Instruction Pointer) che contiene l'offset dell'istruzione corrente.
La situazione è illustrata in figura.
Il SO carica in IP l'offset della prima istruzione del programma da eseguire. Successivamente IP scatta automaticamente di tanti byte quanti sono quelli che compongono l'opcode dell'istruzione in modo che il processore può eseguire in successione tutte le istruzioni del programma
Il processore dispone di altri registri che adopera come una sorta di memoria interna per velocizzare l'elaborazione dei dati.
Nelle due figure seguenti vengono illustrati i due set di registri quando lavora come un processore a 16 bit e a 32 bit
Le istruzioni si dividono in gruppi funzionali. Ci occuperemo per ora dei seguenti tre gruppi:
Trasferimento
Aritmetico-logico
Salto
A questo gruppo appartengono le istruzioni che permettono di trasferire dati da un generica sorgente ad una destinazione. I trasferimenti possono avvenire fra
registri
memoria-registri e viceversa
dispositivi I/O- registri e viceversa
Il codice simbolico per iI primi due tipi è :
mov destinazione, sorgente
Sono possibili le seguenti operazioni:
Trasferimento di un dato immediato in un registro
Esempio: mov ax,3 - mov ah,4Ch , mov sp,FA2Ch
Si può usare qualunque registro tranne IP, FLAGS e i registri segmento
Trasferimento fra registri
Esempi: mov si,bx ; mov ch,bl ; mov ds,ax
Si può usare qualunque coppia di registri esclusi IP e FLAGS
Trasferimento da memoria a registro e viceversa
Si deve specificare un offset dentro uno specifico segmento
Se non si specifica il segmento di appartenenza si assume che sia il segmento puntato da DS
Si può usare qualunque registro
Ha diverse modalità che verranno illustrate fra breve
Trasferimento di un dato immediato in memoria
ha le stesse modalità del trasferimento memoria- registro, ma bisogna specificare l'estensione del dato da trasferire (il tipo)
Trasferimento memoria - registro
Ha due modalità: trasferimento diretto e con puntatore
Nel trasferimento diretto occorre specificare l'offset della locazione in cui o da cui trasferire il dato. Pentium assume come segmento di default quello puntato da DS . La sintassi dell'istruzione è
mov reg, [offset] trasferisci il dato all'offset specificato nel registro reg
mov [offset], reg trasferisci il contenuto del registro reg all'offset specificato
Esempi:
Se si vuole effettuare un trasferimento dati utilizzando un segmento diverso da quello puntato da DS, si deve specificare il registro segmento contenente l'indirizzo base.
Per esempio se vogliamo trasferire il contenuto di ax all'offset 0600 del segmento dati puntato da ES dibbiamo scrivere:
mov ES:[0600],ax
Trasferimento di un dato immediato in memoria
Per effettuare il trasferimento di un dato in memoria senza passare da un registro dobbiamo specificare
Esempi:
mov [0824], WORD ptr 5, il 5 viene considerato una word
mov [0100], DWORD ptr 4AB2h, il 4AB2 viene considerato una doppia word
mov [0100], BYTE ptr B2h, il B2 viene considerato un byte
Concludiamo con due figure in cui è illustrato il processo di esecuzione di due istruzioni