LINGUAGGIO ASSEMBLY (seconda parte)
------------------------------------------------------------------
grazie mille a tutti! quantomeno inizio a crearmi un immagine mentale.
potete consigliarmi qualche libro che mi chiarisca tutte queste idee?
p.s
attendo
@gronag per qualche esempio :D
Eccomi, sono tornato, prima di parlare del calcolo degli indirizzi occorre ricordare che la traduzione in linguaggio macchina riguarda solamente le istruzioni "esecutive", ossia quelle corrispondenti alle istruzioni macchina :sisi:
Ora, le istruzioni possono essere anche "dichiarative" e "direttive" :asd:
Le istruzioni dichiarative e direttive non corrispondono ad istruzioni in linguaggio macchina; attraverso un'istruzione dichiarativa si può fare riferimento ad un dato mediante un nome, senza conoscerne l'indirizzo, mentre una direttiva fornisce delle indicazioni all'assemblatore, il quale si incarica di seguirle durante la fase di traduzione.
Come fa l'assemblatore a calcolare gli indirizzi ?
Qui c'è un'ulteriore difficoltà poiché il calcolo degli indirizzi dipende dal "modello" di memoria adottato dal microprocessore :asd:
Esistono due tipi di modello di memoria: quello "contiguo" e quello "segmentato" (ad es. le CPU Intel X86 usano il modello a memoria segmentata).
Senza entrare in dettagli che appesantirebbero inutilmente la trattazione, diciamo che la memoria di programma viene chiamata "spazio logico" e gli indirizzi sono chiamati "logici".
Se lo spazio logico è diverso dallo "spazio fisico", in cui il programma viene eseguito, il codice dovrà essere "rilocabile".
Ecco che entra in gioco il "linker", il quale trasforma il codice oggetto in codice eseguibile.
In pratica l'eseguibile (lo spazio logico) può risiedere in un file memorizzato su un drive ma al momento dell'esecuzione il programma deve essere "spostato" in uno spazio fisico (in memoria centrale).
Facendo questa distinzione tra spazio fisico e spazio logico, il caricamento del programma avviene in modo "dinamico" (come accade ad esempio nel caso delle librerie DLL di Windows).
La "rilocazione" consiste proprio nel sostituire un indirizzo fisico a ciascun indirizzo logico.
A presto ;)
P.S. Gli indirizzi usati dal microprocessore 8086, del tipo segment:offset, sono effettivamente rilocabili: l'offset rappresenta la distanza rispetto al segmento iniziale, il registro di segmento contiene l'indirizzo iniziale di ciascun segmento, per cui sommando l'indirizzo del segmento d'inizio con l'offset si ottiene l'indirizzo voluto :asd: