Linguaggio Assembly e linguaggio macchina

Architettura degli Elaboratori e delle Reti
Lezione 11
Linguaggio Assembly e
linguaggio macchina
Proff. A. Borghese, F. Pedersini
Dipartimento di Scienze dell’Informazione
Università degli Studi di Milano
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 1/38
Sommario
!
Il linguaggio assembly
!
Il linguaggio macchina
!
Insieme delle istruzioni
!
Formato delle istruzioni
!
Codifica delle istruzioni
!
Modalità di indirizzamento
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 2/38
Linguaggio C: esempio
main()
{
int i;
int sum = 0;
for (i = 0; i <= 100; i = i + 1)
sum = sum + i*i;
printf(“La somma da 0 a 100 è %d\n”, sum);
}
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 3/38
Linguaggio assembly: esempio
.text
.align 2
.globl main
main:
subu $sp, $sp, 32
sw $ra, 20($sp)
sw $a0, 32 ($sp)
sw $0, 24($sp)
sw $0, 28($sp)
loop:
lw $t6, 28($sp)
lw $t8, 24($sp)
mult $t4, $t6, $t6
addu $t9, $t8, $t4
addu $t9, $t8, $t7
sw $t9, 24($sp)
addu $t7, $t6, 1
sw $t7, 28($sp)
bne $t5, 100, loop
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 4/38
Codifica binaria: esempio
MIPS: istruzioni di 32 bit:
00:
001001111011110111111111111100000
04:
101011111011111100000000000010100
08:
101011111010010000000000000100000
0C:
101011111010010100000000000100100
10:
101011111010010100000000000100100
14:
101011111010010100000000000011000
18:
……………………
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 5/38
Linguaggio Assembly
!
!
!
!
ASSEMBLY: rappresentazione simbolica del linguaggio macchina
"
Vero e proprio linguaggio di programmazione
"
Più comprensibile del linguaggio macchina in quanto utilizza simboli invece che
sequenze di bit
Rispetto ai linguaggi ad alto livello…
"
Linguaggio target nella compilazione di programmi in linguaggi ad alto livello (es: C,
C++, Pascal, …)
"
Assembly fornisce limitate forme di controllo del flusso
"
non prevede articolate strutture dati
SVANTAGGI:
"
Mancanza di portabilità dei programmi
"
Maggiore lunghezza e difficoltà di comprensione
VANTAGGI: visibilità diretta dell’hardware
# Massimo sfruttamento delle potenzialità HW della macchina
# Ottimizzazione delle prestazioni
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 6/38
Assembly come linguaggio di programmazione
LIMITI:
!
Le strutture di controllo hanno forme limitate
!
Pochi tipi di dati:
!
Gestione delle strutture dati e delle chiamate a procedura deve essere fatta in
modo esplicito dal programmatore
!
In alcune applicazioni conviene un approccio ibrido:
interi , virgola mobile , caratteri
"
le parti più critiche del programma sono scritte in Assembly (per
massimizzare le prestazioni)
"
le altre sono scritte in un linguaggio ad alto livello (prestazioni dipendono
dalle capacità di ottimizzazione del compilatore)
"
Esempio: sistemi embedded, applicazioni in tempo reale
"
COMPILATORI: sistemi “automatici” di traduzione da linguaggio ad alto
livello ad assembly/codice binario…
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 7/38
Fase di compilazione da C ad assembly
Programma in
linguaggio ad
alto livello (C)
n_maschi = n_maschi + nuovoMaschio
n_femmine = n_femmine + nuovaFemmina
n_personePerEta = n_persone[eta]
Compilatore
Programma
in linguaggio
assembly (MIPS)
A.A. 2005/06
add $2, $2, $4
add $3, $3, $2
lw $15, 4($2)
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 8/38
Compilazione: da C ad assembly MIPS
!
Si consideri il seguente segmento di programma C:
"
utilizza 5 variabili: f, g, h, i, j
f = (g + h) – (i + j)
!
Il compilatore associa ad un’istruzione C complessa istruzioni
assembly a tre operandi e introduce due variabili temporanee (t0
e t1)
add t0, g, h
# var. temp. t0 ! g + h
add t1, i, j
sub f, t0, t1
# var. temp. t1 ! i + j
# f ! t0 – t1
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 9/38
Sommario
!
Il linguaggio assembly
!
Il linguaggio macchina
!
Insieme delle istruzioni
!
Formato delle istruzioni
!
Codifica delle istruzioni
!
Modalità di indirizzamento
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 10/38
Linguaggio macchina
Linguaggio macchina:
il linguaggio di programmazione
direttamente comprensibile dalla macchina
"
Alfabeto
binario (alfabeto posizionale)
"
Parole
sono le istruzioni
"
Vocabolario
è l’insieme delle istruzioni
(Instruction Set)
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 11/38
Da assembly a linguaggio macchina
!
Compilazione effettuata dall’ ASSEMBLER
Programma
in linguaggio
assembly (MIPS)
add $2, $4, $2
add $3, $3, $2
lw $15, 4($2)
Assembler
Programma
in linguaggio
macchina
A.A. 2005/06
011100010101010
000110101000111
000010000010000
001000100010000
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 12/38
Linguaggio macchina: architettura
!
Ogni architettura di processore ha il proprio linguaggio
macchina
"
Architettura definita dall’ insieme delle istruzioni
"
Due processori con la stessa architettura hanno lo stesso
linguaggio macchina anche se le implementazioni
hardware possono essere diverse
ISA (Instruction Set Architecture)
L’insieme delle istruzioni-macchina eseguibili
da una architettura di processore.
!
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 13/38
Sommario
!
Il linguaggio assembly
!
Il linguaggio macchina
!
Insieme delle istruzioni (ISA)
!
Formato delle istruzioni
!
Codifica delle istruzioni
!
Modalità di indirizzamento
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 14/38
Insieme delle istruzioni: ISA
software
instruction (ISA)
hardware
Quale è più facile modificare?
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 15/38
L’insieme delle istruzioni (ISA)
!
Le istruzioni del linguaggio macchina di ogni calcolatore
possono essere classificate nelle seguenti
!
Quattro categorie:
1. Istruzioni aritmetico-logiche;
2. Istruzioni di trasferimento da/verso la memoria;
3. Istruzioni di salto condizionato e non condizionato per il
controllo del flusso di programma;
4. Istruzioni di trasferimento in ingresso/uscita (I/O).
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 16/38
Trasferimento da/verso memoria
!
ESECUZIONE istruzione LOAD/STORE:
1. Trasferire l’istruzione dalla memoria alla CPU
2. Operandi e risultati delle istruzioni devono essere
trasferiti tra memoria e CPU
!
Necessarie diverse modalità di trasferimento di
dati/istruzioni tra memoria e registri della CPU:
"
load (caricamento) o fetch (prelievo) o read (lettura)
"
store (memorizzazione) o write (scrittura)
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 17/38
Istruzioni aritmetiche
!
Ogni istruzione aritmetica ha
un numero prefissato di operandi
"
!
generalmente tre
L’ordine degli operandi è fisso:
"
Prima il risultato
(registro destinazione)
"
Poi i due operandi
(registri sorgente)
"
In alcuni casi il registro destinazione è implicito
• (es. moltiplicazione e divisione non floating point)
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 18/38
Istruzioni di salto (condizionato e non)
!
ESECUZIONE
Nel registro contatore di programma (PC – Program Counter) viene
caricato l’indirizzo di salto
"
!
Istruzioni di salto condizionato (branch):
"
!
invece dell’indirizzo seguente secondo l’ordine sequenziale delle
istruzioni.
il salto viene eseguito solo se una certa condizione risulta soddisfatta.
Istruzioni di salto incondizionato (jump):
"
il salto viene sempre eseguito.
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 19/38
Sommario
!
Il linguaggio assembly
!
Il linguaggio macchina
!
Insieme delle istruzioni
!
Formato delle istruzioni
!
Codifica delle istruzioni
!
Modalità di indirizzamento
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 20/38
MIPS: architettura RISC
!
Caratteristiche principali di ISA di tipo RISC:
"
Istruzioni dell’ISA eseguite direttamente dall’hardware
"
Massimizzazione della velocità di completamento delle
istruzioni
"
Istruzioni facili da decodificare
• “poche”, poco “varie”, tutte di uguale lunghezza
• Accesso alla memoria solo con istruzioni dedicate di
caricamento/memorizzazione (load/store)
• Gli operandi di un’istruzione devono sempre risiedere nei registri
del processore.
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 21/38
I registri
!
Il compilatore associa le variabili di programma a registri
!
Un processore possiede un numero limitato di registri
"
!
!
MIPS: 32 registri di 32-bit (register file)
Per convenzione si usano nomi simbolici preceduti da $ per
denotare i registri, ad esempio:
$s0,$s1,...,$s7
Per indicare variabili
$t0, $t1, ... $t9
Indica variabili temporanee
I registri possono essere anche direttamente indicati mediante il loro
numero (0, …, 31) preceduto da $:
ad es.
es.
A.A. 2005/06
$0, $1, …, $31
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 22/38
MIPS: Convenzioni d’uso dei registri
Nome
$zero
$at
$v0-$v1
$a0-$a3
$t0-$t7
$s0-$s7
$t8-$t9
$k0-$k1
$gp
$sp
$s8
$ra
A.A. 2005/06
Numero
0
1
2-3
4-7
8-15
16-23
24-25
26-27
28
29
30
31
Utilizzo
costante zero
riservato per l’assemblatore
valori di ritorno di una procedura
argomenti di una procedura
registri temporanei (non salvati)
registri salvati
registri temporanei (non salvati)
gestione delle eccezioni
puntatore alla global area (dati)
stack pointer
registro salvato (fp)
indirizzo di ritorno
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 23/38
Registri speciali MIPS
!
Registri “special purpose”, per l’esecuzione di
operazioni particolari:
!
MIPS: 32 registri per le operazioni floating point
(in virgola mobile)
$f0, …, $f31
"
Per le operazioni in doppia precisione si usano registri
contigui:
$f0, $f2, $f4,…
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 24/38
Compilazione C ! Assembly usando i registri
!
Si consideri il seguente segmento di programma C che utilizza 5 variabili:
f = (g + h) – (i + j)
!
Il compilatore associa alle variabili presenti nel programma i registri presenti
nella CPU.
"
Ad es: variabili f, g, h, i e j associate ai registri
$s0, $s1, $s2, $s3, $s4
!
Il compilatore introduce due variabili temporanee (t0 e t1) che associa a due
registri temporanei $t0 e $t1:
add $t0, $s1, $s2
# var. temp. t0 ! g + h
add $t1, $s3, $s4
# var. temp. t1 ! i + j
sub $s0, $t0, $t1
# f ! t0 – t1
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 25/38
Formato di un’istruzione
Ciclo di esecuzione
di un’istruzione
Fase di fetch
Decodifica
Esecuzione
Lettura / scrittura
Formato e codifica
di un’istruzione
"
Tipo e dimensione
istruzione
"
Posizione degli operandi e
risultato
"
Tipo e dimensione dei dati
"
Operazioni consentite
Write back
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 26/38
Formato delle istruzioni MIPS
!
!
Tutte le istruzioni MIPS hanno la stessa dimensione: 32 bit
"
I 32 bit hanno un significato diverso a seconda del formato (o tipo)
di istruzione
"
il tipo di istruzione è riconosciuto in base al valore di alcuni dei bit
più significativi
(6 bit: codice operativo - OPCODE)
Le istruzioni MIPS sono di 3 tipi ! 3 formati
"
Tipo R (register)
Istruzioni aritmetico-logiche
"
Tipo I (immediate)
Istruzioni di accesso alla memoria
o contenenti delle costanti
"
Tipo J (jump)
Istruzioni di salto
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 27/38
I tipi di istruzione MIPS
!
Tipi di istruzioni
"
Istruzioni aritmetico-logiche
"
Istruzioni di trasferimento dati
"
Istruzioni di salto
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 28/38
Istruzioni aritmetico-logiche
!
!
MIPS: un’istruzione aritmetico-logica possiede tre operandi:
"
due registri contenenti i valori da elaborare (registri sorgente)
"
il registro contenente il risultato (registro destinazione)
L’ordine degli operandi è fisso
"
!
Prima il registro contenente il risultato, poi i due operandi
Struttura istruzione assembly:
codice operativo e tre campi relativi ai tre operandi:
OPCODE
DEST, SORG1, SORG2
32 bit
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 29/38
Istruzione add
!
add : somma
add rd, rs, rt
"
somma il contenuto di due registri sorgente rs e rt
"
e mette la somma nel registro destinazione: rd
add rd, rs, rt
# rd " rs + rt
Opcode (6 bit)
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 30/38
Istruzione sub
sub: Sottrazione
sub rd rs rt
!
sottrae il contenuto di due registri sorgente rs e rt
!
e mette la differenza nel registro destinazione rd
sub rd, rs, rt
# rd " rs - rt
Opcode (6 bit)
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 31/38
Istruzioni aritmetico-logiche
!
Operazioni con un numero di operandi maggiore di tre
devono essere scomposte in operazioni più semplici
"
Ad esempio, per eseguire la somma delle variabili
b,c,d,e nella variabile a servono tre istruzioni:
Codice C:
A = B + C + D + E
Assembly MIPS:
add $t0,
$t0 $s1,
$s1 $s2
add $t0,
$t0 $t0,
$t0 $s3
add $s0,
$s0 $t0,
$t0 $s4
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 32/38
add: varianti
addi $s1, $s2, 100
"
#add immediate
Somma una costante: il valore del secondo operando
(ultimi 16 bit) è presente nell’istruzione come costante e
sommata considerando il segno
addu $s0, $s1, $s2
"
#add unsigned
La somma viene eseguita tra numeri senza segno
addiu $s0, $s1, 100
"
#add immediate unsigned
Somma una costante
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 33/38
Moltiplicazione
!
Due istruzioni:
mult rs rt
multu rs rt
!
# unsigned
Il registro destinazione è implicito.
"
Il risultato della moltiplicazione viene posto sempre in due registri
dedicati (special purpose):
hi (high-order word)
lo (low-order word)
"
La moltiplicazione di due numeri di 32 bit dà come risultato un
numero rappresentabile in 64 bit
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 34/38
Moltiplicazione
!
Il risultato della moltiplicazione si preleva dal registro hi e
dal registro lo utilizzando le due istruzioni:
mfhi rd
# move from hi: rd $ hi
mflo rd
# move from lo: rd $ lo
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 35/38
Divisione
!
!
Due istruzioni:
div rs rt
# divide rs per rt
divu rs rt
# unsigned
Come nella moltiplicazione, anche nella divisione il
registro destinazione è implicito.
"
Quoziente della divisione nel registro lo
"
Resto è posto nel registro hi
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 36/38
Pseudoistruzioni
!
Per semplificare la programmazione, MIPS fornisce un
insieme di pseudoistruzioni
!
Modo compatto ed intuitivo di specificare un insieme di
istruzioni assembly elementari
"
Non hanno un corrispondente 1 a 1 con le istruzioni
dell’ISA.
"
Traduzione della pseudoistruzione nelle istruzioni
equivalenti viene attuata automaticamente
dall’assembler
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 37/38
Esempio
# t0 $ t1
move $t0, $t1
add $t0, $zero, $t1
mul $s0, $t1, $t2
# s0 $ t1*t2
mult $t1, $t2
mflo $s0
div $s0, $t1, $t2
# s0 $ t1/t2
div $t1, $t2
mflo $s0
A.A. 2005/06
Copyright : A. Borghese, F. Pedersini – DSI, UniMI
L 11 – 38/38