Architettura degli Elaboratori II - Laboratorio

Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Pietro Codara
http://homes.di.unimi.it/ ˜dantona/arch
Prima lezione – 24 Ottobre 2012
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Informazioni pratiche
Lezioni frontali:
Mer 24 Ottobre 2012, 18.30-21.30, Aula 200 (via Celoria)
Ven 26 Ottobre 2012, 18.30-21.30, Aula 200 (via Celoria)
Mer 31 Ottobre 2012, 18.30-21.30, Aula 200 (via Celoria)
Sezione laboratorio del sito web del corso.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Informazioni pratiche
Esercitazioni a distanza:
Per il turno serale del corso parte delle esercitazioni saranno
svolte a distanza.
Dopo il ciclo di lezioni frontali verranno pubblicate sul web del
corso cinque esercitazioni.
Al rilascio di ogni esercitazione seguirà una lezione a distanza
nella quale il docente cercherà di risolvere eventuali dubbi e
problemi relativi alla risoluzione degli esercizi assegnati.
Le lezioni a distanza saranno tenute via SkypeTM , con
possibilità di condivisione del desktop.
Account Skype:
architetturaII_unimi
Introduzione
Linguaggio assembly
L’architettura MIPS
Architettura degli Elaboratori II - Laboratorio
Informazioni pratiche
Calendario esercitazioni a distanza:
Mer 7 Novembre 2012, 13.00-18.30, SkypeTM
Mer 14 Novembre 2012, 13.00-18.30, SkypeTM
Mer 28 Novembre 2012, 13.00-18.30, SkypeTM
Mer 5 Dicembre 2012, 13.00-18.30, SkypeTM
Mer 12 Dicembre 2012, 13.00-18.30, SkypeTM
Programmare in assembly MIPS
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Informazioni pratiche
Esercitazioni in laboratorio e simulazione prova d’esame:
Le lezioni a distanza saranno intervallate da esercitazioni in
laboratorio. In chiusura del corso si terrà, in laboratorio, una
simulazione della prova d’esame.
Sab 10 Novembre 2012, 8.30-11.30, Aula σ (via Comelico).
Sab 24 Novembre 2012, 8.30-11.30, Aula σ (via Comelico).
Sab 1 Dicembre 2012, 8.30-11.30, Aula σ (via Comelico).
Mer 9 Gennaio 2012, 15.30-18.30, Aula ω (via Comelico).
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Informazioni pratiche
Esame: i corsi di Architettura degli Elaboratori I e II prevedono
un esame comune. La parte di laboratorio inciderà per 31 sul
voto finale. La prova d’esame, per quanto riguarda la parte di
laboratorio, consisterà in un quiz comprendente domande a
risposta multipla e domande aperte relative alla
programmazione assembly e agli argomenti trattati nelle
lezioni frontali e nelle esercitazioni a distanza. Le date degli
esami saranno pubblicate sul sito d’ateneo. È necessaria
l’iscrizione alla prova di laboratorio tramite SIFA.
Ricevimento su appuntamento. Mail a:
[email protected]
Web del corso:
http://homes.di.unimi.it/~dantona/arch/
Dettagli sulla modalità d’esame, materiale didattico e altre
informazioni sono pubblicati sulla pagina web del corso.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Obiettivi del corso
Dare un’occasione agli studenti di fare un minimo di
esperienza nella programmazione a basso livello.
Insegnare i rudimenti della programmazione assembly.
Implementare correttamente chiamate di procedura ricorsive in
linguaggio assembly.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Programma del corso - 1a lezione frontale
Introduzione alla programmazione assembly.
Il processore MIPS e il simulatore MARS.
Introduzione all’assembly MIPS.
Primi esempi di programmazione in assembly MIPS.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Perchè studiare la programmazione assembly?
La conoscenza della programmazione assembly
chiarisce come vengono eseguite le istruzioni,
mostra come i dati sono rappresentati in memoria,
(?) rende i programmatori in linguaggi ad alto livello migliori,
fornendo loro un’idea del linguaggio di destinazione nel quale
il linguaggio ad alto livello deve essere tradotto.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Un linguaggio di programmazione a basso livello
Il linguaggio assembly è un linguaggio di programmazione a
basso livello, più vicino all’architettura del calcolatore.
Il linguaggio assembly è una rappresentazione simbolica del
linguaggio macchina.
Linguaggio assembly e linguaggio macchina
LINGUAGGIO ASSEMBLY:
add $t0,$s1,$s2
LINGUAGGIO MACCHINA:
00000010001100100100000000100000
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Un linguaggio di programmazione a basso livello
Spesso, ma non sempre, ad ogni istruzione in linguaggio
assembly corrisponde esattamente una istruzione in
linguaggio macchina.
Il linguaggio assembly è strettamente dipendente
dall’hardware: le istruzioni utilizzano codici operativi specifici
e registri specifici del processore.
Un programmatore assembly deve conoscere e capire
l’architettura del calcolatore.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Linguaggio assembly e assemblatore
Assemblatore
Uno strumento chiamato assemblatore (assembler) traduce il
linguaggio assembly in istruzioni binarie in linguaggio macchina.
Il linguaggio assembly permette agli utenti l’uso di etichette,
che verranno risolte opportunamente dall’assemblatore (o dal
linker, quando le etichette fanno riferimento a moduli esterni).
L’assemblatore mette inoltre a disposizione alcuni strumenti
utili al programmatore. Tra questi, la possibilità di utilizzare
macro, di fornire direttive, di utilizzare pseudoistruzioni.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Quando si usa il linguaggio assembly
Il linguaggio assembly permette un maggior controllo da parte del
programmatore su dimensione e velocità di un programma.
Può essere utile programmare in assembly alcune applicazioni
critiche, in particolare in calcolatori embedded.
Spesso viene utilizzato un approccio ibrido: gran parte del codice è
scritto in un linguaggio ad alto livello e solo le parti più critiche sono
scritte in linguaggio assembly.
Tra gli altri possibili utilizzi: sviluppo di compilatori, cracking,
hacking.
Il linguaggio assembly è anche utilizzato quando nessun linguaggio
di alto livello è disponibile o per accedere a istruzioni inaccessibili
ad un linguaggio di alto livello.
Con il miglioramento dei compilatori e la crescente disponibilità di
memoria a basso costo la programmazione assembly è oggi meno
utilizzata.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Svantaggi della programmazione assembly
Codice strettamente dipendente dall’architettura originale.
Programmi più lunghi:
più lungo è il codice, più errori può contenere,
più lungo è il codice, più difficile è da leggere,
più lungo è il codice, più tempo è necessario per scriverlo.
Il controllo di flusso è gestito dal programmatore mediante go
to.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Il processore MIPS R2000
Microprocessore RISC (Reduced instruction Set Computer).
RISC
Architetture per microprocessori formate da un un set di istruzioni
ridotto: le istruzioni sono in grado di eseguire operazioni semplici,
eseguibili in tempi simili.
È una filosofia opposta alla CISC (Complex Instruction Set
Computer). Microprocessori CISC forniscono istruzioni anche
molto complesse, in grado, ad esempio, di leggere un dato dalla
memoria, elaborarlo, e salvare il risultato in memoria.
Processori della famiglia MIPS sono diffusi, ad esempio, in
dispositivi portatili (cellulari, tablet), router (CISCO) e console
(Nintendo, Sony Playstation).
Il MIPS R2000 è il primo progetto della MIPS technologies
(http://www.mips.com) e risale al 1985.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Il processore MIPS R2000
Architettura RISC pura.
Istruzioni di load e store
Le uniche istruzioni che accedono alla memoria sono le istruzioni
di load e store.
lw (load word)
sw (store word)
Vi sono poi le varianti lb, sb etc.
Studieremo in dettaglio più avanti il set di istruzioni del MIPS
R2000: per ora basta tenere a mente il fatto importante che
solo le istruzioni delle famiglie load e store accedono alla
memoria centrale.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Il processore MIPS R2000
Architettura a 32 bit
Architettura orientata alla computazione con parole (dati di 32 bit).
Per esempio, i registri sono da 32 bit. Tuttavia, ciò non significa
che il MIPS possa accedere alla memoria indirizzando solo parole.
Il set di istruzioni permette di indirizzare byte, mezzeparole, parole
e doppieparole.
BIT: minima quantità di informazione trattabile, unità di misura
dell’informazione.
BYTE = 8 bit.
PAROLA (WORD) = 32 bit.
MEZZAPAROLA (HALFWORD) = 16 bit.
DOPPIAPAROLA = 64 bit.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Il processore MIPS R2000
Banco di 32 registri da 32 bit
Registro
zero
at
v0-v1
a0-a3
t0-t7
s0-s7
t8-t9
k0-k1
gp
sp
fp
ra
Numero
0
1
2-3
4-7
8-15
16-23
24-25
26-27
28
29
30
31
Uso (Convenzione compilatori)
Costante 0
Riservato per l’assemblatore
Valutazione espressioni, valori restituiti dalle procedure
Argomenti passati a procedure
Temporanei, non preservati
Temporanei, preservati
Temporanei, non preservati
Riservati al kernel
Puntatore all’area globale (global pointer)
Puntatore allo stack (stack pointer)
Puntatore al frame (frame pointer)
Indirizzo di rientro (return address)
Indicheremo un registro, ad esempio, con $a0 (equivalente a
$4).
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Il processore MIPS R2000
Coprocessori
La CPU MIPS R2000 esegue solo calcoli in aritmetica intera,
e non gestisce le eccezioni.
L’aritmetica in virgola mobile è gestita da un coprocessore
FPU (Floating Point Unit), chiamato coprocessore 1.
Un altro coprocessore, chiamato coprocessore 0, si occupa,
tra l’altro, di gestire le eccezioni.
Introduzione
Linguaggio assembly
Architettura degli Elaboratori II - Laboratorio
Il processore MIPS R2000
L’architettura MIPS
Programmare in assembly MIPS
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Convenzioni di utilizzo della memoria
I sistemi MIPS fanno riferimento a una organizzazione
convenzionale della memoria.
La memoria accessibile dal codice assembly è divisa in
segmento dati, segmento testo e segmento stack.
Vi è poi una porzione di memoria riservata alla quale il codice
non può accedere, pena la generazione di una eccezione di
indirizzamento. Essa è dedicata, per esempio, a contenere il
kernel del sistema operativo.
Questa organizzazione è convenzionale nel senso che non è
imposta dall’hardware, ma grazie a un accordo tra
programmatori che decidono di seguire le stesse regole per
far funzionare insieme al meglio programmi scritti da diverse
persone.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Convenzioni di utilizzo della memoria
Segmento dati
Il segmento dati contiene i dati su cui opera il programma. Se, per
esempio, il programma deve mantenere in memoria una costante
intera da usare ripetutamente, tale costante andrà collocata in
questo segmento.
Segmento testo
Il segmento testo contiene il codice macchina del programma.
Segmento stack
Anche il segmento stack contiene dati su cui opera il programma,
ma questo segmento cresce verso il basso, con una politica LIFO.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Convenzioni di utilizzo della memoria
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Indirizzi di memoria
La memoria centrale cui il MIPS accede è da pensarsi come
una sequenza di locazioni di memoria numerate
progressivamente.
Poiché MIPS è in grado di indirizzare i singoli byte, ciascuna
locazione di memoria contiene un singolo byte di
informazione.
Ne segue anche che la numerazione naturale delle locazioni
è riferita ai byte: cioè, all’indirizzo 4 della memoria centrale
trovo l’inizio della seconda parola di memoria, all’indirizzo 0
trovo l’inizio del primo byte, oppure della prima parola.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Il simulatore MARS
Con l’utilizzo di un simulatore saremo in grado di assemblare
codice in linguaggio assembly MIPS, simularne l’esecuzione,
effettuare il debugging, etc., sulle nostre macchine
(tipicamente Windows, Linux o Mac su piattaforma Intel).
MARS (MIPS Assembler and Runtime Simulator) è un
simulatore in grado di eseguire linguaggio assembly scritto
per architetture MIPS32. E’ stato sviluppato da un team della
Missouri State University . MARS è scritto in Java e può
essere eseguito su diverse piattaforme.
MARS, come gli altri simulatori, legge ed esegue programmi
assembly scritti per MIPS, ma non può trattare file eseguibili
per processori MIPS.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Il simulatore MARS
Il simulatore fornisce un terminale per input/output, e mette a
disposizione del programmatore utili servizi di sistema, che
permettono, ad esempio, di gestire l’input da tastiera e l’output
sul terminale.
Il simulatore supporta un sottoinsieme delle direttive
dell’assemblatore MIPS.
Non tutte le funzionalità di un sistema MIPS sono
implementate.
MARS è un sistema integrato di sviluppo e, oltre all’editor,
offre numerose funzionalità per il debugging e la verifica del
codice.
L’ultima versione di MARS, la 4.2, è stata rilasciata nell’agosto
2011 (dimensione file: 3Mb).
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Spim, xspim, PCSpim, e Mipster
Vi sono altri simulatori per MIPS.
All’indirizzo
http://pages.cs.wisc.edu/~larus/spim.html
sono disponibili diverse versioni di SPIM:
spim, dotato di una interfaccia a terminale (Windows, Unix,
Mac OS X);
xspim, dotato di una interfaccia grafica (Unix, Mac);
PCSpim, dotato di una interfaccia grafica (Windows).
Un comodo ambiente di sviluppo integrato per MIPS, basato
su SPIM, è MIPSter. Una versione di MIPSter è scaricabile
dal sito web del corso.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Un primo programma in assembly
Esempio 1
Un primo esempio ci mostra la struttura di un programma
assembly MIPS, scritto per il simulatore MARS. Nell’esempio, la
stringa Hello world! viene stampata sul terminale.
I commenti vengono preceduti dal simbolo #, le etichette sono
seguite da :, le direttive iniziano con un punto.
È buona norma commentare attentamente un programma
assembly. Un programma assembly non commentato
risulterebbe difficilmente leggibile anche ad un buon
programmatore.
.data segnala all’assemblatore l’inizio dell’area dati.
.text segnala l’inizio del segmento di testo (codice del
programma).
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Direttive
Alcune delle direttive accettate da MARS
.ascii str
.asciiz str
.byte b1,...
.data
.globl sym
.half h1,...
.text
.word w1,...
Introduzione
Memorizza la stringa str, senza carattere di
terminazione.
Memorizza la stringa str, con carattere di
terminazione.
Memorizza i byte b1,...
Indica l’inizio del segmento dati. Ciò che segue
viene memorizzato nell’area riservata ai dati.
Dichiara globale l’etichetta sym, in modo da renderla
accessibile da altri programmi.
Memorizza le mezze parole h1,...
Indica l’inizio del segmento di testo. Le seguenti linee
conterranno solo istruzioni o intere parole.
Memorizza le parole w1,...
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Chiamate di sistema
Codici per le chiamate di sistema
Service
print_int
print_string
read_int
read_string
Codes
1
4
5
8
print_char
read_char
11
12
Arguments
$a0 = integer
$a0 = string
Result
integer in $v0
$a0 = buffer,
$a1 = lenght
$a0 = char
char in $a0
Per richiedere un servizio di sistema occorre caricare nel
registro $v0 il codice della chiamata di sistema, e quindi
invocare una syscall.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Alcune operazioni aritmetiche
Esempio 2
Il secondo esempio mostra l’utilizzo di alcune funzioni aritmetiche.
Viene calcolata la somma (g + h) - (i + j).
Per default i numeri interi vengono rappresentati in base dieci.
Per rappresentare dei numeri in base 16 occorre anteporre
0x.
Modificando l’esempio 2 appena visto, possiamo vedere come
lavorare con numeri esadecimali.
L’esempio 3 mostra come effettuare lo stesso calcolo
dell’esempio appena visto utilizzando valori inseriti dall’utente.
Introduzione
Linguaggio assembly
L’architettura MIPS
Programmare in assembly MIPS
Architettura degli Elaboratori II - Laboratorio
Eccezioni
Esempio 4
Il quarto esempio mostra come un evento possa sollevare
un’eccezione. Non ci occuperemo in questa lezione della gestione
delle eccezioni.
L’eccezione viene sollevata a causa di un accesso illegale
all’area di memoria riservata.
Modificando l’esempio 4 appena visto, possiamo provare ad
accedere, legalmente, ad aree di memoria non riservate.