La programmazione dei calcolatori. Architetture dei Calcolatori (Lettere. Benefici dei linguaggi ad alto livello. Vantaggi e svantaggi dell assembler

Documenti analoghi
Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j

Architettura MIPS (RISC) Architetture dei Calcolatori (Lettere. Principi di Progettazione ISA MIPS MIPS R3000 ISA. Il Set di Istruzioni MIPS

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Linguaggio Assembly e linguaggio macchina

Linguaggio Assembly e linguaggio macchina

La programmazione dei calcolatori. L insieme delle istruzioni. Vantaggi e svantaggi dell assembler. Benefici dei linguaggi ad alto livello

Riassunto. Riassunto. Ciclo fetch&execute. Concetto di programma memorizzato. Istruzioni aritmetiche add, sub, mult, div

Lezione 20. Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly

L insieme delle istruzioni

Università degli Studi di Cassino

Corso di Calcolatori Elettronici MIPS: Istruzioni di confronto Istruzioni di controllo Formato delle istruzioni in L.M.

Richiami sull architettura del processore MIPS a 32 bit

Il Linguaggio Assembly: Gestione della memoria e controllo

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione

Istruzioni assembler Istruzione N Registri

Il processore: unità di elaborazione

Laboratorio di Architettura degli Elaboratori LabArch 2007 Terzo Quadimestre, a.a Docente: H. Muccini

Calcolatori Elettronici

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

Corso di Architettura (Prof. Scarano) 09/04/2002

Architettura dei calcolatori e sistemi operativi. Il processore Capitolo 4 P&H

Architettura degli Elaboratori Lez. 8 CPU MIPS a 1 colpo di clock. Prof. Andrea Sterbini

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Esempio di procedura annidata. L insieme delle istruzioni (5) Esempio di procedura annidata (2) set_array: Esempio di procedura annidata (3)

Lezione 2 Assembly MIPS (2)

Università degli Studi di Roma La Sapienza

Processore. Memoria I/O. Control (Parte di controllo) Datapath (Parte operativa)

Istruzioni macchina. Dove sono gli operandi? Ciclo della CPU. Elementi di un istruzione macchina. Rappresentazione delle istruzioni

Elementi base per la realizzazione dell unità di calcolo

Università degli Studi di Cassino

Linguaggio macchina. 3 tipi di istruzioni macchina. Istruzioni per trasferimento dati. Istruzioni logico/aritmetiche

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

Architettura di un calcolatore e linguaggio macchina. Primo modulo Tecniche della programmazione

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Architettura di tipo registro-registro (load/store)

Implementazione semplificata

Lecture 2: Prime Istruzioni

Progetto CPU (ciclo singolo) Salvatore Orlando

Le costanti Le modalità di indirizzamento L assembly del MIPS

Laboratorio di Architetture degli Elaboratori II (A.A )

Sommario Introduzione al linguaggio Assembly. Calcolatori Elettronici Prof. Gian Luca Marcialis. Le operazioni fondamentali

Laboratorio di Architettura degli Elaboratori

Processore: Datapath & Control. Progetto CPU (ciclo singolo) Rivediamo i formati delle istruzioni. ISA di un MIPS-lite

Materiale didattico. Materiale didattico. Architettura MIPS. Il linguaggio Assembly parte I. Architettura degli Elaboratori e delle Reti

Lezione4: MIPS e Istruzioni (1 Parte)

Somma di numeri floating point. Algoritmi di moltiplicazione e divisione per numeri interi

Architetture dei Calcolatori

Architettura degli Elaboratori B Introduzione al corso

Linguaggio Assembler MIPS

Architettura di una CPU

Linguaggi di alto livello, compilatori e interpreti

Architettura degli Elaboratori

Accesso a memoria. Accesso a memoria. Accesso a memoria. Modalità di indirizzamento. Lezione 5 e 6. Architettura degli Elaboratori A.

1. Si effettui la divisione di 7/5 utilizzando un efficiente algoritmo e illustrando la corrispondente architettura hardware.

Linguaggi e moduli. Dott. Franco Liberati

Macchine Astratte. Luca Abeni. February 22, 2017

Sistemi di numerazione

Unità aritmetica e logica

Calcolatori Elettronici A a.a. 2008/2009

Calcolatori Elettronici A a.a. 2008/2009

Capitolo 5 Elementi architetturali di base

Piccola Introduzione al Linguaggio Assembly e Simili Amenità. Luca Abeni

Come caricare costanti lunghe 32 bits. Caricamento di costanti. Indirizzamento nei salti. Indirizzamento nei salti

Macchine Astratte. Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari. Linguaggi di Programmazione feb, 2016

ARCHITETTURA DI UN SISTEMA DI ELABORAZIONE

Lezione 15. L elaboratore Elettronico

System Calls, Register Spilling

Architettura degli Elaboratori. Classe 3 Prof.ssa Anselmo. Appello del 18 Febbraio Attenzione:

L unità di controllo. Il processore: unità di controllo. Le macchine a stati finiti. Struttura della macchina a stati finiti

Esercitazione di Calcolatori Elettronici Ing. Battista Biggio. Corso di Laurea in Ingegneria Elettronica. Capitolo 5 Linguaggio Assembly

Struttura CPU. Struttura e Funzione del Processore. Capitolo 12. Compiti CPU:

Architettura degli Elaboratori

Architettura degli Elaboratori Modulo 2

Linguaggio Assembler MIPS

Il Ciclo Fetch-Decode-Execute. C Nyssen/Aberdeen College 2003

Architettura di un processore basato su registri generali.

Linguaggi, compilatori e interpreti

Assembly. Motivazioni. Programmazione Assembly

Architettura hardware

Il linguaggio Assembly

La macchina programmata Instruction Set Architecture (1)

Modi di indirizzamento del processore MC68000 (parte prima)

Elementi di Informatica e Programmazione. # Memoria di massa. Problema: comprare un PC. Architettura del calcolatore. Architettura di Von Neumann

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

Richiami: v[i] e &v[i] Organizzazione della memoria. Organizzazione della memoria. Esercitazione di Calcolatori Elettronici Ing. Gian Luca Marcialis

Architettura degli Elaboratori Lez. 2 Le istruzioni della CPU. Prof. Andrea Sterbini

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

Architettura dei calcolatori e sistemi operativi. Set istruzioni e struttura del programma Direttive all Assemblatore.

Corso di Alfabetizzazione Informatica 2001/2002. La CPU. F. Tortorella Università degli Studi. di Cassino

CPU a singolo ciclo: l unità di controllo, istruzioni tipo J

Firmware Division & Floating pointer adder

Lezione 3 Assembly MIPS (2)

ARCHITETTURA DI UN ELABORATORE

Il Modello di von Neumann (2) Prevede 3 entità logiche:

Laboratorio di Architettura lezione 5. Massimo Marchiori W3C/MIT/UNIVE

Motivazioni. Assembly. Programmazione Assembly. Programmazione Assembly

Elaborazione dell informazione

Architettura di un calcolatore

Architettura dei calcolatori

Codifica binaria. Rappresentazioni medianti basi diverse

Transcript:

La programmazione dei calcolatori Architetture dei Calcolatori (Lettere A-I) Il Set di Istruzioni MIPS Prof. Francesco Lo Presti Linguaggio macchina (codifica con numeri binari) Linguaggio direttamente eseguibile dal calcolatore Attività di programmazione lunga e noiosa Facile commettere errori Linguaggio assembler (o assembly) Rappresentazione simbolica del linguaggio macchina Più comprensibile del linguaggio macchina (simboli anziché sequenze di bit) Tradotto dall assemblatore assemblatore in linguaggio macchina Dalla forma simbolica dell istruzione macchina al corrispondente formato binario Set Istruzioni 1 Linguaggi ad alto livello Tradotti dal compilatore in assembler Set Istruzioni 2 Benefici dei linguaggi ad alto livello Vantaggi e svantaggi dell assembler Notazione vicina al linguaggio corrente ed alla notazione algebrica (maggiore espressività e leggibilità) Incremento di produttività Facilitano la programmazione, svincolandola dalla conoscenza dei dettagli architetturali della macchina utilizzata Indipendenza dalle caratteristiche peculiari dell architettura (processore) su cui il programma va eseguito ( (portabilità) Ideati non per essere compresi direttamente da macchine reali, ma da macchine astratte, in grado di effettuare operazioni più di alto livello rispetto alle operazioni elementari dei processori reali Permettono l uso l di librerie di funzionalità già scritte (riusabilità del codice) Set Istruzioni 3 Vantaggio: la dipendenza dall architettura architettura del calcolatore permette Ottimizzazione delle prestazioni (maggiore efficienza) Programmi (potenzialmente) più compatti Massimo sfruttamento delle potenzialità dell hardware sottostante Importante per Programmare controller di processi e macchinari (anche real-time) Programmazione di apparati limitati (embedded( computer, dispositivi portatili, telefonini cellulari, ) Principali svantaggi della programmazione Strutture di controllo in forme limitate (minore espressività) Necessario conoscere i dettagli dell architettura Mancanza di portabilità su architetture diverse Difficoltà di comprensione, possibile lunghezza maggiore, facilità di errore rispetto a programmi scritti in linguaggio ad alto livello o (minore produttività del programmatore) Set Istruzioni 4

Architettura MIPS (RISC) Principi di Progettazione ISA MIPS Sviluppata e progettata a Stanford (USA) Progettata nei primi anni 80 Prodotta e sviluppata da MIPS Technologies negli anni 90 (http://www.mips.com) Tecnologia attualmente utilizzata da Sony (Playstation, Playstation 2, AIBO) Nintendo 64 Router CISCO Stampanti, macchine fotografiche digitali, palmtop Set-top top box, DVD TV al plasma Rappresenta un buon modello architetturale per la didattica, perché è un architettura semplice da comprendere Set Istruzioni 5 Simplicity favors regularity Istruzioni di dimensione fissa -bits Numero limitato di formati istruzioni Smaller is faster Set limitato di istruzioni Numero limitato di registri Numero limitato di modalita di indirizzamento Good design demands good compromises Tre formati istruzione Make the common case fast Le istruzioni logico/aritmetiche operano sui registri (architettura load-store) Uso di indirizzamento immediato Set Istruzioni 6 MIPS R3000 ISA I registri Categorie di Istruzioni Load/Store Computational Jump & Branch Floating Point Floating Point coprocessor Gestione della Memoria Speciali 3 formati istruzione da bit OP OP OP R0 - R31 PC HI LO rs rt rd sa funct rs rt immediate jump target Registri Formato R Formato I Formato J Set Istruzioni 7 Il livello ISA dell architettura MIPS richiede che Gli operandi delle istruzioni provengano dai registri Architettura di tipo load-store (o registro-registro registro) Il processore possiede un numero limitato di registri Il processore MIPS possiede registri di tipo general- purpose (GPR), ciascuno dei quali è composto da bit (parola) Il processore MIPS possiede ulteriori registri da bit per le operazioni in virgola mobile (floating( point), detti FPR Per denotare i registri si usano nomi simbolici (convenzionali) preceduti da $ $s0, $s1, per i registri che contengono variabili C $t0, $t1, per i registri di uso temporaneo I registri possono anche essere indicati direttamente mediante il loro numero (0,,, 31) preceduto da $ (quindi $0,,, $31) Set Istruzioni 8

Convenzione dei nomi per i registri Le costanti in MIPS 0 $zero constant 0 (Hdware) 1 $at reserved for assembler 2 $v0 expression evaluation & 3 $v1 function results 4 $a0 arguments 5 $a1 6 $a2 7 $a3 8 $t0 temporary: caller saves... (callee can clobber) 15 $t7 16 $s0 callee saves... (caller can clobber) 23 $s7 24 $t8 temporary (cont d) 25 $t9 26 $k0 reserved for OS kernel 27 $k1 28 $gp pointer to global area 29 $sp stack pointer 30 $fp frame pointer 31 $ra return address (Hdware) Programmi fanno anche uso di costanti (spesso piccole) ~50% operandi sono costanti e.g., A = A + 5; B = B + 1; C = C - 18; Soluzioni Hard-wired (come $zero) Permettere l uso di costanti nelle istruzioni MIPS addi $sp, $sp, 4 slti $t0, $t1, 10 andi $t0, $t0, 6 ori $t0, $t0, 4 Set Istruzioni 9 Set Istruzioni 10 Istruzioni aritmetiche Compilazione di istruzioni complesse Istruzione aritmetiche assembler MIPS add $t0, $s1, $s2 sub $t0, $s1, $s2 Una singola operazione Esattamente tre operandi destination source1 op source2 Tutti gli operandi sono registri del processore (register file) ($t0,$s1,$s2) Ordine degli operandi e e fisso Il primo operando e il registro destinazione h = (b - c) + d Assumendo che b sia memorizzato nel registro $s1,, c in $s2,, e d in $s3 e che il risultato sia insererito in $s0,, un modo di compilare l istruzione C su indicata e : sub $t0, $s1, $s2 add $s0, $t0, $s3 Set Istruzioni 11 Set Istruzioni 12

MIPS Register File Gli operandi delle istruzioni aritmetiche sono limitati al register file del processore (contenuto nel dapapath) Register File trentadue registri da -bit 5 Due porte in lettura Una porta in scrittura Registri + veloci della memoria principale src1 addr src2 addr dst addr write data 5 5 locations bits src1 data src2 data Arithmetic Logic Unit (ALU) L unità logico-aritmetica è la rete combinatoria che svolge le operazioni logico-aritmetiche somma, sottrazione AND, OR operazione shift.. Op1 due operandi Op2 ALU Risultato Set Istruzioni 13 Set Istruzioni 14 Registri e Memoria Istruzioni aritmetiche operano sui registri Vedremo poi il caso delle costanti Per eseguire operazioni, il compilatore DEVE associare registri alle variabili di un programma Indirizzamento a byte MIPS (come la maggior parte delle architetture) indirizza i singoli byte Gli indirizzi delle parole sono invece multipli di 4 (vincolo di allineamento) Processor Devices byte M-1 byte M-2 Control Datapath Memory Input Output Memoria Memoria Ma in genere i programmi hanno piu variabili che registri () Set Istruzioni 15 Byte 1 Byte 0 8 bit Parola 8 Parola 4 Parola 0 4 5 6 7 0 1 2 3 bits Set Istruzioni 16

Ordinamento dei byte Allineamento dei byte e terminologia Esistono due convenzioni per ordinare i byte all interno di una parola ( (endianess) Big Endian: : il byte il cui indirizzo è x 00 è nella posizione più significativa della parola (big end) Little Endian: : il byte il cui indirizzo è x 00 è nella posizione meno significativa della parola (little end) Esempio: parola di bit Indirizzo 7 6 5 4 4 4 5 6 7 Little Endian 3 2 1 0 0 0 1 2 3 Big Endian Byte Byte Word Word Intel 80x06 è Little Endian,, MIPS può essere sia Big Endian sia Little Endian in dipendenza del valore logico su di un pin Set Istruzioni 17 L allineamento richiede che la parola inizi ad un indirizzo multiplo lo della sua dimensione 0 1 2 3 In MIPS, allineamento della parola ad un indirizzo multiplo di 4 (equivale Allineato a indirizzo mod 4 = 0) Half word (16 bit) allineata ai multipli di 2 Non allineato La mancanza di allineamento causa un incremento della complessità dell hardware ed un numero maggiore di accessi in memoria Terminologia delle sequenze di bit di particolare lunghezza 4 bit: nibble 8 bit: byte 16 bit: half-word bit: word 64 bit: double-word Set Istruzioni 18 Istruzione di trasferimento dati MIPS fornisce due istruzioni di base per il trasferimento di dati tra registri del processore e memoria lw (load word): per trasferire una parola di memoria in un registro del processore sw (store word): per trasferire il contenuto di un registro del processore in una parola di memoria Le istruzioni lw e sw richiedono come argomento l indirizzo della locazione di memoria sulla quale devono operare Istruzioni load e store L istruzione di load trasferisce una copia dei dati contenuti in una specifica locazione di memoria ai registri del processore, lasciando inalterata la parola di memoria Il processore invia l indirizzo l 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 al processore L istruzione di store trasferisce il contenuto di un registro del processore in una specifica locazione di memoria, sovrascrivendo il contenuto precedente di quella locazione Il processore invia l indirizzo l della locazione desiderata alla memoria insieme ai dati che vi devono essere scritti, e richiede un operazione di scrittura La memoria effettua la scrittura dei dati all indirizzo specificato Set Istruzioni 19 Set Istruzioni 20

Istruzione lw In MIPS, l istruzione l 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 all offset Indirizzamento registro base (o con spiazzamento) L indirizzo della parola di memoria da caricare nel registro è ottenuto sommando il contenuto del registro base alla costante Esempio lw $s1, 100($s2) # $s1 = M[$s2+100] Al registro destinazione $s1 è assegnato il valore contenuto all indirizzo di memoria ($s2+100) Istruzione sw In MIPS, l istruzione l sw ha tre argomenti, analogamente all istruzione lw Il registro sorgente,, il cui contenuto deve essere scritto in memoria Una costante o spiazzamento ( (offset) Un registro base ( (base register) ) che contiene il valore dell indirizzo base ( (base address) ) da sommare all offset Indirizzamento registro base (o con spiazzamento) L indirizzo della parola di memoria da sovrascrivere è ottenuto sommando il contenuto del registro base alla costante Esempio sw $s1, 100($s2) # M[$s2+100] = $s1 Alla locazione di memoria di indirizzo ($s2+100) è assegnato il valore contenuto nel registro sorgente $s1 Set Istruzioni 21 Set Istruzioni 22 Interconnessione Processore-Memoria La memoria e vista come un array mono- dimensionale Le cui locazioni sono indicizzate dagli indirizzi di memoria Processor read addr/ write addr read data write data Memory 2 2 30 words locations Compilare con Load e Store Assumendo che b sia in $s2 e che l indirizzo base dell array A sia in $s3, quali sono le istruzioni assembler MIPS corrispondenti all istruzione C A[8] = A[2] - b... A[3] A[2] A[1] A[0]... $s3+12 $s3+8 $s3+4 $s3 lw $t0, 8($s3) sub $t0, $t0, $s2 sw $t0, ($s3) bits Set Istruzioni 23 Set Istruzioni 24

Compilare con un indice come variabile Assumendo che A sia un array di 50 elementi con indirizzo base in $s4,, e le variabili b, c, ed i siano in $s1, $s2,, e $s3, rispettivamente, quali sono le istruzioni assembler MIPS corrispondenti all istruzione C c = A[i] - b add $t1, $s3, $s3 #array index i is in $s3 add $t1, $t1, $t1 #temp reg $t1 holds 4*i add $t1, $t1, $s4 #addr of A[i] lw $t0, 0($t1) sub $s2, $t0, $s1 Register spilling In genere i programmi usano più variabili di quanti sono i registri del processore Il compilatore cerca di mantenere le variabili usate più frequentemente nei registri e le altre variabili in memoria, usando istruzioni di load/store per trasferire le variabili tra registri e memoria Il tempo di accesso ai registri è minore del tempo di accesso alla memoria La tecnica di mettere le variabili meno usate (o usate successivamente) in memoria viene detta register spilling Set Istruzioni 25 Set Istruzioni 26 Load e Store di byte Esempio MIPS fornisce istruzioni per load e store di byte utili per la manipolazioni di caratteri lb $t0, 1($s3) #load byte from memory sb $t0, 6($s3) #store byte to memory Quale byte viene trasferito? load byte legge un byte dalla memoria e lo copia negli 8 bit meno significativi del registro destinazione gli altri bit rimangono inalterata store byte copia il contenuto degli 8 bit meno significativi di un registro in un byte in memoria Set Istruzioni 27 Come si modifica il contenuto della memoria dopo l esecuzione del seguente frammento di codice? add lb sb Memoria 0x0 0 0 0 0 0 0 0 0x0 0 0 0 0 0 0 0 0x0 0 0 0 0 0 0 0 0x1 0 0 0 0 0 1 0 0x0 1 0 0 0 4 0 2 0xF F F F F F F F 0x0 0 9 0 1 2 A 0 Data $s3, $zero, $zero $t0, 1($s3) $t0, 6($s3) M[4] = 0xFFFF90FF 24 20 16 12 8 4 ed il contenuto di $t0? e nel caso di architettura Little Endian? 0 Indirizzi delle Parole (in decimale) $t0 = 0x00000090 M[4] = 0xFF12FFFF $t0 = 0x00000012 Set Istruzioni 28

Linguaggio Macchina Istruzioni Aritmetiche Campi Istruzione (tipo R) Le istruzioni,, come i registri e le parole di memoria sono di bit Esempio: add $t0, $s1, $s2 Corrispondenza registri $t0=$8, $s1=$17, $s2=$18 Formato Istruzioni: op rs rt rd shamt funct op rs rt rd op rs rt rd shamt funct 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits = bits opcode operazione da eseguire indirizzo primo registro operando indirizzo del secondo registro operando indirizzo del registro destinazione 000000 10001 10010 01000 00000 100000 Istruzioni di tipo R Operazioni logico aritmetiche fra registri Set Istruzioni 29 shamt funct scorrimento (per le istruzioni di shift) Codice funzione che specifica la variante dell operazione da eseguire Set Istruzioni 30 Linguaggio Macchina Formato I Linguaggio Macchina Istruzione Store Il formato di tipo R non è adatto a rappresentare istruzioni di tipo load/store All offset sarebbe riservato un campo di 5 bit (al massimo costanti di dimensione pari a ) Si introduce un nuovo tipo di formato istruzione Tipo I (immediatate( immediatate) ) per istruzioni di trasferimento dati Esempio: lw $t0, 24($s2) op rs rt 16 bit number 35 18 8 24 Esempio: sw $t0, 24($s2) op rs rt 16 bit number 43 18 8 24 101011 10010 01000 0000000000011000 Un indirizzo a 16-bit indica che l accesso e limitato a locazioni di memoria entro l intervallo di ±2 13 o 8,192 parole (±2( 15 o,768 bytes) dell indirizzo di base $s2 100011 10010 01000 0000000000011000 Set Istruzioni 31 Set Istruzioni

Review: MIPS R3000 ISA Organizzazione MIPS (fino( ad ora) Categorie di Istruzioni Load/Store Computational Jump & Branch Floating Point coprocessor Gestione della Memoria Speciali 3 formati istruzione da bit R0 - R31 PC HI LO 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits OP rs rt rd shamt funct OP rs rt 16 bit number OP 26 bit jump target Registers R format I format Set Istruzioni 33 Istruzioni aritmetiche da/verso il register file Istruzioni Load/store di word da/verso la memoria Processor Register File src1 addr 5 src2 addr 5 registers dst addr ($zero - $ra) 5 write data bits Exec Fetch Decode src1 data src2 data read/write addr read data write data Memory ALU 4 5 6 7 0 1 2 3 byte address (big Endian) bits 1 1100 2 30 words 0 1100 0 1000 0 0100 0 0000 Set Istruzioni word address 34 (binary) Istruzioni per operazioni logiche: shift Istruzioni per operazioni logiche Shift (traslazione) dei bit di una parola a destra o sinistra sll (shift left logical) srl (shift right logical) Esempio: assumiamo che il registro $s0 contenga il valore 13 sll $t2, $s0, 8 # $t2 = 13 2 8 = 38 Formato di tipo R: si utilizza il campo shamt (shift amount) op rs rt rd shamt funct 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit sll $t2, $s0, 8 0 0 16 10 8 0 Traslare a sinistra di i bit corrisponde a moltiplicare per 2 i Utile per moltiplicare per 4 l indice l i di un array Set Istruzioni 35 Istruzione and per effettuare l AND l bit a bit tra due registri Esempio and $t0, $t1, $t2 # $t0 = $t1 & $t2 Se $t2 = 0000 0000 0000 0000 0000 1101 0000 0000 e $t1 = 0000 0000 0000 0000 0011 1100 0000 0000 Allora, dopo l esecuzione l dell istruzione and $t0 = 0000 0000 0000 0000 0000 1100 0000 0000 Istruzione or per effettuare l OR l bit a bit tra due registri Esempio or $t0, $t1, $t2 # $t0 = $t1 $t2 Istruzione nor per effettuare il NOR bit a bit tra due registri Esempio nor $t0, $t1, $t2 # $t0 = ($t1 $t2) Le istruzioni and, or e nor seguono il formato di tipo R Set Istruzioni 36

Istruzioni di scelta e controllo del flusso Queste istruzioni Alterano l ordine l di esecuzione delle istruzioni La prossima istruzione da eseguire non è quella successiva all istruzione corrente Permettono di eseguire cicli e condizioni Ripetizione di sequenze di istruzioni in dipendenza dai risultati precedenti Due classi di istruzioni Istruzioni di conditional branch (salto condizionato) del tipo if condizione then esegui X X Permettono di selezionare la prossima istruzione da eseguire in dipendenza di un valore calcolato Istruzioni di jump (salto incondizionato) del tipo esegui X come prossima istruzione Il salto viene sempre eseguito Set Istruzioni 37 Le etichette nei programmi Le istruzioni di un programma assembler possono avere delle etichette ( (label) label lw $t0, 1000($s3) add $t0, $s2, $t0 sw $t0, 1000($s3) L1: add $s3, $s3, $t1 Le istruzioni di branch permettono di specificare l etichetta dell istruzione successiva a seconda del risultato di un test (di uguaglianza o disuguaglianza) Anche le istruzioni di jump permettono di specificare l etichetta l dell istruzione a cui saltare Set Istruzioni 38 Salto Condizionato Salto Condizionato: Codice Macchina Due Istruzioni per il salto condizionato: bne $s0, $s1, Label #go to Label if $s0 $s1 $s1 beq $s0, $s1, Label #go to Label if $s0=$s1 Esempio: if (i==j) h = i + j; bne $s0, $s1, Lab1 add $s3, $s0, $s1 Lab1:... Istruzioni: bne $s0, $s1, Label #go to Label if $s0 $s1 $s1 beq $s0, $s1, Label #go to Label if $s0=$s1 op rs rt 16 bit number I format 5 16 17???? 4 16 17???? Come si specifica l indirizzo di salto? Set Istruzioni 39 Set Istruzioni 40

Calcolo dell indirizzo di salto Salto Condizionato: Esempio Codice Macchina PC bne $s0,$s1,lab1 add $s3,$s0,$s1 Lab1:... Si usa il valore di un registro (come in lw e sw) ) al quale si aggiunge l offset a 16-bit Quale registro? Registro dell indirizzo istruzione PC=Program Counter PC viene aggiornato (PC<-PC+4) PC+4) durante il ciclo di prelievo Durante la fase di esecuzione is suo valore e pari all indirizzo della prossima istruzione Limita la distanza del salto a -2 15 to +2 15-1 istruzioni dall istruzione che segue il salto Problema?? No Principio di localita Set Istruzioni 41 Codice Assembler bne $s0, $s1, Lab1 add $s3, $s0, $s1 Lab1:... Codice macchina bne: op rs rt 16 bit offset I format 5 16 17 1 Set Istruzioni 42 e e la sua implementazione Organizzazione MIPS (fino( ad ora) Il contenuto aggiornato di PC (PC+4) viene sommato ai 16 bit meno Convertito in un Register 1 1100 meno significativi dell istruzione di salto File src1 addr src1 5 in un valore a bit data src2 addr read/write Concatenando 2 zeri a destra (x4) 5 registers addr dst addr ($zero - $ra) Estendendo il segno dei risultanti 18 bits 5 src2 write data 2 viene usato per aggiornare PC in caso di 30 data words read data from the low order 16 bits of the branch instruction br offset 16 Add PC Add write data offset 4 sign-extend 0 1100 Fetch 0 1000 00 4 5 6 7 ALU 0 0100 0 1 2 3 branch dst Exec Decode 0 0000 Add address bits word address PC Add (binary) byte address 4? (big Endian) Set Istruzioni 43 Set Istruzioni 44 Il risultato e viene salto Processor Memory

Salto incondizionato Salto incondizionato: Codice Macchina Istruzione jump j label #go to label Istruzione: j label #go to label Esempio: if (i!=j) h=i+j i+j; else h=i-j; beq $s0, $s1, Else add $s3, $s0, $s1 j Exit Else: sub $s3, $s0, $s1 Exit:... Codice Macchina: op 26-bit address 2???? J format Set Istruzioni 45 Set Istruzioni 46 Indirizzo di Salto ed implementazione Esercizi L indirizzo di destinazione (a bit) e e specificato come indirizzo assoluto ottenuto Concatenando i 4 bit piu significativi del valore corrente di PC (PC+4) ai 26 bit Concatenando 00 come i due bit meno significativi from the low order 26 bits of the jump instruction 26 00 4 PC Set Istruzioni 47 Assumendo che l indirizzo l base di A (B) sia in $s3 ($s4), e che la dimensione dell array A sia memorizzata in $s5, scrivere in assembler le due seguenti porzioni di codice C: 1. Sommare tutti gli elementi di un array A di 100 interi che siano in posizione pari Ovvero sum = A[0] + A[2] + + [A98] Codice C sum = 0; for (i=0; i<100; i+=2) sum = sum + A[i]; 2. Sommare tutti gli elementi di un array A di 10 interi e memorizzare il risultato nell elemento elemento i-esimo i dell array B Codice C B[i] = 0; for (j=0; j<10; j++) B[i] = B[i] + A[j]; Set Istruzioni 48

Istruzione slt Istruzione slt slt (set if less than): slt $t0, $s0, $s1 # if $s0 < $s1 # then # $t0 = 1 # else # $t0 = 0 Codice Macchina (formato R) op rs rt rd funct 0 16 17 8 0 42 = 0x2a Con slt, beq e bne si possono implementare tutti i test sui valori di due variabili (=,!=,<,<=,>,>=) Esempio Codice C if ( i < j) k = i + j; else k = i j; Codice MIPS i,j,k associate a $s0, $s1 e $s2 slt $t0, $s0, $s1 beq $t0, $zero, Else add $s2, $s0, $s1 j Exit Else: sub $s2, $s0, $s1 Exit: Set Istruzioni 49 Set Istruzioni 50 Compilazione Costrutto if Compilazione Costrutto if-else si assume che a sia memorizzato in $s0 e b in $s1 if ( a<b ) { istr. if } vero a<b falso if ( a<b ) { istr. if } else { istr. else } vero istr. if condizione falso istr. else if ( a b ) goto Exit; istr. if Exit:... istr. if slt $t0, $s0, $s1 # t0=0 iff $s0 $s1 $s1 beq $t0,$zero, Exit # codice MIPS per istr. if Exit:... Set Istruzioni 51 if ( a b ) goto Else; istr. if goto Exit Else:istr. else Exit:... slt $t0, $s0, $s1 # t0=0 iff $s0 $s1 $s1 beq $t0,$zero, Else # codice MIPS per istr. if j Exit Else:# codice MIPS per istr. else Exit:... Set Istruzioni 52

Compilazione Costrutto While Compilazione Costrutto While Do-While while ( a<b ) { istr. while } vero a<b falso do { istr. do while } while ( a<b); istr do while W_start: if(a b) goto Exit; istr. while goto W_start; Exit:... istr. while Do_start: istr. do while if(a b) goto Exit; goto Do_start; Exit:... vero a<b falso W_start: slt $t0, $s0, $s1 # t0=0 iff $s0 $s1 $s1 beq $t0, $zero, Exit # codice MIPS per istr. while j W_start Set Istruzioni Exit:... 53 Do_start: # codice MIPS per istr. do while slt $t0, $s0, $s1 # t0=0 iff $s0 $s1 $s1 beq $t0, $zero, Exit j Do_start Exit:... Set Istruzioni 54 Compilazione Costrutto for init Array: Calcolo Indirizzi for ( init ; a<b ; incr ) { vero falso istr. for a<b } istr. for init For_start: if(a b) goto Exit istr. for incr incr. goto For_start Exit:... # codice MIPS per init for_start: slt $t0, $s0, $s1 # t0=0 iff $s0 $s1 $s1 beq $t0, $zero, Exit # codice MIPS per istr. for # codice MIPS per incr j for_start Set Istruzioni Exit:... 55 Calcolo indirizzi in assembler: Indirizzo di A [n] = indirizzo di A [0] + (n* sizeof (elementi di A)) array di interi -> > sizeof(elementi di A)=4 # $s0 = A. # $t1 = n. sll $t2, $t1, 2 # $t2=$t1*4 # offset di A[n] rispetto a A[0] add $t2, $s0,, $t2 # $t2=&a[n]=a+offset sw $t3, 0($t2) # A[n] ] = $t3. lw $t3, 0($t2) # $t3 = A[n]. Set Istruzioni 56

Istruzione jr Compilazione Costrutto Switch Istruzione jr (jump register) jr $t1 #go to address in $t1 Codice Macchina (formato R): op rs funct 0 9 0 0 0 8 = 0x08 Set Istruzioni 57 switch (k) { case 0: h=i+j; break; /*k=0*/ case 1: h=i+h; break; /*k=1*/ case 2: h=i-j; break; /*k=2*/ } Jump Table contiene gli indirizzi delle etichette L0, L1 e L2 $t4 punta alla JT, k in $s2 $t4 Memory sll $t1, $s2, 2 #$t1 = 4*k add $t1, $t1, $t4 #$t1 = addr of JT[k] lw $t0, 0($t1) #$t0 = JT[k] jr $t0 #jump based on $t0 L0: add $s3, $s0, $s1 #k=0 so h=i+j j Exit L1: add $s3, $s0, $s3 #k=1 so h=i+h j Exit L2: sub $s3, $s0, $s1 #k=2 so h=i-j Exit:... Set Istruzioni 58 L2 L1 L0 Review: MIPS R3000 ISA Istruzioni con indirizzamento immediato Categorie di Istruzioni Load/Store Computational Jump & Branch Floating Point coprocessor Gestione della Memoria Speciali 3 formati istruzione da bit Registers R0 - R31 PC HI LO Esempi istr.. con indirizzamento immediato MIPS: addi $sp, $sp, 4 #$sp = $sp + 4 slti $t0, $s2, 15 #$t0 = 1 if $s2<15 Codice Macchina: op rs rt 16 bit immediate Formato I 8 29 29 4 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits OP rs rt rd shamt funct OP rs rt 16 bit number OP 26 bit jump target R format I format J format Set Istruzioni 59 10 18 8 15 La costante e all interno della stessa istruzioni! Formato I formato Immediato Limita i valori all intervallo +2 15 11 to -2 15 Set Istruzioni 60

Esercizi Costanti maggiori di 16 bit? Istruzione lui/ori Scrivere un programma in assembler MIPS che, dato l arrayl di interi A di 100 elementi, effettua la somma solamente degli elementi di A minori di 10 sum = 0; for (i=0; i<100; i++) if (A[i] < 10) sum = sum + A[i]; Scrivere un programma in assembler MIPS che, dato l arrayl di interi A di 100 elementi, effettua la somma solamente degli elementi di A minori di 10 e maggiori di 5 sum = 0; for (i=0; i<100; i++) if ((A[i] > 5) && (A[i] < 10)) sum = sum + A[i]; Si usa una soluzione in due passi 1. Prima si caricano i bit piu significativi con l istruzione lui "load upper immediate" lui $t0, 1010101010101010 i 16 bit meno significativi vengono messi a 0 16 0 8 1010101010101010 2. Poi si inseriscono i bit meno significativi,, i.e., ori $t0, $t0, 1010101010101010 1010101010101010 0000000000000000 0000000000000000 1010101010101010 Set Istruzioni 61 1010101010101010 1010101010101010 Set Istruzioni 62 Caricamento di costanti a bit Supponiamo di voler caricare il valore 4000000 10 nel registro $s0 In binario 0000 0000 0011 1101 0000 1001 0000 0000 Separiamo il valore in binario in 2 valori a 16 bit Il valore 61 10 per i 16 bit più significativi In binario 0000 0000 0011 1101 Il valore 2304 10 per i 16 bit meno significativi Pari a 0000 1001 0000 0000 lui $s0, 61 # 0000 0000 0011 1101 nei bit 31-16 di $s0 ori $s0, $s0, 2304 # 0000 1001 0000 0000 nei bit 15-0 di $s0 Salti ad Indirizzi Distanti bne e beq sono limitati ad una distanza compresa tra -2 15 to +2 15-1 istruzioni dall istruzione che segue il salto Il limite è superabile mediante l uso combinato di branch e del jump La sostituzione viene fatta direttamente dall assemblatore assemblatore beq $t0, $t1, L1 Indirizzo Distante bne $t0, $t1, L2 j L1 L2:... Set Istruzioni 63 Set Istruzioni 64

Salti ad Indirizzi Distanti Riepilogo Modalita di Indirizzamento MIPS I 4 bit più significativi del jump sono quelli del PC l indirizzo di salto è limitato all interno della pagina di 256MB in cui si trova il PC Il limite è superabile mediante l uso combinato di lui e del jr La sostituzione viene fatta direttamente dal linker j L1 assumiamo indirizzo L1= (L1H, L1L) lui $t0, L1H ori $t0, $t0, L1L Indirizzo Distante jr $t0 Set Istruzioni 65 1. A registro l operando e il contenuto di un registro 2. Con registro base (a spiazzamento) l operando e in una locazione di memoria data sommando al contenuto di un registro (base) una costante di 16- bit contenuta nell istruzione 3. Immediato l operando e una costante a 16 bit contenuta nell istruzione 4. Relativo al PC L operando (istruzione)) e e dato dalla sommma di PC con una costante a 16-bit contenuta nell istruzione 5. Pseudo-diretto diretto L operando (istruzione)) e e una costante a 26-bit contenuta nell istruzione a cui vengono prefissi i 4 bit piu significativi di PC Set Istruzioni 66 Riepilogo Modalita di Indirizzamento MIPS Pseudoistruzioni 1. Register addressing op rs rt rd funct Register 2. Base addressing op rs rt offset base register 3. Immediate addressing op rs rt operand 4. PC-relative addressing op rs rt offset Program Counter (PC) 5. Pseudo-direct addressing op jump address Program Counter (PC) word operand Memory word or byte operand Memory branch destination instruction Memory jump destination instruction Set Istruzioni 67 Il linguaggio assembler rappresenta una interfaccia verso il software di livello più alto Per semplificare la programmazione, è possibile che siano aggiunte un insieme di pseudoistruzioni Le pseudoistruzioni sono un modo compatto ed intuitivo per specificare un insieme di istruzioni (come delle macro) Non hanno una corrispondenza uno-a-uno con le istruzioni presenti nel linguaggio macchina Non sono implementate in hardware Ma sono abbastanza semplici da tradurre in linguaggio macchina e rappresentano un aiuto per il programmatore, in quanto arricchiscono il set di istruzioni assembler La traduzione della pseudoistruzione nelle istruzioni equivalenti è attuata automaticamente dall assemblatore assemblatore Set Istruzioni 68

Le pseudoistruzioni MIPS La pseudoistruzione move permette di copiare il valore di un registro in un altro registro move $t0, $t1 Il registro $t0 prende il valore del registro $t1 Come viene tradotta move in istruzioni MIPS? move $t0, $t1 add $t0, $zero, $t1 Si possono caricare costanti a bit in un registro tramite la pseudoistruzione li (load immediate) Vengono tradotte usando le istruzioni lui e ori E possibile specificare anche costanti in base esadecimale Set Istruzioni 69 Le pseudoistruzioni MIPS (2) Le istruzioni di branch con slt possono essere complesse L assembler MIPS mette a disposizione alcune pseudoistruzioni di branch che vengono aggiunte a beq e bne Serve un registro riservato per l assemblatore l ($at) Esempio: la pseudoistruzione blt (branch-on-less-than) viene implementata con slt e bne slt $at, $t0, $t1 blt $t0, $t1, 1000 bne $at, $zero, 1000 Esistono anche bgt (branch-on-greater-than), bge (branch-on-greater-than-or-equal) ble (branch-on-less-than-or-equal) Per esercizio, determinare come sono implementate in MIPS Set Istruzioni 70 Valori con segno e senza Overflow nel MIPS Istruzioni di caricamento del byte lb e lbu (load byte unsigned) lb: : tratta il byte come un numero con segno Effettua l estensione l del segno sulla parola lbu: : non effettua l estensione l del segno (numero senza segno) Per il caricamento dei byte si utilizza lbu Istruzioni di confronto slt e sltu (set on less than unsigned) Esempio Condizioni di overflow per somma e sottrazione Operazione Nel processore MIPS le istruzioni add, addi,, sub causano eccezione nel caso di overflow Eccezione: chiamata non prevista di una procedura appropriata per r la gestione dell eccezione eccezione Registro EPC (Exception( Program Counter) ) contenente l indirizzo l dell istruzione che ha causato l overflowl Istruzione mfc0 (move( from system control) per copiare EPC in un registro generale Le istruzioni addu, addiu e subu (u per numeri unsigned) non $s0 contiene 1111 1111 1111 1111 1111 1111 1111 1111 causano eccezione in caso di overflow $s1 contiene 0000 0000 0000 0000 0000 0000 0000 0001 Utili per manipolare indirizzi di memoria slt $t0, $s0, $s1 # $t0 = 1 Gli indirizzi di memoria sono solo positivi (sfruttano tutti e 3 2 i bit) sltu $t1, $s0, $s1 # $t1 = 0 Set Istruzioni 71 Set Istruzioni 72 A+B A+B A-B A-B A 0 <0 0 <0 B 0 <0 <0 0 Risultato <0 0 <0 0

Istruzioni per moltiplicazione e divisione Istruzione di moltiplicazione Problema per la moltiplicazione Il risultato della moltiplicazione tra due interi a bit richiede 64 bit Non ci sono registri a 64 bit nel processore MIPS Problema per la divisione Come risultato della divisione interessa conoscere sia il quoziente che il resto Per il risultato occorrono due registri Soluzione nel processore MIPS Due registri a bit dedicati per le operazioni di moltiplicazione e divisione: registri Hi e Lo Set Istruzioni 73 Per prodotto tra interi con segno mult rs, rt: : moltiplica il registro rs (moltiplicando) per il registro rt (moltiplicatore) Mette nel registro Hi i bit più significativi del prodotto e nel registro Lo i bit meno significativi Segue il formato R (registro destinazione e shamt nulli) Esempio: mult $t0, $t1 Hi Se $t0 = 10 10 e $t1 = 6 10 allora 0 Lo 60 Per prodotto tra interi senza segno (unsigned( unsigned) multu rs, rt Entrambe le istruzioni MIPS di moltiplicazione ignorano l overflow: l è un compito lasciato al software (programmatore) Set Istruzioni 74 Istruzione di divisione Segno del quoziente e resto Per divisione tra interi con segno div rs, rt: : divide il registro rs (dividendo) per il registro rt (divisore) Mette nel registro Hi i bit del resto e nel registro Lo i bit del quoziente Segue il formato R (registro destinazione e shamt nulli) Esempio: div $t0, $t1 Hi Se $t0 = 10 10 e $t1 = 6 10 allora 4 Lo 1 Per divisione tra interi senza segno (unsigned( unsigned) divu rs, rt Entrambe le istruzioni MIPS di divisione ignorano l overflow; ulteriore problema dato dalla divisione per 0 Set Istruzioni 75 Dividendo = quoziente divisore + resto, ovvero x = y (x y div y) + (x mod y) Esempio: x=5 e y=3 x div y = 1, x mod y = 2 Esempio: x=-5 5 e y=3 x div y = -1, x mod y = -5-3(-1) = -2 In alternativa, anche x div y = -2, x mod y = 1 ma sarebbe -(x y) (-x) y! Quindi: segno del resto uguale al segno del dividendo Non c èc accordo tra i linguaggi di programmazione ad alto livello (es. x=-5 5 e y=3) C: divisione e modulo indefiniti Fortran: come esempio MIPS: come esempio Set Istruzioni 76

Utilizzo dei registro Hi e Lo Istruzioni mflo/mfhi mfhi: : copiano il contenuto dei registri Lo/Hi in un registro indicato mflo $s1: : il contenuto del registro Lo è copiato in $s1 mfhi $s0: : il contenuto del registro Hi è copiato in $s0 Esempio: div $s2, $s3 mflo $s1 # quoziente in $s1 mfhi $s0 # resto in $s0 Entrambe le istruzioni mflo e mfhi seguono il formato R primo operando nullo secondo operando nullo shamt nullo Set Istruzioni 77