210 likes | 342 Views
Architettura degli Elaboratori II (canale P-Z) Linguaggi e moduli. Dott. Franco Liberati. Argomenti. Linguaggi di programmazione Assemblatore Compilatore Linker (collegatore). Linguaggio Macchina.
E N D
Architettura degli Elaboratori II(canale P-Z)Linguaggi e moduli Dott. Franco Liberati
Argomenti • Linguaggi di programmazione • Assemblatore • Compilatore • Linker (collegatore)
Linguaggio Macchina • Linguaggio basato su valori numerici utilizzato dai computer per memorizzare ed eseguire programmi 0111100010101011110101001010101 $t0 $t1 $t2 ALU
Linguaggio macchina Funzionamento base ALU SHIFTER STATUS t0 t1 t2 … TRANCODIFICATORE t7 PC CLOCK
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 $t2 ALU
Linguaggio AssemblyIstruzioni • Tipicamente una istruzione è strutturata in un OPCODE Comando/modo di indirizzamenti add $t2,$t0,$t1 101001000000001 lw $t2,variabile 000001000011110 sw $t3,variabile 001001100010110
Linguaggio AssemblyIstruzioni in SPIM (esempio) • Tipicamente una istruzione è strutturata in un OPCODE Comando/modo di indirizzamenti add $t0,$t1,$t2 add $8, $9, $10 100101010010000000010000 0x012a4020 00000001001010100100000000100000
Linguaggio AssemblyIstruzioni in SPIM (esempio) • Tipicamente una istruzione è strutturata in un OPCODE Comando/modo di indirizzamenti lui $1, 4097 111100000000010001000000000001 0x3c011001 lw $t1, pippo 0x8c290000 lw $9, 0($1) 10001100001010010000000000000000
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 BASIC C# C++ C Java PASCAL BASIC SIEBEL COBOL ML
Linguaggi di programmazione Linguaggio macchina FUNREG VAL 0010001000000100 00100100000001101010000000100100 Ris. Registro $t2: 0000000000001010 Linguaggio C /*esempio1.c*/ voidmain() { int a, b, c; a=4; b=6; c=a+b; } Linguaggio assembler /*esempio1.s*/ .text li $t1,4 li $t2,6 add $t0,$t1,$t2
Codice Sorgente • Programma scritto in linguaggio ad alto livello o assembly void main() { int a, b, c; a=4; b=6; c=a+b; } .text .globl main main: lw $t1,pippo lw $t2,paperino add $t0,$t1,$t2 li $v0,10 Syscall .data pippo: .word 11 paperino: .word 15
Assemblatore File Sorgente • 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 Assembler File Oggetto
File Oggetto - Modulo File Oggetto 00010101010 01010111110 (riferimento ad altro modulo) 01111111110 11111000010 11111111011 • Un modulo può contenere: • Istruzioni (routine, sub-routine, ecc.) • Dati • Riferimenti a sub-routine e dati di altri moduli
Compilatore FileSorgente • 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 Compilatore File Assembler Assembler File Oggetto
Linker Main:…..Jal sub:…. Jal: printf …. _______ sub: ….. Jal scanf …. _______ printf: …. _______ scanf: …. • 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 LINKER Main:…..Jal sub:…. Jal: printf …. _______ sub: ….. Jal scanf …. _______ printf: …. _______ scanf: ….
Binding degli indirizzi FileSorgente Compilatore/Assembler • 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 File Oggetto File Oggetto LINKER FILE ESEGUIBILEEXE
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 RIFERIMENTI ASSOLUTI RIFERIMENTI RELATIVI 0…..100…. 124 …. _____ 132 ….. 140 …. _____ 164 …. _____ 200 …. Main:…..Jal 132…. Jal: 164 …. _______ sub: ….. Jal 200 …. _______ printf: …. _______ scanf: …. Main:…..Jal (a0)…. Jal: (a1) …. _______ sub: ….. Jal (a2) …. _______ printf: …. _______ scanf: …. Main:…..Jal sub:…. Jal: printf …. _______ sub: ….. Jal scanf …. _______ printf: …. _______ scanf: ….
Eseguibile Main:…..Jal sub:…. Jal: printf …. _______ sub: ….. Jal scanf …. _______ printf: …. _______ scanf: …. Main:…..Jal sub:…. Jal: printf …. _______ • 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 sub: ….. Jal scanf …. _______ printf: …. LINKER FILE ESEGUIBILEEXE
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 • StackContiene i dati “locali” delle funzioni
Linguaggi di programmazione Linguaggio macchina FUNREG VAL 0010001000000100 00100100000000111010000000100100 Ris. Registro $t2: 000000000000111 Linguaggio C /*esempio1.c*/ voidmain() { int a, b, c; a=3; b=4; c=a+b; } Linguaggio assembler /*esempio1.s*/ .text li $t1,4 li $t2,3 add $t0,$t1,$t2
ALU SHIFTER MEM STATUS t0 TRANCODIFICATORE t1 0010001010000000 t2 0010010011000000 … 1010000000100100 t7 0000000000000100 0000000000000011 PC CLOCK 0000000000000111