Il primo microprocessore della famiglia x86 prodotto dalla Intel è l' 8088 che
entrò in produzione nel Giugno del 1978 !!!
L'8088 è un processore a 16 bit con un BUS esterno a 8 bit e con un clock da
4.77MHz (8-|).
Da allora se n'è fatta di strada (basti pensare al processore Pentium a 32 bit)
ma per questo tutorial per capire a grandi linee l'architettura di un processore
Intel farò riferimento all' 8086 (non preoccupatevi tutto quello che dirò vale
anche per i nuovi processori).
Allora per cominciare diamo un'occhiata al disegno qui sotto che rappresenta la
struttura interna di un 8086 :
Bus Dati -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ^ ^ | ^ ^ ^ ^ | ^ ^ ^ | | | | | | | ----- | v v v | | | | | | || AX | | BX CX DX | v v | v | | ----- | | ------ ------ | ------ ------ | | | ------ | SI | | DI | | | SP | | IP | | v v | IR | ------ ------ | ------ ------ | ------ ------ ------ | | | | | | \ \ / / | | | | | | | \ \/ / | | | | | | | \ ALU / ------ ---------- | | | | | | \------/--->|FLAG|----->|Control | | | | | | | | ------ ---------- | | | | | ----------| | | | | | v v v v v -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- Bus IndirizziLo schema è abbastanza semplice ma analizziamolo nel dettaglio.
|______| | | |______| SP --> | b | |______| | a | |______|Ora la procedura preleverà i due numeri dallo Stack con l'operazione di POP (attenzione all'ordine in cui vengono prelevati : prima b poi a !!!) ne effettuerà la somma e riporrà il risultato nello Stack:
|______| SP --> | ris | |______| ris = a + bA questo punto il programma chiamante dovrà solo prelevare il risultato dallo stack.
IR <- [[IP]] ; metto in IR il dato puntato dal contenuto di IP IP <- [IP] + 1 ; incremento il contenuto di IPPer chi non lo sapesse il fetch dell'istruzione consiste nel prelevamento e riconoscimento dell'istruzione da eseguire.
--------------------------------- | | | | | | | | | | | | | | | | | --------------------------------- |_____AH_______||_____AL________| |_______________AX________________|AX viene usato come destinazione nei calcoli matematici ( viene chiamato accumulatore). Va notato che cambiando il valore di AH e/o AL viene anche modificato il valore di AX !!
Registri di Segmento:
Nota: la differenza tra registro di segmento e di offset sarà chiarita nella sezione seguente (SEGMENTO e OFFSET).
CS - Code Segment : punta alla zona di memoria che contiene il codice.
DS - Data Segment : punta alla zona di memoria adibita al contenimento dei dati.
ES - Extra Segment : lo dice il nome, può essere usato come registro di segmento
ausiliario.
SS - Stack Segment : punta alla zona di memoria in cui risiede lo
stack. Attenzione a "giocare" con questo segmento!!
Per processori 386 e superiori esistono altri due registri di segmento FS e GS
che possono essere usati come supporto per le operazioni.
Esiste inoltre il registro di FLAG in cui vengono riportate alcune informazioni
circa le istruzioni in svolgimento, la sua struttura è la seguente:
_______________________________________ |11|10|F|E|D|C|B|A|9|8|7|6|5|4|3|2|1|0| --------------------------------------- | | | | | | | | | | | | | | | | | +--- CF Carry Flag | | | | | | | | | | | | | | | | +----- 1 | | | | | | | | | | | | | | | +------- PF Parity Flag | | | | | | | | | | | | | | +--------- 0 | | | | | | | | | | | | | +----------- AF Auxiliary Flag | | | | | | | | | | | | +------------- 0 | | | | | | | | | | | +--------------- ZF Zero Flag | | | | | | | | | | +----------------- SF Sign Flag | | | | | | | | | +------------------- TF Trap Flag (Single Step) | | | | | | | | +--------------------- IF Interrupt Flag | | | | | | | +----------------------- DF Direction Flag | | | | | | +------------------------- OF Overflow flag | | | | +----------------------------- IOPL I/O Privil. Level(286+ only) | | | +------------------------------- NT Nested Task Flag (286+ only) | | +--------------------------------- 0 | +----------------------------------- RF Resume Flag (386+ only) +-------------------------------------- VM Virtual Mode Flag (386+ only)Così se ad esempio dopo una sottrazione matematica il risultato è zero il bit relativo allo Zero Flag (bit 6) viene settato a 1.
21F2 * 10 = 21F20 + C0E1 = ------ 2E001Otteniamo così un indirizzo a 20 bit !! (Semplice vero: beh forse non tanto !). Spesso invece di moltiplicare il numero per 16 (10h) si effettua uno SHIFT a sinistra di 4 bit ma come vedremo è la stessa cosa.
Del Mega che si può indirizzare se ne può usare poi solo i primi 640Kb perchè i
rimanenti sono occupati dalla memoria video della VGA (a partire da A000:0000) e
dal BIOS e quindi non ce ne rimane molto !!!
Naturalmente esistono oggi tecniche per andare oltre il Megabyte come il
modo protetto o il metodo di indirizzamento FLAT (che non studieremo qui in questo
tutorial introduttivo).
Bene anche questa puntata è terminata abbiamo conosciuto alcuni elementi fondamentali che ci serviranno per scrivere programmi in Assembly. So che non vedete l'ora di scriverne uno ma dovete avere un po' di pazienza: per programmare in Assembly (non mi stancherò mai di ripeterlo) bisogna conoscere a fondo l'architettura del computer visto che è proprio quello che andiamo a programmare!!
Per conoscere meglio le architetture delle ultime generazioni di processori sul
sito http://www.intel.com nella sezione developer ci sono svariati manuali scaricabili
gratuitamente che spiegano dettagliatamente il funzionamento dei Pentium e dei
Pentium II nonchè di tutti gli altri processori Intel.
Assembly Page di Antonio |
|