Architettura degli Elaboratori II (canale P-Z) Linguaggi e moduli Dott. Franco Liberati.

Post on 02-May-2015

223 views 0 download

Transcript of Architettura degli Elaboratori II (canale P-Z) Linguaggi e moduli Dott. Franco Liberati.

Architettura degli Architettura degli Elaboratori IIElaboratori II

(canale P-Z)(canale P-Z)

Linguaggi e moduliLinguaggi e moduli

Dott. Franco LiberatiDott. Franco Liberati

Argomenti

Linguaggi di programmazione

Assemblatore Compilatore Linker (collegatore)

LINGUAGGI DI PROGRAMMAZIONELINGUAGGI DI PROGRAMMAZIONE

ASSEMBLATOREASSEMBLATORE

COMPILATORECOMPILATORE

LINKERLINKER

Linguaggio Macchina

Linguaggio basato su valori numerici utilizzato dai computer per memorizzare ed eseguire programmi

0111100010101011110101001010101

$t0 $t1

ALU

$t2

Linguaggio macchina Funzionamento base

t0t0t1t1t2t2

t7t7PCPC

ALUALU SHIFTERSHIFTER

STATUSSTATUS

……

CLOCKCLOCK

TRANCODIFICATORETRANCODIFICATORE

000000 0010001010000000

000001 0010010011000000

000010 1010000000100100

000011

000100

……

010000 0000000000000100

010001 0000000000000011

……

011000

011001

……

Linguaggio Assembly

Rappresentazione simbolica (parole mnemoniche) del linguaggio macchina, usato dai programmatori (utilizza simboli invece di numeri per rappresentare istruzioni, registri e dati)

add $t2,$t0,$t1

0111100010101011110101001010101

$t0 $t1

ALU

$t2

Linguaggio AssemblyIstruzioni

Tipicamente una istruzione è strutturata in un

add $t2,$t0,$t1

OPCODEOPCODE Comando/modo di indirizzamentiComando/modo di indirizzamenti

lw $t2,variabile

101101001000100000000000010001

000000001000100001111000011110

sw $t3,variabile 001001001100110001011000010110

Linguaggio AssemblyIstruzioni in SPIM (esempio)

Tipicamente una istruzione è strutturata in un

add $t0,$t1,$t2

OPCODEOPCODE Comando/modo di indirizzamentiComando/modo di indirizzamenti

add $8, $9, $10add $8, $9, $10

0x012a40200x012a4020

100101010010000000010000100101010010000000010000

0000000000000100101001010100101001000010000000000000100000100000

Linguaggio AssemblyIstruzioni in SPIM (esempio)

Tipicamente una istruzione è strutturata in un

lw $t1, pippo

OPCODEOPCODE Comando/modo di indirizzamentiComando/modo di indirizzamenti

111100000000010001000000000001111100000000010001000000000001lui $1, 4097lui $1, 4097

lw $9, 0($1)

0x3c011001

0x8c2900001000110000101001000000000000000010001100001010010000000000000000

Linguaggio Alto Livello

I linguaggi di programmazione ad alto livello sono caratterizzati dalla presenza di astrazioni che permettono al programmatore di non specificare certi tipi di dettagli implementativi della macchina

VISUAL BASICVISUAL BASICC#C#C++C++CCJavaJava

PASCALPASCALBASICBASICSIEBELSIEBELCOBOLCOBOLMLML

Linguaggi di programmazione

Linguaggio C

/*esempio1.c*/

void main(){ int a, b, c; a=4; b=6; c=a+b;}

Linguaggio assembler

/*esempio1.s*/

.textli $t1,4li $t2,6add $t0,$t1,$t2

Linguaggio macchina

FUN REG VAL

001000100000010000100100000001101010000000100100

Ris. Registro $t2:0000000000001010

Codice Sorgente

Programma scritto in linguaggio ad alto livello o assembly

void main(){ int a, b, c; a=4; b=6; c=a+b;}

void main(){ int a, b, c; a=4; b=6; c=a+b;}

.text

.globl main

main:lw $t1,pippolw $t2,paperinoadd $t0,$t1,$t2li $v0,10Syscall

.datapippo: .word 11paperino: .word 15

.text

.globl main

main:lw $t1,pippolw $t2,paperinoadd $t0,$t1,$t2li $v0,10Syscall

.datapippo: .word 11paperino: .word 15

Assemblatore

L’Assemblatore (Assembler) traduce programmi scritti nel linguaggio assembly in linguaggio macchina

L’Assemblatore: legge un file sorgente (scritto in

assembly) produce un file oggetto (detto

anche modulo) contenente linguaggio macchina ed altre informazioni necessarie per trasformare uno o più file oggetto in un programma eseguibile

File File SorgenteSorgente

File File SorgenteSorgente

AssemblerAssemblerAssemblerAssembler

FileFileOggettoOggetto

FileFileOggettoOggetto

File Oggetto - Modulo

Un modulo può contenere: Istruzioni (routine, sub-routine,

ecc.) Dati Riferimenti a sub-routine e dati

di altri moduli

File OggettoFile Oggetto00010101010000101010100101011111001010111110

(riferimento ad altro modulo)(riferimento ad altro modulo)

011111111100111111111011111000010111110000101111111101111111111011

File OggettoFile Oggetto00010101010000101010100101011111001010111110

(riferimento ad altro modulo)(riferimento ad altro modulo)

011111111100111111111011111000010111110000101111111101111111111011

Compilatore

Il Compilatore traduce un programma scritto in un linguaggio ad alto livello in un: programma equivalente scritto

in linguaggio assembly, che può essere trasformato in un file oggetto da un assembler

oppure, direttamente in un file oggetto

FileFileSorgenteSorgente

FileFileSorgenteSorgente

