Assembler MIPS 32 Assembly I

Documenti analoghi
Assembler MIPS R2000/R3000 Assembly I

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

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

MIPS! !

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

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

Un altro tipo di indirizzamento. L insieme delle istruzioni (3) Istruz. di somma e scelta con operando (2) Istruzioni di somma e scelta con operando

Istruzioni di trasferimento dati

Architettura degli Elaboratori

Il linguaggio macchina

Assembler MIPS R2000/3000

Il linguaggio macchina

Università degli Studi di Cassino

Linguaggio assembler e linguaggio macchina (caso di studio: processore MIPS)

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

Istruzioni assembler Istruzione N Registri

Le costanti Le modalità di indirizzamento L assembly del MIPS

Linguaggio macchina. Architettura degli Elaboratori e delle Reti. Il linguaggio macchina. Lezione 16. Proff. A. Borghese, F.

L ambiente di simulazione SPIM

L ambiente di simulazione SPIM

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

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento

Il linguaggio Assembly del MIPS

ISA (Instruction Set Architecture) della CPU MIPS

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

Il linguaggio assembly

Calcolatori Elettronici A a.a. 2008/2009

Linguaggio Assembly e linguaggio macchina

Architetture dei Calcolatori (Lettere. Installazione di SPIM. Interfaccia Grafica

MIPS Instruction Set 1

Università degli Studi di Cassino

System Calls, Register Spilling

Corso di Calcolatori Elettronici

Linguaggio Assembly e linguaggio macchina

Linguaggio Assembly e linguaggio macchina

Il simulatore SPIM SPIM

Richiami sull architettura del processore MIPS a 32 bit

21 March : ESERCITAZIONE 01 GESTIONE DELLA MEMORIA VETTORI CONTROLLOO O DI FLUSSO DI UN PROGRAMMA. I. Frosio

Laboratorio di Architettura degli Elaboratori

Il Linguaggio Assembly: Gestione della memoria e controllo

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

Linguaggio Assembler MIPS

Richiami sull architettura del processore MIPS a 32 bit

Linguaggio Assembler MIPS

Assembler di Spim. Assembler di SPIM. Struttura di un programma assembler. Direttive

MIPS Instruction Set 1

5 April LABORATORIO 03 CONTROLLO DEL FLUSSO DI UN PROGRAMMA JUMP ADDRESS TABLE. I. Frosio

Assembly (3): le procedure

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

Assembly. Motivazioni. Programmazione Assembly

ISA e linguaggio macchina

Università degli Studi di Roma La Sapienza

Assembly III SPIM: un ambiente di simulazione MIPS

L'architettura del processore MIPS

Motivazioni. Assembly. Programmazione Assembly. Programmazione Assembly

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

Architetture dei Calcolatori

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Assembly. Linguaggio di programmazione corrispondente al linguaggio macchina P.H. Cap. 2.1, 2.2 e App. A. Linguaggio assembly (App.

7 May INTERRUPT ED ECCEZIONI I. Frosio

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

Università degli Studi di Cassino e del Lazio Meridionale

Calcolatori Elettronici

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

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

Esame di Architetture Canale AL Prof. Sterbini 8/7/13 Compito A

Il linguaggio Assembly

Calcolatori Elettronici

LA FAMIGLIA DI PROCESSORI MIPS

Linguaggi e moduli. Dott. Franco Liberati

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

L unità di controllo di CPU a singolo ciclo

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

Lezione 2 Assembly MIPS (2)

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

Le procedure. L insieme delle istruzioni (4) Prima della chiamata di una procedura. Le procedure (2) Architetture dei Calcolatori (lettere A-I)

Lecture 2: Prime Istruzioni

Assembly MIPS: gestione degli array strutture di controllo. A. Borghese, F. Pedersini Dipartimento di Informatica Università degli Studi di Milano

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

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

Strutture di controllo del flusso di esecuzione in assembler. MC68000: Status Register

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

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

Istruzioni MIPS per floating point

Il processore: unità di controllo

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

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

Appunti per il corso di Laboratorio di informatica: Architetture

Laboratorio di Architettura lezione 11. La scorsa lezione. Motivi? Word e bytes

ESERCIZIO 1 Si consideri la seguente funzione f (A, B, C, D) non completamente specificata definita attraverso il suo ON-SET e DC-SET:

Introduzione al MIPS64

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Architettura degli Elaboratori B Introduzione al corso

Progettazione dell unità di elaborazioni dati e prestazioni. Il processore: unità di elaborazione. I passi per progettare un processore

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

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

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

Introduzione al C++ (continua)

Lezione 17: Indirizzamento della memoria LC-3

Transcript:

TITLE Assembler MIPS 32 Assembly I Riccardo Solmi 1 Indice degli argomenti Le istruzioni assembly MIPS Categorie di istruzioni assembly Istruzioni di caricamento e salvataggio Gestione del segno Ordine dei bytes (endianness) Modi di indirizzamento Istruzioni aritmetiche, logiche e di scorrimento Istruzioni di confronto e salto condizionato Istruzioni di salto non condizionato 2 1

Categorie di istruzioni assembly Le istruzioni del linguaggio assembly MIPS possono essere divise nelle seguenti categorie: Istruzioni Load and Store Queste istruzioni spostano dati tra la memoria e i registri generali del processore Istruzioni Load Immediate Queste istruzioni caricano nei registri valori costanti Istruzioni Data Movement Queste istruzioni spostano dati tra i registri del processore Istruzioni aritmetico/logiche Queste istruzioni effettuano operazioni aritmetico, logiche o di scorrimento sui registri del processore 3 Categorie di istruzioni assembly Istruzioni di salto condizionato Queste istruzioni permettono di spostare l esecuzione da un punto ad un altro di un programma in presenza di certe condizioni Istruzioni di salto non condizionato Queste istruzioni permettono di spostare l esecuzione da un punto ad un altro di un programma NOTA: Nel seguito, le pseudoistruzioni sono evidenziate in blu e sottolineate 4 2

Architettura load and store L'architettura MIPS è di tipo Load-and-Store La maggioranza delle istruzioni MIPS operano tramite i registri interni al processore Esempio: add $t0, $t1, $t2 Somma $t1+$t2 e mette il risultato in $t0 Per questo motivo LOAD: i dati da elaborare devono essere prelevati dalla memoria STORE: i risultati devono essere salvati in memoria 5 Istruzioni load and store lb rdest, address lbu rdest, address lh rdest, address lhu rdest, address lw rdest, address la rdest, address Load Byte at address in register rdest Load Byte Unsigned at address in register rdest Load Halfword at address in register rdest Load Halfword Unsigned at address in register rdest Load Word from address in register rdest Load computed Address in register rdest sb rsource, address sh rsource, address sw rsource, address Store lower Byte at address from register rsource Store lower Halfword at address from register rsource Store Word at address from register rsource 6 3

Esempio istruzioni load and store Esempio:.text lw $t1, operanda lw $t2, operandb add $t0, $t1, $t2 sw $t0, result.data operanda:.word 5 operandb:.word 7 result:.word 0 # Inizia il codice # Load operanda # Load operandb # operanda + operandb # Store result # Iniziano i dati 7 Istruzioni load con e senza segno (bytes) LB $t0, address Carica il byte indirizzato da address nel byte meno significativo del registro Il bit di segno viene esteso LBU $t0, address Memoria Registro $t0 address - - - - Carica il byte indirizzato da address nel byte meno significativo del registro Gli altri tre byte vengono posti a zero address Memoria Registro $t0 0 0 0 8 4

Istruzioni load con e senza segno (halfword) LH $t0, address Carica i 2 byte indirizzati da address nei 2 byte meno significativi del registro Il bit di segno viene esteso LHU $t0, address Carica i 2 byte indirizzati da address nei 2 byte meno significativi del registro Gli altri due byte vengono posti a zero Memoria address Memoria address Registro $t0 - - - Registro $t0 0 0 9 Endianness Definizione di endianness Come viene rappresentata una word (32 bit) in 4 byte di memoria? Esistono due schemi: Little Endian: memorizza prima la "little end" (ovvero i bit meno significativi) della word Big Endian: memorizza la "big end" (ovvero i bit più significativi) della word Terminologia ripresa dai Viaggi di Gulliver di Jonathan Swift, in cui due fazioni sono in lotta per decidere se le uova sode devono essere aperte a partire dalla "little end" o dal "big end" dell'uovo 10 5

Endianness Esempio Little endian Cosa succede se faccio uno lh $t0, address? $t0 = 0x00003412 Big endian Cosa succede se eseguo un'istruzione lh $t0, address? $t0 = 0x00001234 address address Memoria 12 34 56 78 Memoria 12 34 56 78 Registro $t0 00 00 34 12 Registro $t0 00 00 12 34 11 Endianness Nota: I processori x86 sono little-endian MIPS può essere little endian o big endian L'endianness di SPIM dipende dal sistema in cui viene eseguito, quindi in generale è little endian Quando bisogna affrontare i problemi di endianness? Quando si "mischiano" operazioni su 8, 16 e 32 bit. Quando invece si utilizzano operazioni uniformi, non vi sono problemi di sorta 12 6

Load word vs load address Importante differenza: L'istruzione lw $t0, address carica il contenuto della word indirizzata dall'etichetta address in memoria L'istruzione la $t0, address carica l'indirizzo della word indirizzata dall'etichetta address in memoria lw $t0, address la $t0, address address 0x00400030 0x00400031 0x00400032 0x00400033 01 00 00 00 Registro $t0 00 00 00 01 address 0x00400030 0x00400031 0x00400032 0x00400033 01 00 00 00 Registro $t0 00 40 00 30 13 Load address vs load word Quando utilizzare load address? Quando vogliamo caricare in un registro l'indirizzo di una particolare zona di memoria Questo registro può essere utilizzato in seguito come indice per leggere il contenuto di byte consecutivi in memoria Esempio: la $t0, spese # Carica l'indirizzo di spese loop: lw $t1, ($t0) # Carica in $t1 il contenuto della word # indirizzata da $t0 add $t2, $t2, $t1 # Fai la sommatoria addi $t0, $t0, 4 # Incrementa $t0 di 4 byte (1 word) bnez $t1, loop # Continua finché non trova 0 14 7

Modi di indirizzamento Cos'è un modo di indirizzamento? Un modo per esprimere un indirizzo di memoria NB: alla fine il risultato è sempre un indirizzo di memoria dove andrò a leggere (load) o scrivere (store) un dato. Nel linguaggio macchina MIPS, esiste un solo modo di indirizzamento imm(register) dove l indirizzo è dato dalla somma del valore immediato imm più il contenuto del registro register Esempio: lw $t0, 4($sp) (legge una word dall indirizzo $sp + 4) L assembler fornisce per comodità più modi di indirizzamento Un indirizzo si può esprimere come somma di: una identificatore + una espressione + un registro. Esempio: lw $t1, array + 0x100($t0) (legge una word dall indirizzo 0x10010104 assumendo: array = 0x10010000 e $t0 = 4) Ogni parte: identificatore, espressione e registro è opzionale e per ragioni storiche ogni combinazione ha il proprio nome (vedi lucidi seguenti) In alcuni casi, l'assemblatore può generare più istruzioni 15 Modi di indirizzamento (base register) Specifica un indirizzo tramite registro base, assumendo un offset 0. L'indirizzo è dato dal contenuto del base register Esempio: lw $t0,($a0) expression Specifica un indirizzo assoluto con una espressione fatta solo di somme e sottrazioni di costanti espresse in decimale o esadecimale. L'indirizzo è dato dal risultato dell'espressione (costante). Esempio: lw $t0, 0x00400000+4 I numeri negativi vanno comunque preceduti anche dal simbolo +. Esempio: lw $t0, 0x100100c + -4 16 8

Modi di indirizzamento expression(base register) Specifica un indirizzo tramite registro base e un'offset tramite un'espressione. L'indirizzo è dato dal contenuto del base register + il risultato dell'espressione Esempio: lw $t0, 4($sp) Relocatable-symbol Specifica un indirizzo (rilocabile) tramite un identificatore. L'assemblatore genera le istruzioni necessarie per gestire l'identificatore e aggiunge al modulo oggetto generato le informazioni di rilocazione. Esempio: lw $t0, operanda 17 Modi di indirizzamento Relocatable-symbol(index register) Specifica un indirizzo base tramite un identificatore, mentre l'offset viene specificato tramite un registro indice L'indirizzo è dato dalla somma dell'indirizzo associato all'identificatore con il contenuto del registro indice. Esempio: lw $t0, array($t1) Relocatable-symbol + expression Specifica un indirizzo base tramite un identificatore, mentre l'offset viene specificato tramite un'espressione L'indirizzo è dato dalla somma dell'indirizzo associato all'identificatore con il risultato dell'espressione Esempio: lw $t0, array + 4 18 9

Modi di indirizzamento Relocatable-symbol + expression(index register) Specifica un indirizzo base tramite un identificatore, mentre l'offset viene specificato tramite un registro indice e un'espressione L'indirizzo è dato dalla somma dell'indirizzo associato all'identificatore con il contenuto del registro indice e il risultato dell'espressione. Esempio: lw $t0, array + 4($t1) 19 Istruzioni Data Movement and Load Immediate move rdest, rsource Move register rsource into register rdest li rdest, imm Move the immediate imm into register rdest 20 10

Istruzioni Aritmetiche: add, sub, neg, abs add rd, rs, rt addu rd, rs, rt addi rd, rs, imm addiu rd, rs, imm sub rd, rs, rt subu rd, rs, rt neg rd, rs negu rd, rs abs rd, rs rd = rs + rt (with overflow) rd = rs + rt (without overflow) rd = rs + imm (with overflow) rd = rs + imm (without overflow) rd = rs - rt (with overflow) rd = rs - rt (without overflow) rd = - rs (with overflow) rd = - rs (without overflow) rd = rs 21 Istruzioni Aritmetiche: mul, div, rem mul rd, rs, rt mulo rd, rs, rt mulou rd, rs, rt rd = rs * rt (without overflow) rd = rs * rt (with overflow) rd = rs * rt (with overflow, unsigned) div rd, rs, rt divu rd, rs, rt rem rd, rs, rt remu rd, rs, rt rd = rs / rt (signed with overflow) rd = rs / rt (unsigned) rd = resto di rs / rt (signed) rd = resto di rs / rt (unsigned) 22 11

Istruzioni Logiche: and, or, xor, not and rd, rs, rt andi rd, rs, imm or rd, rs, rt ori rd, rs, imm xor rd, rs, rt xori rd, rs, imm not rd, rs rd = rs AND rt rd = rs AND imm rd = rs OR rt rd = rs OR imm rd = rs XOR rt rd = rs XOR imm rd = NOT rs NB. XOR è un OR esclusivo. 1 XOR 1 = 0 mentre 1 OR 1 = 1. 23 Istruzioni di scorrimento sll rd, rs, rt srl rd, rs, rt sra rd, rs, rt rol rd, rs, rt ror rd, rs, rt rd = rs shifted left rt mod 32 bits rd = rs shifted right rt mod 32 bits rd = rs shifted right rt mod 32 bits (signed) rd = rs rotated left rt mod 32 bits rd = rs rotated right rt mod 32 bits Note: rt può anche essere una costante es. sll $t1, $t2, 4 Shift perde dei bits da una parte e dall altra inserisce degli zero Rotate inserisce da una parte i bit che escono dall altra Left[right] sposta i bit verso quelli più[meno] significativi 24 12

Istruzioni immediate Versioni immediate (i) Le versioni immediate (i) delle istruzioni precedenti utilizzano un valore costante (risultato di un'espressione) al posto di uno degli operandi Non sempre è necessario specificare la i; l'assemblatore è in grado di riconoscere anche istruzioni come add $t0, $t0, 1 25 Istruzioni di salto condizionato beqz rs, target Branch to instruction at target if rs = 0 bnez rs, target Branch to instruction at target if rs 0 bgez rs, target Branch to instruction at target if rs 0 bgtz rs, target Branch to instruction at target if rs > 0 blez rs, target Branch to instruction at target if rs 0 bltz rs, target Branch to instruction at target if rs < 0 NB. b sta per branch; z sta per zero; eq = ugual; ne = not equal; ge = greater or equal; gt = greater than; le = less or equal; lt = less that 26 13

Istruzioni di salto condizionato beq rs, rt, target bne rs, rt, target bge rs, rt, target bgeu rs, rt, target bgt rs, rt, target bgtu rs, rt, target ble rs, rt, target bleu rs, rt, target blt rs, rt, target bltu rs, rt, target Branch to instruction at target if rs = rt Branch to instruction at target if rs rt Branch to instruction at target if rs rt Branch to instruction at target if rs rt (unsigned) Branch to instruction at target if rs > rt Branch to instruction at target if rs > rt (unsigned) Branch to instruction at target if rs rt Branch to instruction at target if rs rt (unsigned) Branch to instruction at target if rs < rt Branch to instruction at target if rs < rt (unsigned) 27 Branch: dettagli implementativi Nel linguaggio macchina, l indirizzo dell istruzione target in un branch viene espresso come instruction offset rispetto all istruzione corrente E possibile saltare 2 15-1 istruzioni in avanti o 2 15 istruzioni indietro In linguaggio assembly, l indirizzo dell istruzione target è dato dall etichetta associata Il calcolo viene fatto automaticamente dall assembler Ulteriore semplificazione dell assembler rispetto al linguaggio macchina Esempio: 0x00400030 beq $5, $4, 8 [stor-0x00400030] beq $a1, $a0, stor 28 14

Istruzioni di salto non condizionato j target jal target jr rsource Unconditionally jump to instruction at target Unconditionally jump to instruction at target, and save the address of the next instruction in register $ra Unconditionally jump to the instruction whose address is in register rsource jalr rsource, rdest Unconditionally jump to the instruction whose address is in register rsource and save the address of the next instruction in register rdest 29 Indice degli argomenti Programmazione assembly Realizzazione delle principali strutture di controllo sequenze scelte ripetizioni Scrittura di semplici programmi assembly: operazioni su stringhe input e output su console 30 15

Sequenze di istruzioni Le istruzioni formano sempre una sequenza che corrisponde all ordine in cui vengono eseguite Il microprocessore non ha una visione di insieme del programma: vede solo l istruzione che deve eseguire e il contenuto dei registri. Esegue una istruzione alla volta nell ordine scritto in memoria Fanno eccezione le istruzioni di salto che fanno proseguire l esecuzione all indirizzo specificato. L istruzione che viene eseguita dopo un salto è quella che si trova all indirizzo specificato come destinazione del salto. Se il salto è condizionato e la condizione è falsa si prosegue normalmente con l istruzione successiva. 31 Sequenze di istruzioni e salti L intero programma è una sequenza lw $t0,x di istruzioni; con i salti posso lw $t1,y controllare l ordine di esecuzione j j1 Il codice seguente è equivalente a j2:neg $t2,$t2 quello sulla destra lw $t0,x add $t3,$t3,$t2 lw $t1,y j j3 add $t2,$t0,$t1 j1:add $t2,$t0,$t1 mul $t3,$t0,$t1 mul $t3,$t0,$t1 neg $t2,$t2 add $t3,$t3,$t2 j j2 sw $t0,x j3:sw $t0,x sw $t1,y sw $t1,y 32 16

Saltare per scegliere: if Voglio eseguire del codice solo se una condizione (espressione) è vera 1. Codice per valutare l espressione e mettere il risultato in un registro (o due) 2. Salto condizionato per saltare il codice opzionale se la condizione è falsa 3. Codice opzionale da eseguire solo quando la condizione è vera Esempio in assembly: (ifelse.s) Se x > 0 allora y = x*2 (altrimenti y resta invariato cioè uguale a 0).text.globl main main: lw $t0,x # Carica x blez $t0,endif # Salto se condizione falsa mul $t1,$t0,2 # codice opzionale: $t1 = x*2; sw $t1,y # Salva $t1 nella variabile y endif: # Fine if.data x:.word 5 # provare con 5 e -5 y:.word 0 # y = x*2 se x>0 altrimenti y = 0 33 Saltare per scegliere: if else Voglio eseguire del codice diverso se una condizione (espressione) è vera oppure falsa 1. Codice per valutare l espressione e mettere il risultato in un registro (o due) 2. Salto condizionato per saltare il ramo then se la condizione è falsa 3. Codice da eseguire solo quando la condizione è vera (ramo then) 4. Salto per evitare di eseguire anche il ramo else 5. Codice da eseguire solo quando la condizione è falsa (ramo else) NB. Posso scambiare i due rami (punti 3 e 5) se salto quando la condizione è vera Esempio in assembly: (ifelse.s) Se x > 0 allora y = x*2 altrimenti y = -x lw $t0, x # Carica x blez $t0, else # Salto se la condizione è falsa mul $t1,$t0,2 # Ramo then: $t1 = x*2; j end # Salta fine else:neg $t1, $t0 # Ramo else: $t1 = -x; end: sw $t1, y # Scrive $t1 in y 34 17

Saltare per scegliere: if annidati Le scelte possono essere annidate a piacere Si dice condizione annidata una che si trova nel ramo then o nel ramo else di una scelta contenitore Una condizione annidata nel ramo then è del tipo: se condizione1 è vera allora: se condizione2 è vera esegui solo codice1 altrimenti esegui solo codice2; (ramo then) altrimenti (condizione1 falsa) esegui solo codice3 Una condizione annidata nel ramo else è del tipo: se condizione1 è vera esegui solo codice1 altrimenti se condizione2 è vera esegui solo codice2 altrimenti esegui solo codice3 (ramo else) Posso annidare le condizioni fino alla profondità che mi serve su ogni ramo. (il codice naturalmente diventa sempre più complesso) Per farlo in assembly mi basta applicare ricorsivamente i due schemi di soluzione già visti nei due lucidi precedenti 35 Esempio su if annidati Esempio in assembly: (ifelse.s) Se x > 0 allora (ramo then 1 che contiene scelta annidata) se y >= 0 allora y = x*2 (ramo then 2) altrimenti y = -x (ramo else 2) altrimenti incrementa y (ramo else 1) lw $t0,x # Carica x lw $t1,y # Carica y blez $t0,else1 # Salta se la cond1 è falsa bltz $t1,else2 # Salta se la cond2 è falsa mul $t1,$t0,2 # Ramo then2: $t1 = x*2 j end # Salta fine else2:neg $t1,$t0 # Ramo else2: $t1 = -x j end # Salta fine else1:addi $t1,$t1,1 # Ramo else1: $t1 = y + 1 end: sw $t1, y # Scrive $t1 in y 36 18

Saltare per scegliere: switch Caso particolare del precedente: le condizioni davanti ad ogni ramo testano valori diversi di una stessa variabile Posso usare degli if annidati come sopra oppure mi faccio una tabella con i riferimenti a tutti i codici dei rami e uso la variabile come indice per caricare dalla tabella l indirizzo del codice dove saltare. Il miglioramento che si ottiene è che viene fatto un solo test anziché uno per ogni ramo, riducendo la complessità da lineare a costante. Esempio in assembly: (switch.s) se op = 0 allora y = x*3 se op = 1 allora y = x+5 se op = 2 allora y = -x altrimenti y = x 37 Esempio su switch Esempio in assembly: (switch.s) lw $t1,x lw $t0,op bge $t0,3,default # Salta a default se op >= 3 sll $t0,$t0,2 # $t0 = op*4 lw $t0,stable($t0) # $t0 = (stable+op*4) jr $t0 # Salta al case corrispondente a op case0:mul $t2,$t1,3 # $t2 = x*3 j end case1:addi $t2,$t1,5 # $t2 = x+5 j end case2:div $t2,$t1,2 # $t2 = x/2 j end default: move $t2,$t1 # $t2 = x end:sw $t2,y # Scrive $t2 in y.data # oltre a op, x e y stable:.word case0,case1,case2 38 19

Saltare per ripetere: while Voglio eseguire più volte del codice finché una espressione è vera. Non so se l espressione è vera all inizio (quindi la controllo prima di eseguire il codice) 1. Codice per valutare l espressione e mettere il risultato in un registro (o due) 2. Salto condizionato per saltare il codice da ripetere se la condizione è falsa 3. Codice da ripetere finché la condizione è vera 4. Salto al punto 1 in modo da poter eseguire il codice un altra volta oppure Salto condizionato al punto 3 per eseguire un altra volta se la condizione è vera Esempio in assembly: (loops.s) Finché x > 0 lo sommo a y (y = y + x) e lo decremento (x = x 1) lw $t0,x # Carica x lw $t1,y # Carica y blez $t0,end # Salta se condizione è falsa while: # (Inizio ciclo) add $t1,$t1,$t0 # Effettua sommatoria sub $t0,$t0,1 # Sottrae uno bgtz $t0,while # Riesegue ciclo finché cond. vera end:sw $t1,y # Salva risultato in y 39 Saltare per ripetere: do while Voglio eseguire più volte del codice finché una espressione è vera. So che all inizio l espressione è vera (quindi eseguo il codice e poi controllo) Inizializzo i registri che mi servono prima di iniziare il ciclo 1. Codice da ripetere finché la condizione è vera 2. Codice per valutare l espressione e mettere il risultato in un registro (o due) 3. Salto condizionato al punto 1 per eseguire un altra volta se la condizione è vera Esempio in assembly: (loops.s) Finché x > 0 lo sommo a y (y = y + x) e lo decremento (x = x 1) lw $t0,x # Carica x lw $t1,y # Carica y dowhile: # (Inizio ciclo) add $t1,$t1 $t0 # Effettua sommatoria sub $t0,$t0,1 # Decrementa x bgtz $t0,dowhile # Riesegue ciclo finché cond. vera sw $t1,y # Salva risultato in y 40 20

Saltare per ripetere: for Voglio eseguire del codice per un certo numero di volte; voglio anche poter usare l indice (numero di volte eseguite) nel codice. Inizializzo i registri che mi servono prima di iniziare il ciclo (compreso l indice) 1. Codice da ripetere il numero stabilito di volte 2. Incremento il registro usato come indice 3. Salto condizionato al punto 1 per eseguire un altra volta se la condizione è vera Esempio in assembly: (loops.s) Per 5 volte (contando da 1 a 5) sommo l indice a y (y = y + x) li $t0,1 # Inizializza indice lw $t1,y # Carica y loop: # (Inizio ciclo) add $t1,$t1,$t0 # Effettua sommatoria addi $t0,$t0,1 # Incrementa indice ble $t0,5,loop # Continua ciclo se <= 5 volte sw $t1,y # Salva risultato in y 41 Esercizi guidati su stringhe length.s Scrivere un programma che calcoli la lunghezza di una stringa. Esempio: ciao è lunga 4 count.s Scrivere un programma che calcoli il numero di occorrenze di un carattere in una stringa. Esempio: a in abbac è 2 reverse.s Scrivere un programma che data una stringa ne produce una scritta al contrario. Es. assembly MIPS deve diventare: SPIM ylbmessa E' possibile scrivere un algoritmo che lavori "sul posto" 42 21

Esercizio guidato: length.s.text.globl main main: # inizializzo un puntatore alla stringa # e un contatore per la lunghezza # finché non arrivo alla fine della stringa (0) # incremento il contatore # e faccio avanzare il puntatore strend: sw $t1, result # scrivo il risultato jr $ra.data str:.asciiz "hello world!!" result:.word 0 43 Esercizio guidato: count.s main:.text.globl main # inizializzo un puntatore alla stringa # un contatore per le occorrenze del carattere # e il carattere da contare # finché non arrivo alla fine della stringa (0) # faccio avanzare il puntatore # e se è uguale al carattere che cerco # incremento il contatore delle occorrenze strend: sw $t2, result # scrivo il risultato jr $ra.data str:.asciiz "abceebceebeebbacacb" char:.asciiz "a" result:.word 0 44 22

Esercizio guidato: reverse.s.text.globl main main: # inizializzo due indici per puntare l'inizio e la fine della stringa # sposto il secondo indice fino alla fine della stringa # scambio i due caratteri puntati dagli indici # e faccio avanzare gli indici (verso il centro della stringa) # finché non ho scambiato tutto end: jr $ra str:.data.asciiz "0123456789" # provare anche "assembly MIPS" 45 Chiamate a funzioni del sistema operativo SPIM fornisce un piccolo insieme di servizi operatingsystem-like attraverso l istruzione syscall Per richiedere un servizio: Si carica il numero che identifica il servizio nel registro $v0 Eventuali argomenti vengono caricati nei registri $a0-$a1 Eventuali risultati vengono collocati dalla chiamata di sistema nel registro $v0 Esempio li $v0,1 li $a0,5 syscall # Numero che identifica print_int # 5 è l argomento da stampare # procedi alla stampa 46 23

Elenco System Call disponibili Service Code Arguments Results print_int 1 $a0 = integer print_float 2 $f12 = float print_double 3 $f12 = double print_string 4 $a0 = string read_int 5 integer in $v0 read_float 6 float in $f0 read_double 7 double in $f0 read_string 8 $a0=buffer, $a1=length sbrk 9 $a0=amount address in $v0 exit 10 47 Esempio sulle system calls.text.globl main main: li $v0,4 # print_string la $a0,prompt syscall # stampa il prompt li $v0,8 # read_string la $a0,buffer li $a1,256 syscall # legge un nome #... continua li $v0, 10 # exit syscall # termina programma.data prompt:.asciiz "Come ti chiami: " msg:.ascii "ciao " buffer:.space 256 li $v0,4 la $a0,msg syscall # print_string # stampa "ciao " + nome 48 24

Esercizio Scrivere un programma in assembly MIPS che: Mostra un menu con tre possibilità: 1) Lunghezza Chiede un stringa e scrive la sua lunghezza; dopo mostra di nuovo il menu 2) Occorrenze Chiede una stringa e una lettera e scrive quante volte compare la lettera nella stringa; dopo mostra di nuovo il menu 3) Esci Termina l esecuzione del programma e un prompt: Scegli (1,2,3): 49 25