Assemblatore Linker Loadert

download Assemblatore Linker Loadert

of 4

description

Assemblatore Linker Loadert

Transcript of Assemblatore Linker Loadert

  • Assembler, Linker & Loader 1

    ArchitettureArchitetture deidei CalcolatoriCalcolatori((LettereLettere AA--I)I)

    AssemblatoreAssemblatore, Linker e Loader, Linker e Loader

    Prof. Francesco Lo PrestiProf. Francesco Lo Presti

    Assembler, Linker & Loader 2

    CompilazioneCompilazione

    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 compilatorecompilatore

    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 assemblatoreassemblatore(assembler)(assembler)

    Spesso con il termine compilazione si indica lSpesso con il termine compilazione si indica lintero processo intero processo di traduzione da linguaggio ad alto livello a linguaggio di traduzione da linguaggio ad alto livello a linguaggio macchina (essendo lmacchina (essendo lassemblatore spesso integrato con il assemblatore spesso integrato con il compilatore)compilatore)

    Assembler, Linker & Loader 3

    Il processo di compilazioneIl 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 discodisco

    Il caricatore (Il caricatore (loaderloader) ) carica il programma in carica il programma in memoria principale per memoria principale per llesecuzioneesecuzione

    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 linkerlinker

    Il Il linkerlinker ((linklink editor o editor o collegatorecollegatore) ha il compito di collegare tra ) ha il compito di collegare tra loro vari moduli che compongono lo stesso programmaloro vari moduli che compongono lo stesso programma Programma sorgente suddiviso in piProgramma sorgente suddiviso in pi file che vengono compilati file che vengono compilati

    separatamente creando diversi file oggettoseparatamente creando diversi file oggetto Utilizzo di funzioni di libreriaUtilizzo di funzioni di libreria

    Il Il linkerlinker 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 filecodice delle funzioni di libreria utilizzate, producendo un filecontenente il codice eseguibile, memorizzato su disco contenente il codice eseguibile, memorizzato su disco

  • Assembler, Linker & Loader 5

    EsempioEsempio.globl mainmain:...

    jal proc...

    .globl procproc: addi $sp, $sp, -20

    ...beq $s0, $zero, retaddi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal procaddi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal is_inbeq $v0, $zero, else2sll $s3, $s3, 1addi $s3, $s3, 1j ret

    else2: addi $s3, $s3, 2ret: addi $v0, $s3, 0

    ...addi $sp, $sp, 20jr $ra

    .globl is_inis_in: addi $t0, $zero, 0

    addi $t1, $zero, 0while: slt $t2, $t0, $a2

    beq $t2, $zero, endsll $t3, $t0, 2add $t3, $a1, $t3lw $t4, 0($t3)bne $t4, $a0, incaddi $t1, $zero, 1j end

    inc: addi $t0, $t0, 1j while

    end: addi $v0, $t1, 0jr $ra

    Assembler, Linker & Loader 6

    LLassemblatoreassemblatore

    Traduce un modulo in assembler in un file oggettoTraduce un modulo in assembler in un file oggetto Una combinazione diUna combinazione di

    99 Istruzioni in linguaggio macchinaIstruzioni in linguaggio macchina99 Dati Dati 99 Informazioni per la corretta collocazione del modulo in memoria:Informazioni per la corretta collocazione del modulo in memoria:

    RilocazioneRilocazione EsempioEsempio

    99 Per poter tradurre in linguaggio macchina le istruzioni di saltoPer poter tradurre in linguaggio macchina le istruzioni di salto, , llassemblatore deve poter determinare gli indirizzi corrispondentiassemblatore deve poter determinare gli indirizzi corrispondenti alle alle etichette usate nei salti (etichette usate nei salti (tabella dei simbolitabella dei simboli))

    99 Tabella dei simboliTabella dei simboli: contiene le corrispondenze tra nomi delle : contiene le corrispondenze tra nomi delle etichette (simboli) ed indirizzi di memoriaetichette (simboli) ed indirizzi di memoria

    Il file oggetto prodotto dallIl file oggetto prodotto dallassemblatore 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) SarSar il il linkerlinker a gestire la a gestire la rilocazionerilocazione

    99 Istruzioni dipendenti da un indirizzo assolutoIstruzioni dipendenti da un indirizzo assoluto

    Assembler, Linker & Loader 7

    Il processo di assemblaggioIl 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 avantiriferimenti in avanti: l: letichetta etichetta usata usata prima di essere definita) prima di essere definita)

    Assemblatore a due passateAssemblatore a due passate Prima passataPrima passata: calcola la lunghezza delle istruzioni e genera una : calcola la lunghezza delle istruzioni e genera una

    tabella dei simboli, contenente ltabella dei simboli, contenente lassociazione tra i nomi delle associazione tra i nomi delle etichette ed i corrispondenti indirizzi di memoriaetichette ed i corrispondenti indirizzi di memoria

    Seconda passataSeconda passata: tutti i riferimenti locali sono noti: usando la : tutti i riferimenti locali sono noti: usando la tabella dei simboli, pu generare il codice macchinatabella dei simboli, pu generare il codice macchina

    Assemblatore ad una passataAssemblatore 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 backpatchingbackpatching)) Mette queste istruzioni in una tabella dei simboli irrisoltiMette queste istruzioni in una tabella dei simboli irrisolti Alla fine traduce anche questeAlla fine traduce anche queste Maggiore velocitMaggiore velocit ma intera rappresentazione binaria in memoriama intera rappresentazione binaria in memoria

    Assembler, Linker & Loader 8

    Struttura del file oggettoStruttura del file oggetto

    Nei sistemi Nei sistemi UnixUnix, il file oggetto , il file oggetto composto da 6 sezioni distintecomposto da 6 sezioni distinte ObjectObject file file headerheader (intestazione)(intestazione)

    99 Dimensione e posizione delle altre parti del file oggettoDimensione e posizione delle altre parti del file oggetto Segmento di testoSegmento di testo

    99 Codice in linguaggio macchina per le procedure nel file sorgenteCodice in linguaggio macchina per le procedure nel file sorgente; ; possono esserci riferimenti irrisolti (istruzioni contenenti rifpossono esserci riferimenti irrisolti (istruzioni contenenti riferimenti a erimenti a simboli esterni)simboli esterni)

    Segmento di datiSegmento di dati99 Rappresentazione binaria dei datiRappresentazione binaria dei dati

    Informazioni di Informazioni di rilocazionerilocazione99 Identificazione di istruzioni e dati da aggiornare al momento deIdentificazione di istruzioni e dati da aggiornare al momento della lla

    rilocazionerilocazione, in quanto dipendenti da indirizzi di memoria assoluti, in quanto dipendenti da indirizzi di memoria assoluti Tabella dei simboliTabella dei simboli

    99 Simboli definiti nel modulo e Simboli definiti nel modulo e riferibili dallriferibili dallesternoesterno (etichette globali) e (etichette globali) e lista dei lista dei riferimenti irrisoltiriferimenti irrisolti (ad es. per uso di funzioni di libreria)(ad es. per uso di funzioni di libreria)

    Informazioni per il Informazioni per il debuggerdebugger99 Descrizione concisa del modo in cui il programma Descrizione concisa del modo in cui il programma stato compilatostato compilato

  • Assembler, Linker & Loader 9

    Esempio: Primo Passata Esempio: Primo Passata

    EtichettaEtichetta IndirizzoIndirizzoprocproc 0x000x00else2else2 0x600x60retret 0x640x64

    .globl procproc: addi $sp, $sp, -20

    ...beq $s0, $zero, retaddi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal procaddi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal is_inbeq $v0, $zero, else2sll $s3, $s3, 1addi $s3, $s3, 1j ret

    else2: addi $s3, $s3, 2ret: addi $v0, $s3, 0

    ...addi $sp, $sp, 20jr $ra

    Tabella dei Simboli

    Assembler, Linker & Loader 10

    Esempio: Secondo PassataEsempio: Secondo Passata.globl procproc: addi $sp, $sp, -20

    ...beq $s0, $zero, retaddi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal procaddi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal is_inbeq $v0, $zero, else2sll $s3, $s3, 1addi $s3, $s3, 1j ret

    else2: addi $s3, $s3, 2ret: addi $v0, $s3, 0

    ...addi $sp, $sp, 20jr $ra

    addi $sp, $sp, -20...beq $s0, $zero, 14addi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal 0x0addi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal ???beq $v0, $zero, 3sll $s3, $s3, 1addi $s3, $s3, 1j 0x64addi $s3, $s3, 2addi $v0, $s3, 0...addi $sp, $sp, 20jr $ra

    Generazione

    Codice

    Macchina

    EtichettaEtichetta IndirizzoIndirizzoprocproc 0x000x00else2else2 0x600x60retret 0x640x64

    Tabella dei Simboli

    EtichettaEtichetta IndirizzoIndirizzoprocproc 0x000x00is_inis_in 0x4B0x4B

    Tabella dei Simboli

    IstrIstr.. IndirizzoIndirizzojaljal 0x380x38jaljal 0x4B0x4Bjj 0x5B0x5B

    Relocation Information

    Assembler, Linker & Loader 11

    Il Il linkerlinker

    Ciascun modulo ha il suo spazio degli indirizziCiascun modulo ha il suo spazio degli indirizzi Quando i moduli vengono collegati occorre Quando i moduli vengono collegati occorre traslaretraslare i loro spazi degli i loro spazi degli

    indirizziindirizzi Occorre risolvere tutti i riferimenti esterni Occorre risolvere tutti i riferimenti esterni tramite etichettetramite etichette

    globali globali -- ossia le chiamate tra moduli e riferimenti a variabili ossia le chiamate tra moduli e riferimenti a variabili globaliglobali

    Compiti del Compiti del linkerlinker (a partire dalla tabella dei simboli e dalle (a partire dalla tabella dei simboli e dalle informazioni di informazioni di rilocazionerilocazione)) Porre simbolicamente in memoria istruzioni e datiPorre simbolicamente in memoria istruzioni e dati Determinare gli indirizzi dei dati e delle etichette dei saltiDeterminare gli indirizzi dei dati e delle etichette dei salti Unire i riferimenti interni ed esterni alle procedureUnire i riferimenti interni ed esterni alle procedure

    Il Il linkerlinker produce un file oggetto che pu essere eseguito sulla produce un file oggetto che pu essere eseguito sulla macchinamacchina Stesso formato del file oggetto ma con tutti i riferimenti risolStesso formato del file oggetto ma con tutti i riferimenti risolti e ti e

    senza informazioni di senza informazioni di rilocazionerilocazione

    Assembler, Linker & Loader 12

    EsempioEsempio ...jal ???...

    addi $t0, $zero, 0addi $t1, $zero, 0slt $t2, $t0, $a2beq $t2, $zero, 8sll $t3, $t0, 2add $t3, $a1, $t3lw $t4, 0($t3)bne $t4, $a0, 2addi $t1, $zero, 1j 0x30addi $t0, $t0, 1j 0x08addi $v0, $t1, 0jr $ra

    addi $sp, $sp, -20...beq $s0, $zero, 14addi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal 0x00addi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal ???beq $v0, $zero, 3sll $s3, $s3, 1addi $s3, $s3, 1j 0x64addi $s3, $s3, 2addi $v0, $s3, 0...addi $sp, $sp, 20jr $ra

    0x400000

    0x4000AC

    0x4000B0

    0x400120

    0x400124

    0x400158

  • Assembler, Linker & Loader 13

    EsempioEsempio ...jal 0x4000B0...

    addi $t0, $zero, 0addi $t1, $zero, 0slt $t2, $t0, $a2beq $t2, $zero, 8sll $t3, $t0, 2add $t3, $a1, $t3lw $t4, 0($t3)bne $t4, $a0, 2addi $t1, $zero, 1j 0x400154addi $t0, $t0, 1j 0x40012Baddi $v0, $t1, 0jr $ra

    addi $sp, $sp, -20...beq $s0, $zero, 14addi $a0, $s0, -1addi $a1, $s1, 0addi $a2, $s2, 0jal 0x4000B0addi $s3, $v0, 0addi $a0, $s0, 0addi $a1, $s1, 0addi $a2, $s2, 0jal 0x400124beq $v0, $zero, 3sll $s3, $s3, 1addi $s3, $s3, 1j 0x400104addi $s3, $s3, 2addi $v0, $s3, 0...addi $sp, $sp, 20jr $ra

    0x400000

    0x4000AC

    0x4000B0

    0x400120

    0x400124

    0x400158

    Assembler, Linker & Loader 14

    Istruzioni MIPS da Istruzioni MIPS da RilocareRilocare

    Indirizzi relativi al PC (istruzioni Indirizzi relativi al PC (istruzioni beqbeq e e bnebne): da ): da non non rilocarerilocare LLindirizzamento relativo al PC indirizzamento relativo al PC preservato anche se il preservato anche se il

    codice viene spostatocodice viene spostato Indirizzi assoluti (istruzioni j e Indirizzi assoluti (istruzioni j e jaljal): da ): da rilocarerilocare

    sempresempre Da Da rilocarerilocare anche istruzioni anche istruzioni lwlw e e swsw che utilizzano che utilizzano

    il registro il registro $gp$gp per indirizzare dati staticiper indirizzare dati statici Riferimenti esterni (tipicamente istruzione Riferimenti esterni (tipicamente istruzione jaljal): da ): da

    rilocarerilocare sempresempre

    Assembler, Linker & Loader 15

    Il Il loaderloader

    Una volta che il Una volta che il linkerlinker ha creato il file eseguibile, ha creato il file eseguibile, esso viene di solito memorizzato su discoesso viene di solito memorizzato su disco

    AllAllatto dellatto dellesecuzione, il S.O. lo carica dal disco e esecuzione, il S.O. lo carica dal disco e ne avvia lne avvia lesecuzioneesecuzione

    Il Il loaderloader si occupa di far partire il programmasi occupa di far partire il programma Legge lLegge lintestazione per determinare la dimensione dei intestazione per determinare la dimensione dei

    segmenti testo e datisegmenti testo e dati Crea uno spazio di memoria sufficiente per testo e datiCrea uno spazio di memoria sufficiente per testo e dati Copia istruzioni e dati in memoriaCopia istruzioni e dati in memoria Copia nello Copia nello stackstack i parametri (se presenti) passati al i parametri (se presenti) passati al mainmain InizializzaInizializza i registri e lo i registri e lo stackstack pointerpointer Salta ad una procedura di Salta ad una procedura di inizializzazioneinizializzazione che copia i che copia i

    parametri nei registri appositi dallo parametri nei registri appositi dallo stackstack e poi invoca la e poi invoca la procedura di inizio del programma (procedura di inizio del programma (mainmain() in C)() in C)

    Assembler, Linker & Loader 16

    Librerie collegate dinamicamenteLibrerie collegate dinamicamente

    Svantaggi del collegamento statico (prima Svantaggi del collegamento statico (prima delldellesecuzione del programma)esecuzione del programma) Le routine della libreria fanno parte del codice eseguibileLe routine della libreria fanno parte del codice eseguibile

    99 Uso di vecchie versioni della libreria anche se disponibili Uso di vecchie versioni della libreria anche se disponibili nuove versioninuove versioni

    Caricamento dellCaricamento dellintera libreria anche se usata intera libreria anche se usata parzialmenteparzialmente

    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

    finchfinch 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

    ((lazylazy procedure procedure linkagelinkage) )