AssemblerAssembler

FileFileOggettoOggetto

FileFileOggettoOggetto

CompilatoreCompilatore

File AssemblerFile AssemblerFile AssemblerFile Assembler

Linker Il Linker combina un insieme di

moduli e file libreria in un programma eseguibile

Il linker ha tre compiti: Ricercare nei file libreria le

routine di libreria utilizzate dal programma (es. printf: funzione per la stampa a video di dati)

Determinare le locazioni di memoria che il codice di ogni modulo andrà ad utilizzare e aggiornare i riferimenti assoluti in modo opportuno

Risolvere i riferimenti tra i diversi file

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________sub:sub:……....Jal scanfJal scanf……..______________printf:printf:……..______________scanf:scanf:……..

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________sub:sub:……....Jal scanfJal scanf……..______________printf:printf:……..______________scanf:scanf:……..

LINKERLINKER

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________

sub:sub:……....Jal scanfJal scanf……..______________

sub:sub:……....Jal scanfJal scanf……..______________

printf:printf:……..______________scanf:scanf:……..

printf:printf:……..______________scanf:scanf:……..

Programma sorgente: indirizzi simbolici Compilatore: da indirizzi simbolici a

indirizzi rilocabili (esempio: salto di 14 parole dall’inizio di questo modulo)

Linker: da indirizzi rilocabili indirizzi assoluti

Tempo di compilazione: se si conosce la zona di memoria dove risiederà il programma

Tempo di caricamento: si genera un codice rilocabile si ritarda il collegamento finale fino al caricamento

Tempo di esecuzione: se il processo può essere spostato durante la sua esecuzione in un segmento o l’altro di memoria

Binding degli indirizziFileFile

SorgenteSorgente

FileFileSorgenteSorgente

FileFileOggettoOggetto

FileFileOggettoOggetto

Compilatore/Compilatore/AssemblerAssembler

LINKERLINKER

FileFileOggettoOggetto

FileFileOggettoOggetto

FILE ESEGUIBILEFILE ESEGUIBILEEXEEXE

Linker Determinare le locazioni di memoria che il codice di ogni modulo andrà ad

utilizzare, aggiornare i riferimenti assoluti in modo opportuno e fare riferimento a variabili globali che coinvolgono più moduli

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________sub:sub:……....Jal scanfJal scanf……..______________printf:printf:……..______________scanf:scanf:……..

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________sub:sub:……....Jal scanfJal scanf……..______________printf:printf:……..______________scanf:scanf:……..

Main:Main:…..…..Jal (a0)Jal (a0)….….Jal: (a1)Jal: (a1)……..______________sub:sub:……....Jal (a2)Jal (a2)……..______________printf:printf:……..______________scanf:scanf:……..

Main:Main:…..…..Jal (a0)Jal (a0)….….Jal: (a1)Jal: (a1)……..______________sub:sub:……....Jal (a2)Jal (a2)……..______________printf:printf:……..______________scanf:scanf:……..

Main:Main:…..…..Jal 132Jal 132….….Jal: 164Jal: 164……..______________sub:sub:……....Jal 200Jal 200……..______________printf:printf:……..______________scanf:scanf:……..

Main:Main:…..…..Jal 132Jal 132….….Jal: 164Jal: 164……..______________sub:sub:……....Jal 200Jal 200……..______________printf:printf:……..______________scanf:scanf:……..

00…..…..100100….….124124……..__________132132……....140140……..__________164164……..__________200200……..

RIFERIMENTI RELATIVIRIFERIMENTI RELATIVI RIFERIMENTI ASSOLUTIRIFERIMENTI ASSOLUTI

Eseguibile Il Linker combina un insieme di

moduli e file libreria in un programma eseguibile

Il programma eseguibile non deve contenere unresolved references

Solamente il programma eseguibile può essere elaborato su una macchina

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________sub:sub:……....Jal scanfJal scanf……..______________printf:printf:……..______________scanf:scanf:……..

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________sub:sub:……....Jal scanfJal scanf……..______________printf:printf:……..______________scanf:scanf:……..

LINKERLINKER

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________

Main:Main:…..…..Jal sub:Jal sub:….….Jal: printfJal: printf……..______________

sub:sub:……....Jal scanfJal scanf……..______________

sub:sub:……....Jal scanfJal scanf……..______________

printf:printf:……..

printf:printf:……..

FILE ESEGUIBILEFILE ESEGUIBILEEXEEXE

EseguibileDisposizione in memoria La memoria viene suddivisa in

segmenti Ogni segmento viene utilizzato

per un particolare scopo

Segmenti principali: Text: Contiene il codice dei

programma Data: Contiene i dati “globali”

dei programmi Stack Contiene i dati “locali”

delle funzioni

0x80000000 KERNEL

0x7FFFF000 NOT USED

STACK $SP

HEAP

0x10000000 DATA

TEXT

0x04000000 R DATA

0x00000000 RESERVED

Linguaggi di programmazione

Linguaggio C

/*esempio1.c*/

void main(){ int a, b, c; a=3; b=4; c=a+b;}

Linguaggio assembler

/*esempio1.s*/

.textli $t1,4li $t2,3add $t0,$t1,$t2

Linguaggio macchina

FUN REG VAL

001000100000010000100100000000111010000000100100

Ris. Registro $t2:000000000000111

t0t0

t1t1

t2t2

t7t7

PCPC

ALUALU SHIFTERSHIFTER

STATUSSTATUS MEMMEM

……

00100100010001010000010000000000

CLOCKCLOCK

TRANCODIFICATORETRANCODIFICATORE

00000000000001000000000000000100

00000000000000110000000000000011

00100100100010011000011000000000

10110100000000000100010010001000

00000000000001110000000000000111