Il linguaggio assembly PH 2.3 (continua) 1 Argomenti Organizzazione della memoria Istruzioni di trasferimento dei dati Array Istruzioni logiche 2 1 La memoria del MIPS I contenuti delle locazioni di memoria possono rappresentare sia istruzioni che dati (sequenze di bit, numeri) La memoria è vista come un unico grande array unidimensionale di bytes Un indirizzo di memoria costituisce un indice all'interno dell'array MIPS utilizza un indirizzamento al byte, cioè l'indice punta ad un byte di memoria Byte consecutivi hanno indirizzi consecutivi Indirizzi di parole consecutive (adiacenti) differiscono di un fattore 4 (8-bit x 4 = 32-bit). 3 Indirizzamento dei bytes all’interno della parola 4 2 Endianess Due modi di memorizzare una parola in memoria: Big Endian memorizza il byte più significativo nell'indirizzo più basso ( memorizza il byte meno significativo nell'indirizzo più alto ) Little Endian memorizza il byte meno significativo nell'indirizzo più basso ( memorizza il byte più significativo nell'indirizzo più alto ) 5 Indirizzamento della memoria Gli indirizzi di parole adiacenti in memoria differiscono per un fattore quattro (8-bitx4 = 32-bit) In MIPS ogni parola (word) deve iniziare ad un indirizzo multiplo di 4 (allineamento a parola) Half word (16-bit) allineate ai multipli di 2 Per convenzione l’indirizzo di una parola coincide con l’indirizzo del suo byte più a sinistra (disposizione big-endian) 6 3 Indirizzamento della memoria 0 32 bit 4 32 bit 8 32 bit 12 32 bit 16 32 bit 20 24 32 bit 32 bit 28 32 bit 7 Organizzazione logica della memoria Nei sistemi basati su processore MIPS la memoria è solitamente divisa in tre parti: Segmento testo: contiene le istruzioni del programma Segmento dati: ulteriormente suddiviso in: dati statici: contiene dati la cui dimensione è conosciuta al momento della compilazione e il cui intervallo di vita coincide con l’esecuzione del programma dati dinamici: contiene dati ai quali lo spazio è allocato dinamicamente al momento dell'esecuzione del programma su richiesta del programma stesso Segmento stack: contiene lo stack allocato automaticamente da un programma durante l'esecuzione 8 4 Organizzazione logica della memoria 7fffffff16 Stack segment Dynamic data Data segment Static data 1000000016 Text segment 0040000016 Reserved 9 Istruzioni di trasferimento dei dati MIPS fornisce due operazioni base per il trasferimento dei dati da memoria a registro e viceversa: lw (load word) per trasferire una parola di memoria in un registro della CPU sw (store word) per trasferire il contenuto di un registro della CPU in una parola di memoria Argomento di lw e sw è l’indirizzo della locazione di memoria da cui leggere o scrivere una parola 10 5 Istruzione load L'istruzione di load trasferisce una copia della parola (dati/istruzioni) contenuta in una specifica locazione di memoria ai registri della CPU lw $t0, ind # $t0 ← mem[ind] La CPU invia l'indirizzo della locazione desiderata alla memoria e richiede un‘operazione di lettura del suo contenuto La memoria effettua la lettura dei dati memorizzati all'indirizzo specificato e li invia alla CPU 11 Istruzione di store L'istruzione di store trasferisce una parola di informazione dai registri della CPU in una specifica locazione di memoria, sovrascrivendo il precedente contenuto di quella locazione: sw $t1, ind # mem [ind] ← $t1 La CPU invia l'indirizzo della locazione desiderata alla memoria, assieme con i dati che vi devono essere scritti e richiede un'operazione di scrittura La memoria effettua la scrittura dei dati all'indirizzo specificato. 12 6 Sintassi di Load Nel MIPS, l’istruzione lw ha tre argomenti: il registro destinazione in cui caricare la parola letta dalla memoria una costante o spiazzamento (offset) un registro base (base register) che contiene il valore dell‘indirizzo base (base address) da sommare alla costante L’indirizzo della parola di memoria da caricare nel registro destinazione è ottenuto dalla somma della costante e del contenuto del registro base La costante può anche essere una espressione che l’assemblatore può calcolare (compile time) 13 Istruzione lw lw $s1, 100($s2) # $s1 ← mem[$s2 + 100] Al registro destinazione $s1 è assegnato il valore contenuto all’indirizzo di memoria ($s2 + 100) 14 7 Istruzione sw sw possiede argomenti analoghi alla lw Esempio: sw $s1, 100($s2) # mem[$s2 + 100] ← $s1 Alla locazione di memoria di indirizzo ($s2 + 100) è assegnato il valore contenuto nel registro $s1 15 Calcolo dell’indirizzo load/store il contenuto della locazione con indirizzo sw $t0, 4($sp) indirizzo indirizzo è :: ($sp ($sp ++ 4) 4) sw $t0, 4($fp) -4($fp) l'indirizzo ($fp – 4) l'indirizzo è: è: ($fp lw $a0, 0($sp) lw $a0, ($sp) sw $t0, arr($t0) lw $a0, var($ ($zero zero) ) var var($zero) lw $a0, var l'indirizzo l'indirizzo è: ($sp + 0) 0) l'indirizzo l'indirizzo è: ($t0 ($t0 ++ indirizzo indirizzo di di arr) arr) l'indirizzo l'indirizzo è: ($zero zero + indirizzo ($ var ($zero indirizzo di di var) var)) 16 8 Istruzioni load and store Esempio: .text # text segment lw $t1, op1 # carica op1 lw $t2, op2 # carica op2 add $t0, $t1,$t2 # op1 + op2 sw $t0, ris # memorizza ris .data op1: .word op2: .word ris: .word # data segment 4 op1 3 0 op2 4 ris 0 3 17 Istruzioni load and store 7fffffff16 Stack segment Dynamic data op1 4 op2 3 ris 0 Data segment Static data 1000000016 Text segment 0040000016 Reserved 18 9 Argomenti Organizzazione della memoria Istruzioni di trasferimento dei dati Array Operazioni logiche PH 2.5 19 Array $S3 + 0 A[0] $S3 + 4 A[1] $S3 + 8 A[2] $S3 + 12 A[3] 20 10 Array L'elemento i-esimo di un array si troverà nella locazione: registro-base + 4 * i dove: registro-base è il registro base (base register) "i" è l'indice ad alto livello il fattore 4 dipende dal dall'indirizzamento al byte della memoria nel MIPS 21 Array: esempio 1 Sia A un array di 100 word Istruzione C: g = h + A[8]; Si suppone che: le variabili g, h siano associate rispettivamente ai registri $s1 e $s2 l'indirizzo del primo elemento dell'array (base address) sia contenuto nel registro $s3 In MIPS ggin in $s1 $s1 hhin in $s2 $s2 addr.A addr.Ain in$s3 $s3 lw $t0, 32($s3) # t0 = A[8] add $s1, $s2, $t0 # g = h + A[8] 22 11 Array: esempio 2 Sia A un array di 100 word Istruzione C: g = h + A[i]; Si suppone che: ggin in $s1 $s1 hhin in $s2 $s2 ii in in $s4 $s4 addr.A addr.Ain in$s3 $s3 23 Array: esempio 2 (cont.) L'elemento i-esimo dell'array si trova nella locazione di memoria di indirizzo ($s3 + 4 * i) Costruzione dell'indirizzo di A[i] nel registro temporaneo $t1: add $t1, $s4, $s4 add $t1, $t1, $t1 add $t1, $t1, $s3 # # # # St1 <- 2 * i $t1 <- 4 * i $t1 <- add. of A[i] cioè ($s3 + 4 * i) Per trasferire A[i] nel registro temporaneo $t0: lw $t0, 0($t1) # $t0 <- A[i] Per sommare h e A[i] e mettere il risultato in g: add $s1, $s2, $t0 # g = h + A[i] g in $s1 h in $s2 i in $s4 addr.A in $s3 24 12 Indirizzo di un array (pseudo istruzione la) Un array è allocato nella porzione static data del data segment Pseudo istruzione load address : la rdest, rdest symbolicsymbolic-address es: la $s3, vet durante la compilazione vet è noto 25 Argomenti Organizzazione della memoria Istruzioni di trasferimento dei dati Array Istruzioni logiche 26 13 Operazioni logiche Operazioni di shift logico right (srl) in Java << left (sll) in Java >> Logico = riempito con '0‘ shift massimo: 31 bit Esempio: sll $t0, $t1, 3 # equivale moltiplicare per 8 =23 $t1: 0000 0000 0000 0000 1100 1000 0000 1111 $t0: 0000 0000 0000 0110 0100 0000 0111 1000 Formato istruzione 27 Operazioni logiche AND bit a bit and $t0, $t1, $t2 andi $t0, $t1, 3 OR bit a bit or $t0, $t1, $t2 ori $t0, $t1, 3 Esempio: $t0: $t1: $s0: $s1: in Java & in Java | and $s0, $t0, $t1 or $s1, $t0, $t1 0000 0000 0000 0110 0100 0000 0111 1000 0000 0000 0000 0000 1100 1000 0000 1111 0000 0000 0000 0000 0100 0000 0000 1000 and 0000 0000 0000 0110 1100 1000 0111 1111 or 28 14 Array: esempio 2 (seconda versione) Sia A un array di 100 word Istruzione C: g = h + A[i]; MIPS : sll sll $t1, $t1, $s4, $s4, 22 add add $t1, $t1, $t1, $t1, $s3 $s3 lw lw $t0, $t0, 0($t1) 0($t1) add add $s1, $s1, $s2, $s2, $t0 $t0 ## # ## ## # ggin in $s1 $s1 hhin in $s2 $s2 ii in in $s4 $s4 addr.A addr.Ain in$s3 $s3 St1 St1 <<- 44 ** ii $t1 <- add. of A[i] cioè cioè ($s3 ($s3 ++ 44 ** i) i) St0 St0 <<- A[i] A[i] g = h + A[i] 29 15