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
000000
0010001010000000
000001
0010010011000000
000010
1010000000100100
000011
ALU
SHIFTER
STATUS
t0
t1
t2
…
t7
000100
……
010000
0000000000000100
010001
0000000000000011
……
011000
011001
……
TRANCODIFICATORE
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 Assembly
Istruzioni
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 Assembly
Istruzioni in SPIM (esempio)
Tipicamente una istruzione è strutturata in un
OPCODE
add $t0,$t1,$t2
Comando/modo di indirizzamenti
add $8, $9, $10
100101010010000000010000
0x012a4020
00000001001010100100000000100000
Linguaggio Assembly
Istruzioni in SPIM (esempio)
Tipicamente una istruzione è strutturata in un
OPCODE
lw $t1, pippo
Comando/modo di indirizzamenti
lui $1, 4097 111100000000010001000000000001
0x3c011001
lw $9, 0($1) 10001100001010010000000000000000 0x8c290000
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 C
Linguaggio assembler
Linguaggio macchina
/*esempio1.c*/
/*esempio1.s*/
FUN REG VAL
void main()
{
int a, b, c;
a=4;
b=6;
c=a+b;
}
.text
li $t1,4
li $t2,6
add $t0,$t1,$t2
0010001000000100
0010010000000110
1010000000100100
Ris. Registro $t2:
0000000000001010
Codice Sorgente
Programma scritto in linguaggio ad alto livello o assembly
.text
.globl main
void main()
{
int a, b, c;
a=4;
b=6;
c=a+b;
}
main:
lw $t1,pippo
lw $t2,paperino
add $t0,$t1,$t2
li $v0,10
Syscall
.data
pippo:
.word 11
paperino: .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
Sorgente
Assembler
File
Oggetto
File Oggetto - Modulo
Un modulo può contenere:
Istruzioni (routine, sub-routine,
ecc.)
Dati
Riferimenti a sub-routine e dati
di altri moduli
File Oggetto
00010101010
01010111110
(riferimento ad altro modulo)
01111111110
11111000010
11111111011
Compilatore
Il Compilatore traduce un
programma scritto in un
linguaggio ad alto livello in un:
File
Sorgente
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:
….
File
Sorgente
Binding degli indirizzi
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
Compilatore/
Assembler
File
Oggetto
File
Oggetto
LINKER
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 ESEGUIBILE
EXE
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 RELATIVI
Main:
…..
Jal sub:
….
Jal: printf
….
_______
sub:
…..
Jal scanf
….
_______
printf:
….
_______
scanf:
….
Main:
…..
Jal (a0)
….
Jal: (a1)
….
_______
sub:
…..
Jal (a2)
….
_______
printf:
….
_______
scanf:
….
RIFERIMENTI ASSOLUTI
0
…..
100
….
124
….
_____
132
…..
140
….
_____
164
….
_____
200
….
Main:
…..
Jal 132
….
Jal: 164
….
_______
sub:
…..
Jal 200
….
_______
printf:
….
_______
scanf:
….
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:
…..
Jal sub:
….
Jal: printf
….
_______
sub:
…..
Jal scanf
….
_______
printf:
….
_______
scanf:
….
Main:
…..
Jal sub:
….
Jal: printf
….
_______
sub:
…..
Jal scanf
….
_______
printf:
….
LINKER
FILE ESEGUIBILE
EXE
Eseguibile
Disposizione in memoria
La memoria viene suddivisa in
segmenti
Ogni segmento viene utilizzato
per un particolare scopo
0x80000000
KERNEL
0x7FFFF000
NOT USED
STACK
HEAP
Segmenti principali:
Text: Contiene il codice dei
programma
Data: Contiene i dati “globali”
dei programmi
Stack Contiene i dati “locali”
delle funzioni
0x10000000
DATA
TEXT
0x04000000
R DATA
0x00000000
RESERVED
$SP
Linguaggi di programmazione
Linguaggio C
Linguaggio assembler
Linguaggio macchina
/*esempio1.c*/
/*esempio1.s*/
FUN REG VAL
void main()
{
int a, b, c;
a=3;
b=4;
c=a+b;
}
.text
li $t1,4
li $t2,3
add $t0,$t1,$t2
0010001000000100
0010010000000011
1010000000100100
Ris. Registro $t2:
000000000000111
ALU
SHIFTER
STATUS
t0
t1
t2
…
t7
MEM
TRANCODIFICATORE
0010001010000000
0010010011000000
1010000000100100
0000000000000100
PC
CLOCK
0000000000000011
0000000000000111