Generalmente il flusso di compilazione e assemblaggio è il seguente:
Il processo di assemblaggio si applica al programma modulo per modulo, dove ciascuno modulo sorgente costruisce il corrispondente modulo oggetto.
Esamina riga per riga il codice sorgente assembly di un modulo e ne traduce le istruzioni simboliche nel formato di linguaggio macchina:
Il segmento di ciascun modulo è assemblato in termini di indirizzi virtuali rilocabili.
Durante il processo di assemblaggio:
Nel primo passo l'assemblatore non traduce nessuna istruzione ma costruisce la tabella dei simboli del modulo. I riferimenti simbolici associati alla tabella possono essere:
.eqv
).I valori degli indirizzi inseriti sono quelli rilocabili rispetto al segmento considerato.
Una volta generata la tabella dei simboli del modulo, si genera la tabella di rilocazione.
Un'istruzione è tradotta in modo incompleto, e quindi va elaborata anche da parte del modulo se:
.data
.In corrispondenza di ogni traduzione incompleta viene creato un elemento della tabella di rilocazione, nella forma:
Un oggetto è composto da:
Il linker è il componente che ha il compito di collegare diversi moduli oggetto in un unico file eseguibile in formato binario.
Questo tuttavia ci da la limitazione di avere un solo spazio di indirizzamento per tutto il programma.
Il collegatore deve:
la
Siccome il segmento dati inizia dall'indirizzo:
La suddivisione dell'indirizzo nelle sue componenti per accedere a un dato in memoria, è ottenuta in modo automatico tramite assemblatore e collegatore facendo uso della pseudoistruzione la
. La traduzione di la
è come segue:
auipc rd, %pcrel_hi (VAR)
addi rd, rd, %pcrel_lo (VAR)
E il calcolo svolto dal collegatore è il seguente:
delta = indirizzo effettivo di VAR - PC di auipc
%hi (delta) e %lo (delta)
In fase di collegamento gli indirizzi definiti all'interno in un modulo possono cambiare se la base dello spazio di indirizzamento virtuale del modulo viene modificata. Pertanto, tutte le etichette che corrispondono a indirizzi assoluti all'interno del modulo costituiscono simboli il cui valore può cambiare al momento del collegamento.
Siccome l'assemblatore alloca la sezione testo e la sezione dati a partire dall'indirizzo base
Inoltre si crea la tabella dei simboli globale, che è costituita dall'unione delle tabelle dei simboli di tutti i moduli che vanno collegati. I simboli vengono modificati secondo l'indirizzo di base del modulo al quale appartengono.
Nei sistemi UNIX/LINUX, il kernel del sistema operativo ha il compito di caricare il programma nella memoria principale, predisponendone l'ambiente di lavoro, poi di lanciarne l'esecuzione e infine terminarlo.
In ordine il kernel svolte le seguenti operazioni:
main
del programma fa uso di argomenti, il nucleo li prepara nell'area reserved prevista nel modello di memoria.main
del programma.main
termina, la procedura di avvio riprende e conclude il programma tramite la chiamata di sistema exit
.