La scorsa lezione Laboratorio di Architettura Lezione 8 Andrea Torsello 1 Dipartimento di Informatica Università Ca Foscari di Venezia Procedure Convenzione di chiamata Stack (Push / Pop) Implementazione: come si traduce una funzione Variabili e scoping (globali/locali) 1 slides basate su slides di Massimo Marchiori p.1/52 Questa lezione p.2/52 Word e bytes... TIPI: Stringhe Chiamate di sistema Strutture Vettori (solo accennato) Puntatori Finora, abbiamo solo agito con words (4 bytes) Però, abbiamo visto che ci sono istruzioni anche per manipolare i singoli bytes: lbu (load byte (unsigned)) sb (store byte) p.3/52 p.4/52
Motivi? Come? Motivo principale: le stringhe Questa è una stringa Le stringhe sono composte di caratteri Usualmente, ogni carattere è memorizzato in 1 byte Si indossa un diverso paio di occhiali I numeri nella memoria possono essere interpretati in vario modo: Come numeri Come istruzioni di memoria E... come caratteri p.5/52 Corrispondenza numeri-caratteri ASCII p.6/52 Corrispondenza standard: ASCII ASCII: American Standard Code for Information Interchange Da 0 a 127: ci sta in un byte Da 0 a 31: caratteri di controllo Da 32 a 126: caratteri stampabili 127: carattere di controllo p.7/52 p.8/52
ASCII Osservazioni 32 (spazio) 33! 34 " (virgolette) 35 #... I caratteri dell alfabeto corrispondono a numeri consecutivi I caratteri numerici corrispondono a numeri consecutivi p.9/52 Lettere maiuscole p.10/52 Lettere minuscole 65 A... 90 Z 97 a... 122 z p.11/52 p.12/52
Utilità Caratteri numerici Quindi, ad esempio, possiamo facilmente Controllare se un carattere è una lettera Passare da maiuscole a minuscole e viceversa (c è una differenza di 32 tra ogni lettera maiuscola e corrispondente minuscola) 68 D 100 d 48 0... 57 9 Utilità p.13/52 In memoria p.14/52 Possiamo facilmente calcolare il valore di un carattere numerico sottraendo il valore di 0 (48) Esempio: il valore del carattere 2 (ASCII 50) è 50-48=2 Rappresentazione standard MIPS (come in C): Sequenza di valori numerici dei caratteri, terminata da un carattere speciale Null (0) Esempio: CIAO in memoria sarebbe 67, 73, 65, 79, 0 p.15/52 p.16/52
Attenzione In SPIM? Questa rappresentazione è abbastanza standard, ma non è universale Controllate nel vostro contesto Come si carica una stringa in memoria? Opzione 1: si riserva memoria con.space, e poi si memorizzano I codici dei singoli caratteri con sb (store byte) Auch... Opzione 2: si mettono I codici direttamente con la direttiva.byte Esempio con CIAO:.byte 67, 73, 65, 79, 0 p.17/52 Direttiva.asciiz p.18/52 Stringhe e caratteri di controllo Nuova direttiva.asciiz stringa Inserisce la stringa, e la termina con null Esempio:.asciiz CIAO Analogamente al C, alcuni caratteri ASCII non stampabili sono rappresentabili tramite cosiddette sequenze di escaping Escape > sfuggire Si sfugge all interpretazione normale di una stringa, e si seleziona un carattere (nel nostro caso, \ p.19/52 p.20/52
Caratteri di controllo in SPIM ESERCIZIO \ n : newline (ritorno a capo) \ " : virgolette (") \ t : tab (allinea su colonna) Se il carattere \ è di escape, come si fa allora a stampare una stringa che contiene proprio \? Ad esempio, come si stampa \ n? p.21/52 p.22/52 Ma... UNICODE Tenete a mente, che il mondo non parla solo ASCII ASCII = American... Il mondo parla Unicode L alfabeto universale I caratteri qui sono di 2 bytes p.23/52 p.24/52
Per saperne di più... Oltre al processore http://www.unicode.org http://www.w3.org/international I processori forniscono le istruzioni basilari (operazioni aritmetiche, salti, load, store...) Però, poi la macchina ha tipicamente altri accessori hardware con cui è possibile interagire Ad esempio, il video, la tastiera, la scheda video, il disco, etc... p.25/52 Il Sistema Operativo p.26/52 Come si fa? Quindi ad esempio, per scrivere delle lettere sul video occorreranno particolari istruzioni che vanno a interagire col video Per ricevere dati dalla tastiera occorreranno particolari istruzioni che interagiscono con la tastiera E così via... Tipicamente, tali istruzioni sono molto complicate, quindi qualcuno ha già scritto il codice per noi, sotto forma di varie funzioni, e ce lo offre il cosiddetto sistema operativo p.27/52 p.28/52
Il Sistema Operativo E noi? Serie di funzioni già predefinite, che possiamo usare per interagire con la macchina Vantaggi: su macchine diverse, cambierà il codice delle funzioni scritte nel sistema operativo, ma non i programmi che le usano il nostro programma è solo dipendente dal sistema operativo, non dalla macchina (più o meno...) Noi allora, scrivendo un programma assembly in SPIM, come facciamo a scrivere su video etc etc? SPIM ci fornisce un mini sistema operativo con delle funzioni di base p.29/52 Chiamate al Sistema Operativo Le syscall p.30/52 Possiamo chiamare queste funzioni del sistema operativo Istruzione MIPS: syscall system call, chiamata di sistema Tipicamente: INPUT: $v0 : cosa far fare al sistema operativo (codice della chiamata) $a0 : dato in input (se c è) $a1 : dato in input (se c è) OUTPUT: $v0: dato in output (se c è) p.31/52 p.32/52
Mini sistema operativo Stampa su video Mini perché ci sono solo 10 possibili chiamate al sistema Di solito un sistema operativo ne ha molte di più... Noi oggi ne vedremo 5 (codice 1, 4, 5, 8, 10) Ci sono istruzioni per stampare su video: un intero una stringa p.33/52 Stampa un intero Esempio p.34/52 INPUT: $v0 = 1 (codice) $a0 = intero da stampare OUTPUT: Per stampare 7 su video: addi $v0,$zero,1 #codice 1 addi $a0,$zero,7 #output 7 syscall #stampa su video p.35/52 p.36/52
Attenzione Stampa di stringhe Stampando un intero, la chiamata al sistema operativo automaticamente converte in decimale Quindi se in $a0 c è 10 (esadecimale), sarà stampato 16 a video INPUT: $v0 = 4 (codice) $a0 = indirizzo della stringa OUTPUT: p.37/52 Leggere un intero Attenzione p.38/52 INPUT: $v0 = 5 (codice) OUTPUT: $v0 = intero letto da tastiera Come nel caso in cui si stampa un intero, quando si legge il sistema assume che noi scriviamo in decimale, e poi converte in esadecimale Esempio: scrivendo da tastiera 10, il computer traduce in A esadecimale p.39/52 p.40/52
Leggere una stringa ATTENZIONE INPUT: $v0 = 8 (codice) $a0 = dove mettere la stringa ( buffer ) $a1 = lunghezza della stringa (capacità del buffer) La lunghezza della stringa in a1 comprende il carattere di terminazione null (0) (Simile a fgets in C) OUTPUT: il buffer conterrà la stringa letta Caso tipico p.41/52 Syscall 10 p.42/52 Si riserva lo spazio necessario per la stringa con.space (e si mette un etichetta) Si carica con la l indirizzo della stringa in $a1 con la Vediamo l ultima syscall Codice: 10 Significato: EXIT Esci da SPIM e termina l esecuzione Attenzione al comportamento di SPIM... p.43/52 p.44/52
Strutture Strutture Le strutture non sono altro che piu variabili (anche di tipo diverso) collegate tra di loro. Esempio struct S { int a; int b; }; L accesso a questa o quella variabile all interno di una strutture avviene attraverso il nome ed è quindi scritta staticamente nel programma struct S x; x.a=2; Vettori p.45/52 p.46/52 Come si implementano I vettori sono un altro tipo di dati aggregati Si possono dichiarare più variabili dello stesso tipo e accedervi tramite un indice Esempio int a[10]; int x;... a[x]=1; Si può allocare ogni singola variabile di una struttura o un vettore come se non fossero collegate a:.space 4 b:.space 4 Oppure si può associare tutta la memoria necessaria ad una label (indirizzo) e accedere a questa o quella variabile tramite un offset Per esempio, nel caso precedente, b può essere riscritta come a+4 p.47/52 p.48/52
Come si implementano Problema Nel primo caso si facilita l accesso ai singoli elementi nel secondo caso si mantiene la visione d insieme Un problema collegato alla rappresentazione/implementazione è come vengono passati dati aggregati a procedure. Per capirci, come implemento la funzione C void sort(int a[10]) p.49/52 Passaggio dei parametri p.50/52 Conseguenze Il passaggio di dati aggregati avviene per indirizzo Tutta la struttura viene rappresentata dall indirizzo del primo elemento Anche in C, del resto, il passaggio di strutture e vettori avviene per puntatori, in modo esplicito per le strutture, attraverso una conversione implicita per i vettori. Le singole variabili che costituiscono il dato aggregato devono essere disposte in memoria in posizioni contigue o comunque avere una disposizione (layout) in memoria nota ed uniforme. La posizione di ciascuna variabile deve essere calcolata a partire dalla prima. Per riprendere l esempio di prima, se $t0 contiene l indirizzo di x, per caricare x.b in $t1 dovremo eseguire lw $t1,4($t0) Notate che l offset è statico! p.51/52 p.52/52