graph TD A[Rete di Interconnessione - BUS] ==Media==> B[Interfacce] A ==Dati e Programmi==> C[Memoria Principale] A ==> D[Processore] D --> E[ALU] D --> F[FPU]
Processore
Il processore contiene i seguenti due blocchi:
ALU
La Arithmetic Logic Unit esegue operazioni logiche (AND, OR, NOT) e lavora con numeri naturali in base 2 oppure con numeri interi in Rappresentazione in Complemento a 2.
FPU
Floating Point Unit.
Il processore ciclicamente:
- preleva dal registro EIP_ la prossima istruzione da eseguire
- incrementa EIP del numero di byte dell’istruzione prelevata
- esegue l’istruzione
Le istruzioni vengono quindi eseguite nell’ordine in cui sono scritte nella memoria centrale, a meno di salti, istruzioni che modificano il registro EIP.
Registri
I registri sono locazioni di memoria interne, a 32bit, e sono generali o di Stato. Di alcuni registri si possono riferire parti ad 8bit. Ogni registro generale ha una parte a 16bit. Questi sono i registri che ci interessano:
General | Status |
---|---|
EAX - ah, ax, al | EIP |
EBX - bh, bx, bl | EF |
ECX - ch, cx, cl | |
EDX - dh, dx, dl | |
EBP - bp | |
ESI - si | |
EDI - di | |
ESP - sp | |
dove , , ed infine | |
General: | |
EAX = accumulatore = serve per memorizzare operandi di operazioni aritmetiche | |
EBX = base = indirizzo di base per accesso in memoria | |
ECX = counter = contatore per cicli (for ecc) | |
EDX = data = operandi per istruzioni aritmetiche | |
EBP = base pointer = utilizzato come registro base per accessi in memoria | |
ESI = source index = registro indice per accessi in memoria | |
EDI = destination index | |
ESP = stack pointer = usato per indirizzare la pila/stack, serve per gestire sottoprogrammi ed è una memoria soggetta a disciplina LIFO | |
Status: | |
EIP = instruction pointer/program counter = indirizzo della prossima istruzione, il suo contenuto è fissato al reset iniziale. Questa istruzione deve essere in ROM. | |
EF = extended flag register = ha 32 elementi detti flag, queste flagservono per indicare lo status del sistema: |
OF = overflow flag = se 1, durante l'esecuzione dell'ultima istruizione si ha avuto un overflow/traboccamento
SF = sign flag = ultima istruzione ha generato un risultato con $MSB = 1$: se l'istruzione operava su numeri interi, il risultato è un numero negativo.
ZF = zero flag = ultima istruzione ha generato risultato con tutti $0$
CF = carry flag = ultima istruzione ha generato un ___riporto___/prestito: se ultima istruzione operava sui naturali, il risultato non è rappresentabile.
Riassunto:
1. operazione su interi: guardare OF, SF, ZF (CF non significativo)
2. operazione su naturali: guardare CF, ZF (OF e SF non significativi)
DF = direction flag, STD set direction flag mette 1 (copia indietro), CDL clear direction flag mette 0 (copia in avanti).
E sta per extended, infatti prima i registri erano a 16bit, poi siamo passati a 32bit.
Condizioni al reset
I registri generali non sono rilevanti
- EIP vale
- vale la prima istruzione che si trova a quell’indirizzo
- un po’ di celle da quell’indirizzo in poi devono essere implementate in ROM (bootstrap)
- In EF i flag che ci interessano valgono 0.
Spazio di Memoria
Rappresentato da celle contigue, dalla capacità di un byte ciascuna, ogni cella è identificata da un numero a 32 bit (Informazione), detto indirizzo.
In Assembly gli indirizzi sono simbolici e vengono tradotti in parte dall’assemblatore, in parte a runtime, non è quindi cura del programmatore.
Questo spazio di memoria viene implementato nella Memoria, per cui il contenuto è casuale dopo un reset. Solo una parte, la ROM, conserva le informazioni dopo un reset, e possiede le istruzioni per il processore da eseguire dopo appunto un reset.
Il Processore accede, nel senso di leggere/scrivere, a locazioni che possono essere:
- singola (byte), a 8 bit
- doppia (word), a 16 bit
- quadrupla (long/doubleword), a 32 bit
Per l’accesso a locazioni doppie o quadruple, viene utilizzato l’indirizzo più piccolo delle 2 o 4 locazioni, l’indirizzo più grande contiene il bit più significativo.
Spazio di I/O
Questo ha porte, ognuna della capacità di un byte e con indirizzo a 16bit.
Raramente una singola porta svolge sia scrittura che lettura.
Il processore accede a lettura o scrittura tramite 2 istruzioni: IN e OUT.
È necessario conoscere gli indirizzi delle interfacce che si vogliono usare per accedervi.