Università dell'Insubria A.A. 2016/17 Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate Instruction Set MIPS: piccolo prontuario MIPS R3000 Instruction Set Architecture Registri Categorie di istruzioni: Computazioni (per la ALU) Integer o Floating Point Logiche or matematiche Load / Store (memoria) Jump / Branch Speciali R0 - R31 PC HI LO Tre formati di istruzioni: tutti da 32 bit OP rs rt OP rs rt OP Architettura degli elaboratori Architettura degli elaboratori - Assembly rd sa immediate jump target - 18 - funct tipo R tipo I tipo J Il livello ISA 1 Università dell'Insubria A.A. 2016/17 Architettura MIPS - Registri sempre 0 32 x 32-bit registri generici r0 r1 ° ° ° r31 Registri speciali PC LO HI 32 x 32-bit registri floating point 00000000 00000000 00000000 00000000 f0 f1 ° ° ° f31 32 bit Architettura degli elaboratori MIPS Instruction Set Architecture - 19 - Modello della memoria di MIPS I programmi ipotizzano di avere 232 byte di memoria La memoria è indirizzabile a livello di byte Parole di 32 bit = 4 byte Le parole si trovano ad indirizzi multipli di 4 Ricordare sempre: la memoria include sia i dati che le istruzioni 00...0000 00...0100 00...1000 1 byte 11...1000 32 bit Architettura degli elaboratori Architettura degli elaboratori - Assembly - 20 - MIPS Instruction Set Architecture 2 Università dell'Insubria A.A. 2016/17 I campi delle istruzioni MIPS Tutte le istruzioni MIPS hanno lunghezza fissa (32 bit) R-type I-type op rs rt op rs rt J-type op 6 bits rd shamt funct imm address 5 bits 5 bits 5 bits 5 bits 6 bits campo significato op Codice dell’istruzione (opcode) rs Quale registro che fa da primo operando rt Quale registro fa da secondo operando (R-type) o da risultato (I-type) rd Quale registro fa da risultato (c’e’ solo nelle R-type) shamt Shift amount: di quanto shiftare il risultato (in alcune op) funct Function code – variante dell’istruzione imm Immediate value (16 bit): il valore del secondo operando Architettura degli elaboratori MIPS Instruction Set Architecture - 21 - Modi di indirizzamento MIPS / Formato delle istruzioni R-type op rs rt rd shamt funct Gli operandi sono tutti registri come in add $s1, $s2, $s3 Modalità di indirizzamento Register (direct) Op e funct indicano l’operazione da eseguire Shamt indica l’entità dello shift del risultato Architettura degli elaboratori Architettura degli elaboratori - Assembly - 22 - MIPS Instruction Set Architecture 3 Università dell'Insubria A.A. 2016/17 Modi di indirizzamento MIPS / Formato delle istruzioni I-type op rs rt imm Se Op indica una operazione matematica / logica Gli operandi dell’operazione sono il registro rs e il valore immediato Il risultato viene memorizzato nel registro rt Il valore immediato (16 bit) viene esteso a 32 bit con modalità diverse a seconda dell’op, come sappiamo. Se Op indica un salto condizionato (un «branch»): I due registri rs e rt sono usati per decidere SE saltare (con criterio dipende da Op, es «se sono uguali fra loro») Se si salta, a PC viene sommato Imm (esteso in segno) x4 (quindi si salta di max 32K istruzioni in avanti o in indietro) Architettura degli elaboratori MIPS Instruction Set Architecture - 23 - Modi di indirizzamento MIPS / Formato delle istruzioni J-type op address Istruzioni di salto incondizionato (si salta sempre) Address (26 bit) indica dove saltare: Vecchio PC: XXXX X….X 00 Nuovo PC: XXXX address 00 primi 4 bit inalterati Architettura degli elaboratori Architettura degli elaboratori - Assembly - 24 - MIPS Instruction Set Architecture 4 Università dell'Insubria A.A. 2016/17 MIPS: parole (la struttura fondamentale!) una parola (32 bit, 4 bytes, 1 word) può essere contenuta : in uno qualsiasi dei registri in 4 byte consecutivi di memoria centrale (spesso, allineati: il loro indirizzo base 2 termina con 00, 01, 10, 11) (in che ordine sono? Vedi endianness!) e può rappresentare : un dato (in virgola mobile, o in CP2, o naturale) una istruzione (MIPS!) un indirizzo di memoria (fra i dato, o fra le istruzioni) Architettura degli elaboratori - 25 - NB: Una parola (in mem o un reg) non «sa» cosa rappresenta. È il programmatore che lo deve sapere e la deve usare di conseguenza. Il livello ISA MIPS: mezze parole (assai meno usate) Una mezza parola (half-word: 16 bit, 2 bytes) può essere contenuta In 2 byte consecutivi di memoria (tipicamente …00 e …01, cioè allineatamente) Nella seconda metà di un’istruzione (di tipo I: è il suo campo imm16) In un registro (la parola sta tutta nella seconda metà del registro. Nella prima metà, si estende: tutti 0 o, nel caso di CP2: se numero negativo, tutti 1, se pos tutti 0) E può rappresentare Un dato a 16 bit (CP2 o binario senza segno) Architettura degli elaboratori Architettura degli elaboratori - Assembly - 26 - Il livello ISA 5 Università dell'Insubria A.A. 2016/17 MIPS: i bytes Un byte (8 bit) può essere contenuto In una sola casella di memoria (indicizzata da 32 bit qualsiasi – «indirizzamento al byte») In un registro (nei sui ultimi 8 bit. Nei primi 24, ci saranno tutti 0 o, nel caso di CP2 di un numero negativo, tutti 1) E può rappresentare Di nuovo: Un dato a 8 bit l’interpretazione di un dato (CP2: da -128 a +127; o binario: 0..255) non sta da nessuna parte se non nella mente Un carattere, per es di una stringa del programmatore (attraverso tabella ASCII) Assembly umano o del Etc (es il canale «rosso» di un pixel) compilatore Quindi un word può essere anche interpretato come 4 lettere consecutive in una stringa Una stringa: una sequenza di bytes (spesso, terminata dal byte 0x00) Architettura degli elaboratori - 27 - Il livello ISA MIPS si basa sulle words Scrivere su un registro attraverso computazioni: Si scrivono tutti i 32 bits del registro (sovrascrivendo tutti i bit precedenti) Tutte le operazioni (logiche o matematiche) sono sempre fra parole di 32 bit, con risultato a 32 bits (non ci sono op che scrivono solo su una parte di un registro) (ci sono op che scrivono due registri insieme: HI e LO) Scrivere su un registro attraverso letture da memoria: Si scrivono tutti i 32 bits del registro (sovrascrivendo tutti i bit precedenti) Se si è letto meno di una parola (un half-word o un byte), il dato letto viene esteso (con 0 o talvolta 1, come visto) Scrivere su memoria Si possono scrivere 4 byte, oppure anche solo 2 oppure 1 L’indirizzo si riferisce al primo byte scritto. Se 4 (o 2), di solito allineati : questo indirizzo per 00 (o per 0) (in molte implementazini HW è molto più efficiente se lo sono) Architettura degli elaboratori Architettura degli elaboratori - Assembly - 28 - Il livello ISA 6 Università dell'Insubria A.A. 2016/17 Registro 0: valore 0 il registro 0 contiene sempre il valore 0 000….0 : significa 0 sia intepretato in CP2, sia interpetato come binario, sia interpretato in virgola mobile anche se tentiamo di scrivere sul registro 0, il suo valore non cambia Architettura degli elaboratori Il livello ISA - 29 - Riassumendo: caratteristiche dell’ISA MIPS Dimensione fissa a 32 bit (3 formati) 31 registri da 32 bit (R0 contiene zero) e 32 registri FP (e HI LO) Istruzioni aritmetiche a tre indirizzi (registri) Unica modalità d’indirizzamento per: base+spiazzamento Istruzioni di salto condizionato semplici Confronto di un registro con zero, confronto di uguaglianza e disuguaglianza tra due registri Architettura degli elaboratori Architettura degli elaboratori - Assembly - 30 - MIPS Instruction Set Architecture 7 Università dell'Insubria A.A. 2016/17 Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate Architetture degli elaboratori: Assembly (del MIPS): piccolo prontuario Marco Tarini Dipartimento di Scienze Teoriche e Applicate [email protected] Linguaggio Assembly Linguaggio molto aderente ad un Instruction Set, Specifico per un Instruction Set Rapporto (quasi) 1:1 fra comandi Assembly e istruzioni binarie Pensato per essere più facile da leggere o scrivere per noi esseri umani, rispetto al linguaggio macchina: add $13, $4, $3 VS 000010010001101000110000011000 Assembler: programma che effettua la traduzione. Fa per noi molti lavoretti che sarebbero tediosi ma banali, come: tradurre le operazioni in OP codes (di sei bit) tradurre in base 2 (o in CP2) gli indici dei registri e gli immediate calcolare gli offset delle destinazioni dei salti tenere traccia degli indirizzi a cui sono merizzati dati ed istruzioni altro, come vedremo Architettura degli elaboratori Architettura degli elaboratori - Assembly - 32 - Il livello ISA 8 Università dell'Insubria A.A. 2016/17 Istruzione in Assembly Registri su cui si opera (corrispondono ai campi Rt, Rs e Rd) L’immediato (il campo imm16) addi $13, $4, 162 add $13, $4, $3 le virgole sono opzionali «i» sta per immediate codice mnemonico dell’istruzione (corrisponde al campo OP e FUNCT) In Assembly, l’ordine degli operandi è comodamente fisso: a differenza del MIPS binario, in cui varia fra le istruzioni R e I il PRIMO paramtero rappresenta sempre il risultato il registro che viene scritto (se l’op prevede di scrivere un reg) $13 in questo esempio Seguono gli operandi (che siano registri o immediate) Architettura degli elaboratori - 33 - Il livello ISA Commenti e indentazione In Assembly, spazi, tab e accapo vengono ignorati (posso indentare il programma come voglio) Per rendere il codice più comprensibile in Assembly posso aggiungere dei commenti Verranno semplicemente ignorati dal compilatore Sintassi: i commenti vanno dal carattere # alla fine della linea # commento add $13, $4, $3 # questo fa $13 <- $4 + $3 (sono questi due semplici ma cruciali elementi che rendono l’Assembly molto più comprensibile del linguaggio macchina) Architettura degli elaboratori Architettura degli elaboratori - Assembly - 34 - Il livello ISA 9 Università dell'Insubria A.A. 2016/17 Traduzione delle istruzioni da Assembly a linguaggio macchina Esempio, l’istruzione MIPS add $8, $17, $18 è tradotta così: add $8 $17 $18 op = 0 = 0000002 shamt = 0 = 0000002 funct = 32 = 1000002 rd = 8 = 010002 rs = 17 = 100012 rt = 18 = 100102 000000 op Architettura degli elaboratori 10001 10010 rs rt 01000 00000 rd shamt 100000 funct MIPS Instruction Set Architecture - 35 - Istruzioni assembly MIPS per operazioni aritmetiche Nome completo Esempio Significato add add $1,$2,$3 $1 = $2 + $3 subtract sub $1,$2,$3 $1 = $2 – $3 add immediate addi $1,$2,100 $1 = $2 + 100 add unsigned addu $1,$2,$3 $1 = $2 + $3 subtract unsignedsubu $1,$2,$3 $1 = $2 – $3 add imm. unsign. addiu $1,$2,100 $1 = $2 + 100 multiply mult $2,$3 Hi, Lo = $2 x $3 multiply unsigned multu $2,$3 Hi, Lo = $2 x $3 divide div $2,$3 Lo = $2 ÷ $3, Hi = $2 mod $3 divide unsigned divu $2,$3 Lo = $2 ÷ $3, Hi = $2 mod $3 Move from Hi mfhi $1 $1 = Hi Move from Lo mflo $1 $1 = Lo Architettura degli elaboratori Architettura degli elaboratori - Assembly - 36 - Commenti . 3 operandi; 3 operandi; + costante; 3 operandi; 3 operandi; + costante; prodotto con segno da 64-bit prodotto senza segno da 64-bit Lo = quoziente, Hi = resto Quoziente e resto senza segno Copia Hi Copia Lo MIPS Instruction Set Architecture 10 Università dell'Insubria A.A. 2016/17 Operazioni aritmetiche «con la U» La «u» nei comandi artimetici (come addu) sta per «unsigned», ma il nome è fuorviante (ricorda: la somma di numeri in CP2, e la somma in binario senza segno sono la stessa operazione, cambia solo la gestione dell’overflow) La vera differenza: il comando senza la «u» può generare eccezione di overflow il comando con la «u» semplicemente ignora l’overflow In conclusione, si può verificare overflow solo in alcune istruzioni aritmetiche: add, sub, addi nelle altre op matematiche, non si verifica o viene ignorato. nelle op logiche, non si verifica mai Architettura degli elaboratori Il livello ISA - 37 - Moltiplicazione / divisione Moltiplicazione / divisione: (mult e div) scrivono su una coppia di registri speciali: Hi e Lo (non fanno parte dei 32 registri) Ricorda: moltiplicando due numeri da n bit ottengo un numero da 2n bit. Registers Mult/Div Unit Il valore di Hi e Lo si travasa in normali registri con: mfhi rd mflo rd Architettura degli elaboratori Architettura degli elaboratori - Assembly HI - 38 - LO MIPS Instruction Set Architecture 11 Università dell'Insubria A.A. 2016/17 Istruzioni assembly MIPS per operazioni logiche Istruzioni Esempio Significato Commento and or xor nor and immediate or immediate xor immediate shift left logical shift right logical shift right arithm. shift left logical shift right logical shift right arithm. and $1,$2,$3 or $1,$2,$3 xor $1,$2,$3 nor $1,$2,$3 andi $1,$2,10 ori $1,$2,10 xori $1, $2,10 sll $1,$2,10 srl $1,$2,10 sra $1,$2,10 sllv $1,$2,$3 srlv $1,$2,$3 srav $1,$2,$3 $1 = $2 & $3 $1 = $2 | $3 $1 = $2 $3 $1 = ~($2 |$3) $1 = $2 & 10 $1 = $2 | 10 $1 = $2 10 $1 = $2 << 10 $1 = $2 >> 10 $1 = $2 >> 10 $1 = $2 << $3 $1 = $2 >> $3 $1 = $2 >> $3 3 operandi 3 reg.; AND logico 3 operandi 3 reg.; OR logico 3 operandi 3 reg.; XOR logico 3 operandi 3 reg.; NOR logico AND logico tra reg. e costante OR logico tra reg. e costante XOR logico tra reg. e costante Shift a sinistra di una costante Shift a destra di una costante Shift a destra (con est. in segno) Shift a sinistra di una variabile Shift a destra di una variabile Shift a destra di una variabile (con est. in segno) Architettura degli elaboratori - 39 - MIPS Instruction Set Architecture Istruzioni assembly MIPS per operazioni aritmetiche e logiche Il risultato dell’op viene sempre memorizzato nel primo registro indicato Eccezione: mult e div, che scrivono invece due apposite registri speciali HI e LOW I due operandi dell’op sono: nelle versioni non immediate (e negli shift con variabile): i due registri indicati nelle versioni immediate: (e negli shift senza variabile): un registro dato e un valore dato Il valore nelle istruzioni con immediate: E’ memorizzato nel campo imm16 di una istruzione I (di16 bit!) E’ in CP2 nelle op aritmetiche (e quindi viene esteso in segno). Val max = ?. Val min = ?. Senza segno nelle op logiche (ed quindi viene esteso con 0) Val max = ?. Val min = ?. Architettura degli elaboratori Architettura degli elaboratori - Assembly - 40 - MIPS Instruction Set Architecture 12 Università dell'Insubria A.A. 2016/17 Istruzioni assembly MIPS per operazioni logiche Le op logiche lavorano bit a bit Lo shift a sinistra fa apparire 0 da destra Corrisponde a dividere per 2^n Due versioni dello shift a destra: Far apparire 0 a sinistra (vers logica) Far apparire a sinistra il bit più significativo (vers aritmetica) Corrisponde a moltiplicare per 2^n (nella versione aritmetica: questo vale per i numeri in CP2) Lo shift di una costante, il valore di cui si shifta è memorizzato, in linguaggio macchina, nell’apposito campo da 5 bit delle istruzioni R (quindi vale da 0 a 31… ma i più non serve mai!) Architettura degli elaboratori Il livello ISA - 41 - Estensione in segno / con zero (ripasso) L’estensione in segno è utilizzata per gli immediati con segno (ad es. in addi) e i valori con segno dalla memoria (lb). Per estendere in segno un numero di n bit a n+m bit, bisogna copiare il bit di segno (il MSB) m volte. Per esempio, con n = 4 e m = 4: 1011 = -4 0101 =5 11111011 = -4 00000101 =5 L’estensione con zeri è usata per le operazioni logiche (ad es. ori), e valori senza segno da memoria (lbu) Per estendere con zeri un numero da n bit a n+m bit, basta inserire m zeri. Per esempio, con n = 4 e m = 4: 1101 = 13 0101 =5 00001101 = 13 00000101 =5 Architettura degli elaboratori Architettura degli elaboratori - Assembly - 42 - MIPS Instruction Set Architecture 13 Università dell'Insubria A.A. 2016/17 Istruzioni assembly MIPS per trasferire registri da/a la memoria Istruzione Commento sw $3, 500($4) sh $3, 502($2) sb $2, 41($3) Store word Store half Store byte lw $1, 30($2) lh $1, 40($3) lhu $1, 40($3) lb $1, 40($3) lbu $1, 40($3) lui $1, 40($3) Load word Load halfword Load halfword unsigned Load byte Load byte unsigned Load Upper Immediate (16 bits shifted left by 16) Architettura degli elaboratori da registro a mem (store) - 43 - da mem a registro (load) MIPS Instruction Set Architecture Istruzioni assembly MIPS per trasferire registri da/a la memoria L’indirizzo a cui si legge o scrive è quello contenuto nel registro indicato fra parentesi, incrementato del valore eventualmente indicato prima della parentesi esempi: ($16) usare l’inidirizzo contenuto nel registro 16 500($4) usare l’indirizzo contenuto nel registro 4, incrementato di 500 byte (cioè di 500/4 = 125 word) -4($16) usare l’inidirizzo contenuto nel registro 16, decrementato di 4 Architettura degli elaboratori Architettura degli elaboratori - Assembly - 44 - Il livello ISA 14 Università dell'Insubria A.A. 2016/17 Istruzioni assembly MIPS per trasferire registri da/a la memoria Store: si leggono 1, 2 o 4 byte dal registro indicato nel 1mo parametro (4 se word. 2 se half. 1 se byte. Se 1 o 2: i meno significativi) li si scrivono in 1, 2, o 4 byte consecutivi in memoria Load: caso word: si leggono 4 byte dalla memoria caso short/byte unsigned: si leggono 2/1 byte e si estendono con 0 caso short/byte: si leggono 2/1 byte e si estendono in segno caso lui: si leggono 2 byte e si shiftano a sinistra di 16 bit in tutti i casi: si scrivono tutti i 4 byte risultanti nel registro indicato Architettura degli elaboratori - 45 - Il livello ISA Istruzioni assembly MIPS per branch (salti condizionali) Con confronto fra due registri beq rs, rt, dest equal, if R[rs] == R[rt] then jump to dest bne rs, rt, dest not equal, Con confronto fra un registro e zero blez rs, dest less-or-equal zero, if R[rs] <= 0 then jump bgtz rs, dest greater-then zero > bgez rs, dest greater-or-equal zero >= bgezal rs, dest come sopra «…and link» (vedi poi) bltz rs, dest less-than zero < bltzal rs, dest come sopra «…and link» (vedi poi) Architettura degli elaboratori Architettura degli elaboratori - Assembly - 46 - MIPS Instruction Set Architecture 15 Università dell'Insubria A.A. 2016/17 Istruzioni assembly MIPS per branch (salti condizionali) L’instruction set MIPS mette a disposizioni molte varianti di branch (b-), diverse per: l’operatore del paragone che determina se saltare oppure no: minore uguale (-le-), maggiore (-gt-), etc se il paragone avviene fra due registri, oppure fra un registro e lo zero (-z-) «and link» (-al) : se, in caso di salto, deve essere memorizzato l’indirizzo dell’istruzione che ha causato il salto, (in modo da poterci tornare con un’apposita istruzione di ritorno) (utile quando il salto serve per eseguire una subroutines, vedi poi). …ma non tutte le varianti possibili sono previste! (es: R1>R2 non lo è) Per implementare le varianti non previste, saranno necessarie due o più istruzioni: Prima: calcolo della condizione (es: R3 = R1-R2) Poi: salto condizionale (es: R3 > 0 ) (tipico esempio della filosofia RISC in azione!) Architettura degli elaboratori - 47 - Il livello ISA Istruzioni assembly MIPS per branch (salti condizionali) L’istruzione MIPS binaria come sappiamo memorizza la destinazione del salto come un offset rispetto al PC corrente (salto «relativo») L’offset è memorizzato nel campo imm16 di una istruzione di tipo I L’offset è un numero di 16 bit in CP2 L’offset rappesenta il num. di istruzioni da saltare (avanti o indietro) Cioè il num di words di cui spostare il CP2 Cioè il PC+4 va incrementato di Offset x 4 bytes (ext in segno) Il programmatore indica direttamente la destinazione del salto L’assembler calcola per noi l’offset necessario per raggiungerla, e lo scrive nel campo imm16 del comando in binario (comodo !) La destinazione può seguire oppure precedere l’istruzione del salto (perché offset ha il segno) Ma non può essere più lontana di 2^15 istruzioni! Altrimenti errore. (perché offset ha solo 16 bit in CP2). Sono salti… corti ! Architettura degli elaboratori Architettura degli elaboratori - Assembly - 48 - Il livello ISA 16 Università dell'Insubria A.A. 2016/17 Istruzioni assembly MIPS per Jump (salti non condizionali) Istruzione Esempi Significato jump j 10000 vai all’ istruzione 10000 jump and link jal 10000 vai all’ istruzione 10000… and link jump register jr $31 vai all’istruzione contenuta nel registro $31 Architettura degli elaboratori - 49 - MIPS Instruction Set Architecture Istruzioni assembly MIPS per Jump (salti non condizionali) Jump salta ad un indirizzo dato. L’istruzione MIPS binaria corrispondente, di tipo J , memorizza la destinazione nel suo campo address E’ un campo di ben 26 bits (il tipo J esiste apposta per questo) Due zeri finali sono sottointesi (è l’indice di un word) = 28 bits Il PC mantiene i primi 4 bits inalterati, e i suoi 28 bits meno significativi vengono sostituiti: salto (quasi) «assoluto» Quindi: l’istruzione può saltare anche molto lontano. Salto lungo! L’unico vincolo è che non si può uscire dal blocco di 2^26 istruzioni Tipicamente, il programmatore determina la destinazione attraverso un’etichetta (vedi poi); address viene calcolato dall’assembler. Jump address salta ad un indirizzo memorizzato in un registro dato PC viene sostituito del tutto dai 32 bit del registro: salto «assoluto» Si può saltare… assoltamente ovunque nel codice. No limits. Salti… lunghissimi! (ma bisogna approntare un registro) Architettura degli elaboratori Architettura degli elaboratori - Assembly - 50 - Il livello ISA 17 Università dell'Insubria A.A. 2016/17 Istruzioni assembly MIPS per assegnamenti condizionali Istruzioni Esempi Significato set on less than slt $1,$2,$3 if ($2 < $3) $1=1; else $1=0 < (complemento a 2) set on less than immediate slti $1,$2,100 if ($2 < 100) $1=1; else $1=0 <costante (complemento a 2) set on less than unsigned sltu $1,$2,$3 if ($2 < $3) $1=1; else $1=0 < (numeri senza segno) set less then immediate unsigned sltiu $1,$2,100 if ($2 < 100) $1=1; else $1=0 <costante (numeri senza segno) Architettura degli elaboratori - 51 - MIPS Instruction Set Architecture Confronto con segno e senza R1= 0…00 0000 0000 0000 00012 = 110 R2= 0…00 0000 0000 0000 00102 = 210 R3= 1…11 1111 1111 1111 11112 = 232-1 or -110 Dopo l’esecuzione di queste istruzioni: slt r4,r2,r1 ; if (r2 < r1) r4=1; else r4=0 slt r5,r3,r1 ; if (r3 < r1) r5=1; else r5=0 sltu r6,r2,r1 ; if (r2 < r1) r6=1; else r6=0 sltu r7,r3,r1 ; if (r3 < r1) r7=1; else r7=0 Quali valori si trovano nei registri r4 - r7? r4 = 0; R2==2 non è minore di R1==1 r5 = 1; R3==-1 è minore di R1==1 r6 = 0; R2==2 non è minore di R1==1 r7 = 0 ; R3== 232-1 non è minore di R1==1 Architettura degli elaboratori Architettura degli elaboratori - Assembly - 52 - MIPS Instruction Set Architecture 18 Università dell'Insubria A.A. 2016/17 Convenzioni nell'uso dei registri Per compilare una data procedura, il compilatore (o il programmatore umano) deve sapere quali registri può usare e quali sono in uso da parte di altre procedure. Da qui la necessità di regole e convenzioni per l'uso dei registri Non implementate in HW Compilatori e programmatori le devono seguire, pena bugs insidiosi, anche molto difficili da trovare. Architetture - 53 - Programmazione ASM MIPS Convenzioni nell'uso dei registri I registri $at (1), $k0 (26), e $k1 (27) riservati per l'assemblatore e il sistema operativo. NON devono essere usati dai programmatori o dall'assembler I registri $a0–$a3 (4–7) usati per passare i primi 4 argomenti alle routine. (ulteriori eventuali argomenti sono passati sulla pila (molto più lenta!) I registri $v0 e $v1 (2, 3) usati dalle funzioni per restituire valori al chiamante. I registri $t0–$t9 (8–15, 24, 25) usati per memorizzare valori temporanei, quelli che non è necessario preservare tra una chiamata e l'altra. ogni procedura li può usare senza preoccuparsi di “sporcarli” I registri $s0–$s7 (16–23) usati per valori che devono essere preservati tra una chiamata e l'altra. Il loro significato non è locale alla chiamata corrente. Architetture Architettura degli elaboratori - Assembly - 54 - Programmazione ASM MIPS 19 Università dell'Insubria A.A. 2016/17 Convenzioni nell'uso dei registri Il registro $gp (28) è un puntatore globale che punta ad un blocco di memoria da 64K nel segmento dei dati statici. Il registro $sp (29) è lo stack pointer, che indirizza l'ultima posizione dello stack (vedremo) Il registro $fp (30) è il frame pointer (vedremo). Il registro $ra (31) contiene l'indirizzo di rientro dalla chiamata di procedura (vedremo). Architetture Programmazione ASM MIPS - 55 - Scrittura di comandi in assembly: gli operandi che sono registri L’Assembly ci consente di riferirci ai 32 registri anche attraverso dei sinonimi che riflettono il loro uso convenzionale $0 $1 $2 $3 $4 $5 $6 $7 Sinonimo: $r0 Registro: $at $v0 $v1 $a0 $a1 $a2 $a3 Registro: $8 $9 $10 $11 $12 $13 $14 $15 Sinonimo: $t0 $t1 $t2 $t3 $t4 $t5 $t6 $t7 Registro: $16 $17 $18 $19 $20 $21 $22 $23 Sinonimo: $s0 $s1 $s2 $s3 $s4 $s5 $s6 $s7 Registro: $24 $25 $26 $27 $28 $29 $30 $31 $t9 $k0 $k1 $gp $sp $s8 $ra Sinonimo: $t8 add $s3, $t3, $t4 Architetture Architettura degli elaboratori - Assembly equivalente a - 56 - add $19, $11, $12 Programmazione ASM MIPS 20 Università dell'Insubria A.A. 2016/17 Scrittura di comandi in assembly: gli operandi che sono immediate Il campo immediate può essere scritto: In base 10 In base 16, precedendo le cifre con 0x Come carattere ascii, fra apicetti singoli addi $3, $3, 97 addi $3, $3, 0x61 Sinonimi (il terzo registro viene incrementato di 97, il cui codice ASCII è ‘a’) addi $3, $3, ‘a‘ Architettura degli elaboratori - 57 - Il livello ISA Pseudo-istruzioni L’assembler MIPS supporta diverse pseudo-istruzioni: Non corrispondono ad istruzioni nell’Instruction Set (l’archiettura HW non le conosce!) Sono implementate mediante una o più istruzioni dell’IS Semplificano la programmazione in linguaggio assembly La pseudo-istruzione move $t0, $t1 (copia $t1 in $t0) è implementata come add $t0, $zero, $t1 La pseudo-istruzione blt $s0, $s1, addr (branch less then – salta se $s0<$s1) è implementata come due istruzioni: slt $at, $s0, $s1 bne $at, $zero, addr (nota: uso del registo riservato all’assembler) Architettura degli elaboratori Architettura degli elaboratori - Assembly - 58 - MIPS Instruction Set Architecture 21 Università dell'Insubria A.A. 2016/17 Pseudo-istruzioni La pseudo-istruzione la $t0, addr (load address, copia l’indirizzo addr in $t0) è implementata come lui $t0, addr (load unsigned immediate) La pseudo-istruzione li $t0, val (load immediate, copia il valore val in $t0) è implementata come due istruzioni: ori $t0, $0, val (or bit a bit fra val e il registro $0 cioè il valore 0) Le pseudo-istruzioni rendono il linguaggio Assembly ulteriormente più ad alto livello del linguaggio macchina (Rimane un linguaggio a bassissimo livello, rispetto a, per es, C o, ancora molto di più, Java) Architettura degli elaboratori - 59 - MIPS Instruction Set Architecture Un programma in assembly Ricorda che un programma è costitutito da Dati, (in assembly: parte “data”) Istruzioni (il codice che lavora sui dati), (in assembly: parte “text”) memorizzate in due apposite aree della memoria (localizzate secondo alcune convenzioni che non ci interessano) Un programma Assembly non è altro che un file di testo che descrive il contenuto della memoria (in ciascuna delle due aree) Consiste quindi in due sequenza di parole consecutive (e/o mezze parole, e/o bytes) espresse in ASCII Architettura degli elaboratori Architettura degli elaboratori - Assembly - 60 - Il livello ISA 22 Università dell'Insubria A.A. 2016/17 Un programma in assembly Es un programma potrebbe essere: .data .word 20, 10 Questo programma (che non ha senso alcuno!) .text prescrive 2 words nella parte data .word 30, 1234 e altre 2 words nella parte text Le parole (32 bits!) possono essere espresse in molti modi equivalenti: in decimale, es: 20 .word 20 in esadecimale, utile per la parte data es: 0x14 .word 0x14 con un carattere ascii, es: ‘a’ .word 'a' con un comando assembly, es: add add $t3, $t3, $s1, $s1, $s3 $s3 utile per la parte text Architettura degli elaboratori Il livello ISA - 61 - Direttive Comandi Assembly che spiegano all’Assembler come tradurre un programma Non producono istruzioni macchina! Sintassi: cominciano sempre con un punto Il programma precedente usa due direttive: .data «Memorizza gli elementi successivi nel segmento dati» .text «Memorizza gli elementi successivi nel segmento testo» Tipica struttura sorgente: .data …dati… .text …comandi… Architetture Architettura degli elaboratori - Assembly - 62 - Programmazione ASM MIPS 23 Università dell'Insubria A.A. 2016/17 Direttive: dati Alcune direttive spiega il formato in cui tentere, in memoria, i dati successivi: .word «Memorizza i valori successivi in 4 bytes» .half «Memorizza i valori successivi come half-word: cioè in coppie di byte» .byte «Memorizza i valori successivi in un byte ciascuno» .data .half 20, 2, 100 .byte 4, 'c' .word 0x40, 300 Architetture Nel segmento data sono memorizzati in tutto… 16 bytes - 63 - Programmazione ASM MIPS Direttive: dati Un scorciatoia speciale per dati consente di definire con facilità le stringe (intese come sequenze di caratteri, ciascuno reppresentato da un byte) .ascii "anna" Equivalente a: .byte 'a', 'n', 'n', 'a‘ Memorizza (in questo esempio): 4 bytes. .asciiz "anna" Un byte per carattere, seguiti da un ulteriore byte terminatore zero. Equivalente a: .byte 'a', 'n', 'n', 'a', 0 Equivalente a: .ascii "anna" .byte 0 Oppure a (in questo esempio): 5 bytes. Nota l’uso del doppio apice. La convenzione di terminare le strighe col byte 0 è comune a molti linguaggi di programmazione ad alto livello (C, Java, C++…), e dalle procedure di sistema (es quella che scrive stringhe su un monitor). Dette «null terminated strings» Architetture Architettura degli elaboratori - Assembly - 64 - Programmazione ASM MIPS 24 Università dell'Insubria A.A. 2016/17 Direttive: dati .space n Lascia uno spazio di n Bytes nel segmento dati. Utile per riservare dei bytes nel segmento data dove memorizzare i dati prodotti dalle istruzioni .align n Lascia alcuni byte di spazio in modo che il dato successivo sia scritto in un indirizzo divisible per 2n Utile per allineare i dati, ad esempio align 2 fa in modo che il word successive sia scritto ad un indirizzo che termina con 00, anche se i dati scritti in precedenza hanno occupato un numero dispari di bytes. Architetture - 65 - Programmazione ASM MIPS Etichette (label) Le etichette sono un’altra parte del programma Assembly che l’Assembler non traduce in alcuna istruzione macchina E’ un identificaore qualsiasi, scelto dal programmatore, introdotto come un nome seguito da un due-punti. Es: pippo: .word 19 Un’etichetta è un meccanismo che consente al programmatore assembly di riferirsi all’indirizzo a cui è stato memorizzato un dato o un’istruzione sarebbe complicato per il programmatore ricostruire questo indirizzo, ma è banale per l’assemnler. Architettura degli elaboratori Architettura degli elaboratori - Assembly - 66 - Il livello ISA 25 Università dell'Insubria A.A. 2016/17 Etichette (label): funzionamento Quando un’etichetta viene definita (cioè coniata, inventata, introdotta nel programma), l’assembler tiene traccia dell’indirizzo in cui sta per scrivere il prossimo dato o istruzione Nella definizione, l’etichetta appare seguita da due-punti ll programmatore può riferire (usare) un’etichetta (definita altrove) usandola al posto di un operando in un comando. L’assembler sostituisce l’etichetta con l’indirizzo corrispondente. Nel riferimento, l’etichetta appare senza il due-punti Un’etichetta può essere definita in un programma una sola volta, e essere riferita molte volte la definizione dell’etichetta può precedere oppure seguire il suo riferimento (questo comporta che l’assembler dovrà faticare un po’, e leggere il programma due volte) Architettura degli elaboratori - 67 - Il livello ISA Etichette (label): usi tipici Le etichette definite nella sezione data saranno riferite da comandi tipo load / store come indirizzo a cui leggere /scrivere quei dati .data popolaz: .word 40000 # definisco l’etichetta .text la $t1, popolaz # carica l’address popolaz in t1 lw $t2, 0($t1) # carica 40000 in $t1 Le etichette definite nella sezione text saranno riferite da comandi tipo jump / branch come indirizzo a cui saltare .text ite: sub $t2, $t2 , 1 # t2 = t2 - 1 bgtz $t2, ite # if (t2 > 0) goto ite Architettura degli elaboratori Architettura degli elaboratori - Assembly - 68 - Il livello ISA 26 Università dell'Insubria A.A. 2016/17 Label e direttive per definire dati Tipico uso: label: .tipo valore Es: pippo: .word 19 «nel primo indirizzo libero, al quale io mi riferirò in futuro chiamandolo con “pippo” (l’etichetta), piazza il valore 19 come un word (4 byte)» Somiglia molto al commando Java: int pippo = 19; Anche valori multipli label: .tipo val0, val1, … pippo: .word 19 , 12 , 13 Architetture - 69 - Programmazione ASM MIPS Altre direttive .globl pippo L’etichetta pippo determina quale sia il PC iniziale (“l’esecuzione parte da lì”) Altre direttive sono descritte sul libro Architetture Architettura degli elaboratori - Assembly - 70 - Programmazione ASM MIPS 27 Università dell'Insubria A.A. 2016/17 System call MIPS offre semplici servizi mediante chiamate di sistema (system call) predefinite Ogni chiamata è costituita da Codice dell’operazione Argomenti (opzionali) Valori di ritorno (opzionali) Architetture - 71 - Programmazione ASM MIPS Funzioni di sistema Architetture Architettura degli elaboratori - Assembly - 72 - Programmazione ASM MIPS 28 Università dell'Insubria A.A. 2016/17 Come fare una system call 1) Inserire il codice nel registro $v0 2) Inserire gli argomenti nei registri $a0-$a3 ($f12-$f15) 3) Eseguire l’istruzione syscall 4) Il valore di ritorno è nel registro $v0 ($f0) Architetture - 73 - Programmazione ASM MIPS Riassumendo L’Assembler semplifica la vita al programmatore, rispetto al linguaggio macchina, perché Traduce numeri da decimale, esadec, o ascii in binario Traduce codici mnemonici di op (come «add») in opcode binari Riordina i parametri a seconda che il comando sia di tipo R, o I, consentendo di fornire i parametri in un ordine consistente Rinominando i registri, consente di usare nomi più significativi («$t1») Mette a disposizione alcune Pseudo-Istruzioni ulteriori che semplificano il codice (traducendole in Istruzioni MIPS) Consente di indentare a piacere il codice (aggiungere accapi, spazi, tabulazioni) per renderlo più leggibile Consente di aggiungere commenti al codice (che semplicemente ignora) Tiene traccia degli indirizzi di dati ed istruzioni, attraverso il meccanismo delle etichette Calcola gli offset degli indirizzi rispetto al PC etc Tuttavia, programmare direttamente in Assembly rimane tremendamente difficile Nella realtà si usano sempre linguaggi più ad alto livello! Complilati e trasformati in Assembly o linguaggio macchina Architettura degli elaboratori Architettura degli elaboratori - Assembly - 74 - Il livello ISA 29