Registri e offset



Introduzione

Dunque prima di iniziare a parlare di registri, e soprattutto di assembly, occorre conoscere, agrandi linee, come è fatto un processore al suo interno.
Prenderò in esame un Intel 086:non spaventatevi però, anche se tutti abbiamo un 586 o 686, essi funzionano tutti con lo stesso principio di base, che è ciò che dobbiamo apprendere!

Un processore è formato da milioni di piccolissimi interruttori, ognuno di essi può essere acceso o spento rappresentando così il valore 0 oppure 1. Ecco,questo valore è il BIT ! Essa è la minima quantità di informazione che può essere "maneggiata" da un dispositivo elettronico!Ogni istruzione che la cpu esegue è formata da una serie di zeri e di uno (bits).

Ecco un promemoria con i loro nomi:

4 Bits = 1 Nibble
8 Bits = 1 Byte
16 Bits = 1 Word
32 Bits = 1 Dword

Ogni processore ha il proprio set di istruzioni, ed ad ogn'una di corrisponde un particolare opcode (OPeration-CODE) numerico che le associa univocamente ad una serie di bit

Es. istruzione=jmp(salta) opcode=7a ( in Hex )

Vediamo ora cosa accade quando, ad esempio, chiamiamo una funzione che somma 2 numeri:
Somma (a,b) sarebbe in C

A e B vengono entrambi salvati nello STACK con l'istruzione Push,
quindi vengono prelevati uno da uno con l'istruzione Pop,
e poi sommati con Sum e il risultato verrà anch'esso salvato nello STACK.

STACK=lo stack è un'area di memoria, allocata sin dall'inizio dal programma, dove vengono salvati i valori da utilizzare nel suo corso
Essa ha una struttura LIFO (Last In- First Out) , cioè l'ultimo che viene salvato sarà il primo ad essere prelevato, bisogna prestare molta attenzione a questa caratteristicha per evitare grossolani errori!

Push registro=salva il valore dell'argomento nello stack
Pop registro=preleva e mette nel registro che usiamo come argomento un valore dallo stack


Molto bene, siamo finalmente arrivati ai registri!
Un registro è semplicemente una piccola porzione di memoria interna del processore, tutto passa dai registri;sono un po' come delle variabili globali
Ecco i loro nomi e il loro uso

AxAccumulatore
BxPuntatore all'offset o indice
CxContatore per i cicli
DxResto delle divisioni,puntatore per operazioni di I/O
IpInstruction pointer=indirizzo della prossima istruzione da eseguire
IrPunta all'istruzione in esecuzione
SpStack pointer=puntatore allo stack
SiSource index=punta ai dati in arrivo
DiDestination index=punta ai dati in uscita
FlagsTengono traccia degli eventi


Occorre precisare che Cos'è il FETCH?
Quando il processore esegue un'istruzione mette l'indirizzo dell'istruzione che sta eseguendo in Ir e l'indirizzo della prossima viene messo in Ip;quando la cpu deve eseguire l'istruzione successiva il valore di Ip viene messo in Ir mentre in Ip si mette l'indirizzo dell'istruzione dopo e così via.

Segmenti & offset

Cominciamo col dire che tutta la confusione che desteranno segmenti e offset, è dovuta al fatto che gli ingegneri che parecchi anni fa progettarono i primi processori, ebbero la brillante idea, ma in relazione all'epoca chi può biasimarli(?), di utilizzare solo 1 misero Mb di memoria per indirizzare le istruzioni.
Per rappresentare 1 MB occorrono 20 bit, ma loro avevano solo 16 bit come fare allora?
Si decidette di progettare dei registri in due parti:Segmento e Offset
Es 1234(segmento):abcd(offset) ( in hex, pensate SEMPRE in hex)
16 bit per uno,hum facciamo 2 conti, 16 bit * 2 parti=32 bit totali,troppi per quel tempo!
Qua viene il trucco:
l'indirizzo seg:offset viene trattato così:
Ottengo in questo modo un indirizzo a 20 bit!Un po' ostico?Ma, no!
Nb. ottengo la stessa cosa se invece di moltiplicare per 16 eseguo uno shift a sinistra di 4 bit

E' vero che possiamo indirizzare 1 Mb di memoria, tuttavia la quantità realmente utilizzabile si restringe a 640 Kb, poichè gli altri sono usati dal Bios e dalla memoria video.




Coding center

Assembly language

Back to home