Le tre famiglie fondamentali Laboratorio di Architettura Lezione 3 Andrea Torsello Dipartimento di Informatica Università Ca Foscari di Venezia Ci sono tre famiglie fondamentali di istruzioni, per: 1. Manipolazione di dati 2. Movimento di dati 3. Flusso di dati p.1/65 1. Manipolazione di dati p.2/65 1.1 Aritmetica di base 1.1 Aritmetica di base: +, -, *, /, < 1.2 Operazioni logiche Ovviamente, si possono eseguire le quattro operazioni fondamentali: +, -, *, / Più un test di diseguaglianza ( < ) p.3/65 p.4/65
ADDIZIONE SOTTRAZIONE add dest, reg1, reg2 In linguaggio macchina dunque: sub dest, reg1, reg2 In linguaggio macchina dunque: 0 reg1 reg2 dest 0 variant=20 hex Istruzione di tipo R 0 reg1 reg2 dest 0 variant=22 hex p.5/65 MOLTIPLICAZIONE p.6/65 MOLTIPLICAZIONE Mult reg1,reg2 In linguaggio macchina: 0 reg1 reg2 0 0 variant=18 hex NON C È IL DESTINATARIO Non c è il registro destinatario perché stiamo moltiplicando due registri (reg1 e reg2) Ogni registro è grande 32 bits, quindi il risultato è di 64 bits: servono DUE registri per tenere il risultato, non ne basta uno La scelta fatta è stata dunque quella di FISSARE i due registri dove andrà il risultato il risultato va nei due registri $Hi e $Lo (i primi 32 bits in $Hi, gli altri 32 in $Lo) p.7/65 p.8/65
DIVISIONE DIVISIONE div reg1, reg2 In linguaggio macchina: 0 reg1 reg2 0 0 variant=1a hex NEANCHE QUI C È IL DESTINATARIO Questa volta, il risultato STAREBBE in un registro (dividiamo un registro per qualcosa, quindi il risultato starebbe comodamente in un registro) MA... anche qui, per parallellismo con la moltiplicazione, si fissa il registro risultato il risultato va nel registro $Lo BONUS: viene anche calcolato il RESTO della divisione, che va nel registro $Hi < (minore) p.9/65 p.10/65 Variante immediata slt dest,reg1,reg2 slt = set less than Pone dest = 1 se reg1 < reg2, e 0 altrimenti In linguaggio macchina dunque: Per tutte queste operazioni, è possibile specificare direttamente un numero (di 16 bits) al posto di uno dei due registri: dest = registro1 operazione numero La corrispondente istruzione immediata si ottiene in assembly aggiungendo una i al nome: addi,... 0 reg1 reg2 dest 0 variant=2a hex p.11/65 p.12/65
ESEMPI delle varianti immediate 1.2 Operazioni Logiche Addizione classica add dest, reg1, reg2 Addizione immediata addi dest, reg1, numero In linguaggio macchina si possono effettuare: Spostamenti (shifts) AND, OR, XOR, NOR Non esite subi, perché? p.13/65 Operazioni logiche (cont.) Ma prima... p.14/65 A cosa servono? Servono a manipolare i bit Rivediamo la rappresentazione binaria... p.15/65 p.16/65
Numero binario E i negativi? Una word è composta da 32 cifre binarie b 31 b 30 b 29... b 2 b 1 b 0 il suo valore è : b 31 2 31 + b 30 2 30 +... + b 2 2 2 + b 1 2 + b 0 = 31 i=0 b i2 i Come facciamo a rappresentare i numeri negativi? Un modo è quello di mantenere un bit per il segno (bit 31), per cui 3 = 00000000000000000000000000000011-3 = 10000000000000000000000000000011 Sempre positivo p.17/65 Complemento a 1 p.18/65 Complemento a 2 Questa rappresentazione dei numeri negativi si chiama complemento a 1 è semplice da comprendere e le operazioni aritmetiche sono relativamente semplici da implementare...ma ha due rappresentazioni per 0: 0 = 00000000000000000000000000000000-0 = 10000000000000000000000000000000 il complemento a 1 è utilizzato per i numeri con la virgola (verdemo più avanti), ma per gli interi si usa un atra rappresentazione Il bit 31, invece di corrispondere a 2 31 lo faccimao corrispondere a 2 31 così b 31 b 30 b 29... b 2 b 1 b 0 vale 2 31 b 31 + 30 i=0 b i2 i per cui: 3 = 00000000000000000000000000000011-3 = 11111111111111111111111111111101 p.19/65 p.20/65
Vantaggi Addizione Il bit 31 ci dice comunque il segno Ogni numero è rappresentato in un unico modo Un po più complicato da capire, ma meno di quel che sembra Le operazioni sono semplici. vediamo come funziona l addizione tra due numeri con segno. Se i numeri sono entrambi positivi numeri positivi l operazione è invariata. NOTA: C è errore se c è un riporto alla 32-esima cifra (overflow) Se i numeri sono uno positivo e uno negativo l addizione funziona come se i due numeri non avessero segno! p.21/65 p.22/65 Addizione MIPS Se i numeri sono entrambi negativi è come una addizione senza segno delle prime 31 cifre. Il risultato è corretto solo se c è un riporto alla 32-esima cifra (overflow) Esempio (a 4 bit): -1 + -2 = (-8+4+2+1) + (-8+4+2) = -3 1111 + 1110 = (1) 111+110 =(1) 1101= (1) 101 = 1101 Le operazioni aritmetiche viste sin ora agivano su numeri con il segno Esistono varianti delle operazioni aritmetiche che considerano le words come cifre a 32 bit senza segno Le varianti senza segno si identificano perché finiscono per u: addu, addiu, subu, subiu,... p.23/65 p.24/65
Operazioni logiche AND, OR, XOR Torniamo alle operazioni sui bit... Codificano le corrispettive operazioni logiche Interpretazione logica sui bits: 0 falso 1 vero p.25/65 AND, OR, XOR (cont.) AND p.26/65 Tutte queste operazioni, eseguite su numeri più grandi di un singolo bit, vengono eseguito bit a bit Esempio: 1011 and 0110 = 0010 Tabella della AND ( e ): 0 0 0 1 0 0 0 1 0 1 1 1 p.27/65 p.28/65
OR XOR Tabella della OR ( o ): 0 0 0 1 0 1 0 1 1 1 1 1 Tabella della XOR ( o esclusivo ): 0 0 0 1 0 1 0 1 1 1 1 0 p.29/65 Perché proprio queste? p.30/65 Perché (cont.) Al di là della interpretazione logica, ci sono tantissime altre funzioni possibili Esempio: 0 0 1 1 0 0 0 1 1 1 1 1 Perché tramite queste tre operazioni, possiamo ottenere qualsiasi altra operazione sui bit Questo spiega perché bastano queste tre Non sono le uniche con questa proprietà, ma sono anche tra le più utili in pratica p.31/65 p.32/65
Numero minimo NAND Qual è il numero minimo di operazioni con cui possiamo ottenere ogni altra operazione sui bit? Ne basta una! per esempio... NAND (not and) Tabella della NAND: 0 0 1 1 0 1 0 1 1 1 1 0 p.33/65 Cosa fanno? AND 0 p.34/65 Interpretazione funzionale Tramite AND, OR e XOR possiamo modificare un bit a seconda se il secondo operando è 0 o 1 and 0, oppure and 1 and 0 : 0 and 0 = 0 [copia] 1 and 0 = 0 [metti 0 (spegni)] Cioè: 0 and 0 = 0 [spegni] 1 and 0 = 0 [spegni] and 0 serve a SPEGNERE p.35/65 p.36/65
AND 1 AND and 1 : 0 and 1 = 0 [copia] 1 and 1 = 1 [copia] and 1 serve a COPIARE Due operazioni: and 0 : SPEGNERE and 1 : COPIARE p.37/65 In Assembler p.38/65 AND in Assembler and agisce su words, il che significa che possiamo agire contemporaneamente sui 16 bits di una word, con le due operazioni sopra dette (CANCELLA o COPIA) Esempio: andi $t0, $t1, 127 andi $t0, $t1, 0000000011111111 prendi t1, cancella gli 8 bits piu a sinistra, copia gli 8 bits più a destra, e metti il risultato in t0 Se t1= 1010101010101010 allora con la and t0= 0000000010101010 p.39/65 p.40/65
AND A cosa serve? and dest, reg1, reg2 In linguaggio macchina dunque: 0 reg1 reg2 dest 0 variant=24 hex verificare quali bit siano accesi t1 andi 000000000100000 è diverso da 0 se e solo se dice se il sesto bit di t1 è acceso. in grafica...per animazione e rilevamento delle collisioni p.41/65 p.42/65 OR 0 OR 1 or 0 : 0 or 0 = 0 [copia] 1 or 0 = 1 [copia] or 0 serve a COPIARE or 1 : 0 or 1 = 1 [accendi] 1 or 1 = 1 [copia] Cioè: 0 or 1 = 1 [accendi] 1 or 1 = 1 [accendi] or 1 serve ad ACCENDERE p.43/65 p.44/65
OR A cosa serve or dest, reg1, reg2 In linguaggio macchina dunque: In grafica... per accendere selettivamente (disegnare solo la figura) (Il mouse pointer) 0 reg1 reg2 dest 0 variant=25 hex p.45/65 p.46/65 XOR 0 XOR 1 xor 0 : 0 xor 0 = 0 [copia] 1 xor 0 = 1 [copia] xor 0 serve a COPIARE xor 1 : 0 xor 1 = 1 [accendi] 1 xor 1 = 0 [spegni] Cioè: 0 xor 1 = 1 [inverti] 1 xor 1 = 0 [inverti] or 1 serve ad INVERTIRE p.47/65 p.48/65
XOR XOR Due operazioni: xor 0 : COPIARE xor 1 : INVERTIRE xor dest, reg1, reg2 In linguaggio macchina dunque: 0 reg1 reg2 dest 0 variant=26 hex p.49/65 p.50/65 Utilità Esempi INVERTIRE è una operazione che è reversibile (INVERTI(INVERTI)) = COPIA non necessita di memoria ulteriore... Giochi (trasparenza, refresh, sprites) Grafica e suono... p.51/65 p.52/65
Il miracolo... Soluzione classica Volete implementare la funzione SCAMBIA (SWAP), che scambia il contenuto di due registri (o variabili) R1 e R2 Ad esempio, se t0=5 e t1=12, dopo SCAMBIA (t0,t1) avremo t0=12 e t1=5 Quanti registri servono come minimo...? Servono tre registri I due registri, più un registro temporaneo TEMP TEMP := R1 R1 := R2 R2 := TEMP p.53/65 Il miracolo di XOR LE SHIFT s p.54/65 Miracolosamente, invece, usando XOR servono SOLO DUE REGISTRI Paradossale!!!! esercizio (basta usare solo la xor e nessun altra istruzione) capite come si sposta l informazione... Shift right (sposta a destra) 1011111111111111 0101111111111111 Shift left (sposta a sinistra) 1011111111111111 1011111111111110 Sono istruzioni ibride, nel senso che agiscono sia a livello di bit che a livello di word p.55/65 p.56/65
Shift s Spostamenti (shifts) Cosa fanno le shifts? A livello di bit, spostano appunto a destra o a sinistra A livello di WORD: Uno shift a sinistra MOLTIPLICA per DUE Uno shift a destra DIVIDE per DUE ATTENZIONE ai numeri negativi... Lo shift (spostamento) di un numero avviene a destra o a sinistra: SHIFT A DESTRA: si cancella la cifra più a destra, e si mette uno zero a sinistra SHIFT A SINISTRA: si cancella la cifra più a sinistra, e si mette uno zero a destra ATTENZIONE: lo shift è SEMPRE inteso per numeri binari (la cifra è un bit) ESEMPI p.57/65 p.58/65 SHIFT MULTIPLO Shift a destra di 10111011 è 01011101 Shift a sinistra di 10111011 è 01110110 Lo shift classico è di una posizione Ovviamente, può essere di più posizioni: Lo shift a destra di n posizioni si ottiene facendo lo shift a destra n volte Lo shift a sinistra di n posizioni si ottiene facendo lo shift a sinistra n volte p.59/65 p.60/65
ESEMPI Spostamenti (cont.) Shift di tre posizioni a destra di 10111011 è 00010111 Shift di tre posizioni a sinistra di 10111011 è 11011000 Tornando al linguaggio macchina, si possono effettuare: Shifts a destra di n posizioni Shifts a sinistra di n posizioni p.61/65 SHIFT A DESTRA p.62/65 SHIFT A SINISTRA srl dest, reg2, spost srl = shift right logical, e spost è il numero di shifts che si devono fare In linguaggio macchina dunque: sll dest,reg2,spost sll = shift left logical, e spost è il numero di shifts che si devono fare In linguaggio macchina dunque: 0 0 reg2 dest spost variant=2 hex 0 0 reg2 dest spost variant=4 hex p.63/65 p.64/65
Cosa vedremo Tutti gli effetti collaterali di queste istruzioni Le loro varianti Come da queste operazioni basilari se ne derivano altre più potenti (soprattutto) a cosa servono veramente p.65/65