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.