Sei sulla pagina 1di 4

Assembler, Linker & Loader 1

Architetture Architetture dei dei Calcolatori Calcolatori


( (Lettere Lettere A A- -I) I)
Assemblatore Assemblatore, Linker e Loader , Linker e Loader
Prof. Francesco Lo Presti Prof. Francesco Lo Presti
Assembler, Linker & Loader 2
Compilazione Compilazione
Nella prima fase, il programma ad alto livello viene tradotto Nella prima fase, il programma ad alto livello viene tradotto
nel linguaggio assembler utilizzando un apposito programma nel linguaggio assembler utilizzando un apposito programma
detto detto compilatore compilatore
Dopo la fase di compilazione, il programma scritto il Dopo la fase di compilazione, il programma scritto il
linguaggio assembler viene tradotto in linguaggio macchina linguaggio assembler viene tradotto in linguaggio macchina
utilizzando un apposito programma detto utilizzando un apposito programma detto assemblatore assemblatore
(assembler) (assembler)
Spesso con il termine compilazione si indica l Spesso con il termine compilazione si indica l intero processo intero processo
di traduzione da linguaggio ad alto livello a linguaggio di traduzione da linguaggio ad alto livello a linguaggio
macchina (essendo l macchina (essendo l assemblatore spesso integrato con il assemblatore spesso integrato con il
compilatore) compilatore)
Assembler, Linker & Loader 3
Il processo di compilazione Il processo di compilazione
Il programma sorgente Il programma sorgente
scritto in un linguaggio ad scritto in un linguaggio ad
alto livello (ad es., C) alto livello (ad es., C)
Il codice oggetto, scritto Il codice oggetto, scritto
in linguaggio macchina, in linguaggio macchina,
viene memorizzato su viene memorizzato su
disco disco
Il caricatore ( Il caricatore (loader loader) )
carica il programma in carica il programma in
memoria principale per memoria principale per
l l esecuzione esecuzione
Programma sorgente
Programma in linguaggio assembler
hello.c
compilatore
hello.s
Programma in linguaggio
macchina (codice oggetto)
hello.out
assemblatore
caricatore
Programma in memoria
Assembler, Linker & Loader 4
Il Il linker linker
Il Il linker linker ( (link link editor o editor o collegatore collegatore) ha il compito di collegare tra ) ha il compito di collegare tra
loro vari moduli che compongono lo stesso programma loro vari moduli che compongono lo stesso programma
Programma sorgente suddiviso in pi Programma sorgente suddiviso in pi file che vengono compilati file che vengono compilati
separatamente creando diversi file oggetto separatamente creando diversi file oggetto
Utilizzo di funzioni di libreria Utilizzo di funzioni di libreria
Il Il linker linker collega tra loro i file contenenti il codice oggetto dei collega tra loro i file contenenti il codice oggetto dei
vari moduli che costituiscono il programma, unendovi anche il vari moduli che costituiscono il programma, unendovi anche il
codice delle funzioni di libreria utilizzate, producendo un file codice delle funzioni di libreria utilizzate, producendo un file
contenente il codice eseguibile, memorizzato su disco contenente il codice eseguibile, memorizzato su disco
Assembler, Linker & Loader 5
Esempio Esempio
. gl obl mai n
mai n: . . .
j al pr oc
. . .
. gl obl pr oc
pr oc: addi $sp, $sp, - 20
. . .
beq $s0, $zer o, r et
addi $a0, $s0, - 1
addi $a1, $s1, 0
addi $a2, $s2, 0
j al pr oc
addi $s3, $v0, 0
addi $a0, $s0, 0
addi $a1, $s1, 0
addi $a2, $s2, 0
j al i s_i n
beq $v0, $zer o, el se2
sl l $s3, $s3, 1
addi $s3, $s3, 1
j r et
el se2: addi $s3, $s3, 2
r et : addi $v0, $s3, 0
. . .
addi $sp, $sp, 20
j r $r a
. gl obl i s_i n
i s_i n: addi $t 0, $zer o, 0
addi $t 1, $zer o, 0
whi l e: sl t $t 2, $t 0, $a2
beq $t 2, $zer o, end
sl l $t 3, $t 0, 2
add $t 3, $a1, $t 3
l w $t 4, 0( $t 3)
bne $t 4, $a0, i nc
addi $t 1, $zer o, 1
j end
i nc: addi $t 0, $t 0, 1
j whi l e
end: addi $v0, $t 1, 0
j r $r a
Assembler, Linker & Loader 6
L L assemblatore assemblatore
Traduce un modulo in assembler in un file oggetto Traduce un modulo in assembler in un file oggetto
Una combinazione di Una combinazione di
Istruzioni in linguaggio macchina Istruzioni in linguaggio macchina
Dati Dati
Informazioni per la corretta collocazione del modulo in memoria: Informazioni per la corretta collocazione del modulo in memoria:
Rilocazione Rilocazione
Esempio Esempio
Per poter tradurre in linguaggio macchina le istruzioni di salto Per poter tradurre in linguaggio macchina le istruzioni di salto, ,
l l assemblatore deve poter determinare gli indirizzi corrispondenti assemblatore deve poter determinare gli indirizzi corrispondenti alle alle
etichette usate nei salti ( etichette usate nei salti (tabella dei simboli tabella dei simboli) )
Tabella dei simboli Tabella dei simboli: contiene le corrispondenze tra nomi delle : contiene le corrispondenze tra nomi delle
etichette (simboli) ed indirizzi di memoria etichette (simboli) ed indirizzi di memoria
Il file oggetto prodotto dall Il file oggetto prodotto dall assemblatore assume che il assemblatore assume che il
modulo parta dalla locazione di memoria 0 (indirizzi relativi) modulo parta dalla locazione di memoria 0 (indirizzi relativi)
Sar Sar il il linker linker a gestire la a gestire la rilocazione rilocazione
Istruzioni dipendenti da un indirizzo assoluto Istruzioni dipendenti da un indirizzo assoluto
Assembler, Linker & Loader 7
Il processo di assemblaggio Il processo di assemblaggio
Il processo di traduzione in linguaggio macchina Il processo di traduzione in linguaggio macchina semplice, semplice,
salvo per le istruzioni con riferimenti a etichette locali non salvo per le istruzioni con riferimenti a etichette locali non
ancora dichiarate ( ancora dichiarate (riferimenti in avanti riferimenti in avanti: l : l etichetta etichetta usata usata
prima di essere definita) prima di essere definita)
Assemblatore a due passate Assemblatore a due passate
Prima passata Prima passata: calcola la lunghezza delle istruzioni e genera una : calcola la lunghezza delle istruzioni e genera una
tabella dei simboli, contenente l tabella dei simboli, contenente l associazione tra i nomi delle associazione tra i nomi delle
etichette ed i corrispondenti indirizzi di memoria etichette ed i corrispondenti indirizzi di memoria
Seconda passata Seconda passata: tutti i riferimenti locali sono noti: usando la : tutti i riferimenti locali sono noti: usando la
tabella dei simboli, pu generare il codice macchina tabella dei simboli, pu generare il codice macchina
Assemblatore ad una passata Assemblatore ad una passata
Traduce in codice binario tutte le istruzioni tranne quelle con Traduce in codice binario tutte le istruzioni tranne quelle con
riferimenti in avanti (tecnica del riferimenti in avanti (tecnica del backpatching backpatching) )
Mette queste istruzioni in una tabella dei simboli irrisolti Mette queste istruzioni in una tabella dei simboli irrisolti
Alla fine traduce anche queste Alla fine traduce anche queste
Maggiore velocit Maggiore velocit ma intera rappresentazione binaria in memoria ma intera rappresentazione binaria in memoria
Assembler, Linker & Loader 8
Struttura del file oggetto Struttura del file oggetto
Nei sistemi Nei sistemi Unix Unix, il file oggetto , il file oggetto composto da 6 sezioni distinte composto da 6 sezioni distinte
Object Object file file header header (intestazione) (intestazione)
Dimensione e posizione delle altre parti del file oggetto Dimensione e posizione delle altre parti del file oggetto
Segmento di testo Segmento di testo
Codice in linguaggio macchina per le procedure nel file sorgente Codice in linguaggio macchina per le procedure nel file sorgente; ;
possono esserci riferimenti irrisolti (istruzioni contenenti rif possono esserci riferimenti irrisolti (istruzioni contenenti riferimenti a erimenti a
simboli esterni) simboli esterni)
Segmento di dati Segmento di dati
Rappresentazione binaria dei dati Rappresentazione binaria dei dati
Informazioni di Informazioni di rilocazione rilocazione
Identificazione di istruzioni e dati da aggiornare al momento de Identificazione di istruzioni e dati da aggiornare al momento della lla
rilocazione rilocazione, in quanto dipendenti da indirizzi di memoria assoluti , in quanto dipendenti da indirizzi di memoria assoluti
Tabella dei simboli Tabella dei simboli
Simboli definiti nel modulo e Simboli definiti nel modulo e riferibili dall riferibili dall esterno esterno (etichette globali) e (etichette globali) e
lista dei lista dei riferimenti irrisolti riferimenti irrisolti (ad es. per uso di funzioni di libreria) (ad es. per uso di funzioni di libreria)
Informazioni per il Informazioni per il debugger debugger
Descrizione concisa del modo in cui il programma Descrizione concisa del modo in cui il programma stato compilato stato compilato
Assembler, Linker & Loader 9
Esempio: Primo Passata Esempio: Primo Passata
Etichetta Etichetta Indirizzo Indirizzo
proc proc 0x00 0x00
else2 else2 0x60 0x60
ret ret 0x64 0x64
. gl obl pr oc
pr oc: addi $sp, $sp, - 20
. . .
beq $s0, $zer o, r et
addi $a0, $s0, - 1
addi $a1, $s1, 0
addi $a2, $s2, 0
j al pr oc
addi $s3, $v0, 0
addi $a0, $s0, 0
addi $a1, $s1, 0
addi $a2, $s2, 0
j al i s_i n
beq $v0, $zer o, el se2
sl l $s3, $s3, 1
addi $s3, $s3, 1
j r et
el se2: addi $s3, $s3, 2
r et : addi $v0, $s3, 0
. . .
addi $sp, $sp, 20
j r $r a
Tabella dei Simboli
Assembler, Linker & Loader 10
Esempio: Secondo Passata Esempio: Secondo Passata
. gl obl pr oc
pr oc: addi $sp, $sp, - 20
. . .
beq $s0, $zer o, r et
addi $a0, $s0, - 1
addi $a1, $s1, 0
addi $a2, $s2, 0
j al pr oc
addi $s3, $v0, 0
addi $a0, $s0, 0
addi $a1, $s1, 0
addi $a2, $s2, 0
j al i s_i n
beq $v0, $zer o, el se2
sl l $s3, $s3, 1
addi $s3, $s3, 1
j r et
el se2: addi $s3, $s3, 2
r et : addi $v0, $s3, 0
. . .
addi $sp, $sp, 20
j r $r a
addi $sp, $sp, - 20
. . .
beq $s0, $zer o, 14
addi $a0, $s0, - 1
addi $a1, $s1, 0
addi $a2, $s2, 0
j al 0x0
addi $s3, $v0, 0
addi $a0, $s0, 0
addi $a1, $s1, 0
addi $a2, $s2, 0
j al ???
beq $v0, $zer o, 3
sl l $s3, $s3, 1
addi $s3, $s3, 1
j 0x64
addi $s3, $s3, 2
addi $v0, $s3, 0
. . .
addi $sp, $sp, 20
j r $r a
Generazione
Codice
Macchina
Etichetta Etichetta Indirizzo Indirizzo
proc proc 0x00 0x00
else2 else2 0x60 0x60
ret ret 0x64 0x64
Tabella dei Simboli
Etichetta Etichetta Indirizzo Indirizzo
proc proc 0x00 0x00
is_in is_in 0x4B 0x4B
Tabella dei Simboli
Istr Istr. . Indirizzo Indirizzo
jal jal 0x38 0x38
jal jal 0x4B 0x4B
j j 0x5B 0x5B
Relocation Information
Assembler, Linker & Loader 11
Il Il linker linker
Ciascun modulo ha il suo spazio degli indirizzi Ciascun modulo ha il suo spazio degli indirizzi
Quando i moduli vengono collegati occorre Quando i moduli vengono collegati occorre traslare traslare i loro spazi degli i loro spazi degli
indirizzi indirizzi
Occorre risolvere tutti i riferimenti esterni Occorre risolvere tutti i riferimenti esterni tramite etichette tramite etichette
globali globali - - ossia le chiamate tra moduli e riferimenti a variabili ossia le chiamate tra moduli e riferimenti a variabili
globali globali
Compiti del Compiti del linker linker (a partire dalla tabella dei simboli e dalle (a partire dalla tabella dei simboli e dalle
informazioni di informazioni di rilocazione rilocazione) )
Porre simbolicamente in memoria istruzioni e dati Porre simbolicamente in memoria istruzioni e dati
Determinare gli indirizzi dei dati e delle etichette dei salti Determinare gli indirizzi dei dati e delle etichette dei salti
Unire i riferimenti interni ed esterni alle procedure Unire i riferimenti interni ed esterni alle procedure
Il Il linker linker produce un file oggetto che pu essere eseguito sulla produce un file oggetto che pu essere eseguito sulla
macchina macchina
Stesso formato del file oggetto ma con tutti i riferimenti risol Stesso formato del file oggetto ma con tutti i riferimenti risolti e ti e
senza informazioni di senza informazioni di rilocazione rilocazione
Assembler, Linker & Loader 12
Esempio Esempio
. . .
j al ???
. . .
addi $t 0, $zer o, 0
addi $t 1, $zer o, 0
sl t $t 2, $t 0, $a2
beq $t 2, $zer o, 8
sl l $t 3, $t 0, 2
add $t 3, $a1, $t 3
l w $t 4, 0( $t 3)
bne $t 4, $a0, 2
addi $t 1, $zer o, 1
j 0x30
addi $t 0, $t 0, 1
j 0x08
addi $v0, $t 1, 0
j r $r a
addi $sp, $sp, - 20
. . .
beq $s0, $zer o, 14
addi $a0, $s0, - 1
addi $a1, $s1, 0
addi $a2, $s2, 0
j al 0x00
addi $s3, $v0, 0
addi $a0, $s0, 0
addi $a1, $s1, 0
addi $a2, $s2, 0
j al ???
beq $v0, $zer o, 3
sl l $s3, $s3, 1
addi $s3, $s3, 1
j 0x64
addi $s3, $s3, 2
addi $v0, $s3, 0
. . .
addi $sp, $sp, 20
j r $r a
0x400000
0x4000AC
0x4000B0
0x400120
0x400124
0x400158
Assembler, Linker & Loader 13
Esempio Esempio
. . .
j al 0x4000B0
. . .
addi $t 0, $zer o, 0
addi $t 1, $zer o, 0
sl t $t 2, $t 0, $a2
beq $t 2, $zer o, 8
sl l $t 3, $t 0, 2
add $t 3, $a1, $t 3
l w $t 4, 0( $t 3)
bne $t 4, $a0, 2
addi $t 1, $zer o, 1
j 0x400154
addi $t 0, $t 0, 1
j 0x40012B
addi $v0, $t 1, 0
j r $r a
addi $sp, $sp, - 20
. . .
beq $s0, $zer o, 14
addi $a0, $s0, - 1
addi $a1, $s1, 0
addi $a2, $s2, 0
j al 0x4000B0
addi $s3, $v0, 0
addi $a0, $s0, 0
addi $a1, $s1, 0
addi $a2, $s2, 0
j al 0x400124
beq $v0, $zer o, 3
sl l $s3, $s3, 1
addi $s3, $s3, 1
j 0x400104
addi $s3, $s3, 2
addi $v0, $s3, 0
. . .
addi $sp, $sp, 20
j r $r a
0x400000
0x4000AC
0x4000B0
0x400120
0x400124
0x400158
Assembler, Linker & Loader 14
Istruzioni MIPS da Istruzioni MIPS da Rilocare Rilocare
Indirizzi relativi al PC (istruzioni Indirizzi relativi al PC (istruzioni beq beq e e bne bne): da ): da
non non rilocare rilocare
L L indirizzamento relativo al PC indirizzamento relativo al PC preservato anche se il preservato anche se il
codice viene spostato codice viene spostato
Indirizzi assoluti (istruzioni j e Indirizzi assoluti (istruzioni j e jal jal): da ): da rilocare rilocare
sempre sempre
Da Da rilocare rilocare anche istruzioni anche istruzioni lw lw e e sw sw che utilizzano che utilizzano
il registro il registro $gp $gp per indirizzare dati statici per indirizzare dati statici
Riferimenti esterni (tipicamente istruzione Riferimenti esterni (tipicamente istruzione jal jal): da ): da
rilocare rilocare sempre sempre
Assembler, Linker & Loader 15
Il Il loader loader
Una volta che il Una volta che il linker linker ha creato il file eseguibile, ha creato il file eseguibile,
esso viene di solito memorizzato su disco esso viene di solito memorizzato su disco
All All atto dell atto dell esecuzione, il S.O. lo carica dal disco e esecuzione, il S.O. lo carica dal disco e
ne avvia l ne avvia l esecuzione esecuzione
Il Il loader loader si occupa di far partire il programma si occupa di far partire il programma
Legge l Legge l intestazione per determinare la dimensione dei intestazione per determinare la dimensione dei
segmenti testo e dati segmenti testo e dati
Crea uno spazio di memoria sufficiente per testo e dati Crea uno spazio di memoria sufficiente per testo e dati
Copia istruzioni e dati in memoria Copia istruzioni e dati in memoria
Copia nello Copia nello stack stack i parametri (se presenti) passati al i parametri (se presenti) passati al main main
Inizializza Inizializza i registri e lo i registri e lo stack stack pointer pointer
Salta ad una procedura di Salta ad una procedura di inizializzazione inizializzazione che copia i che copia i
parametri nei registri appositi dallo parametri nei registri appositi dallo stack stack e poi invoca la e poi invoca la
procedura di inizio del programma ( procedura di inizio del programma (main main() in C) () in C)
Assembler, Linker & Loader 16
Librerie collegate dinamicamente Librerie collegate dinamicamente
Svantaggi del collegamento statico (prima Svantaggi del collegamento statico (prima
dell dell esecuzione del programma) esecuzione del programma)
Le routine della libreria fanno parte del codice eseguibile Le routine della libreria fanno parte del codice eseguibile
Uso di vecchie versioni della libreria anche se disponibili Uso di vecchie versioni della libreria anche se disponibili
nuove versioni nuove versioni
Caricamento dell Caricamento dell intera libreria anche se usata intera libreria anche se usata
parzialmente parzialmente
Librerie collegate dinamicamente (DLL) Librerie collegate dinamicamente (DLL)
Le routine della libreria non sono collegate e caricate Le routine della libreria non sono collegate e caricate
finch finch il programma non viene eseguito il programma non viene eseguito
Ogni routine viene collegata solo dopo essere invocata Ogni routine viene collegata solo dopo essere invocata
( (lazy lazy procedure procedure linkage linkage) )

Potrebbero piacerti anche