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

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

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

Il Linguaggio Assembly: Gestione della memoria e controllo

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

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

Istruzioni di trasferimento dati

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

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

Università degli Studi di Cassino

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

ISA (Instruction Set Architecture) della CPU MIPS

Architettura degli Elaboratori

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

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 assembler Istruzione N Registri

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

Architetture dei Calcolatori

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

Università degli Studi di Roma La Sapienza

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

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

Assembly (3): le procedure

MIPS! !

System Calls, Register Spilling

Il linguaggio macchina

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

Calcolatori Elettronici

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

U"lizzo della memoria (Indirizzamento, le2ura, scri2ura) Dire8ve Assembler in SPIM

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Il linguaggio assembly

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento

Convenzioni di chiamata a procedure

Linguaggio Assembler MIPS

Il linguaggio macchina

Università degli Studi di Cassino e del Lazio Meridionale

MIPS Instruction Set 1

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

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

Richiami sull architettura del processore MIPS a 32 bit

Calcolatori Elettronici A a.a. 2008/2009

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

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

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

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

Richiami sull architettura del processore MIPS a 32 bit

Linguaggio Assembly e linguaggio macchina

Lecture 2: Prime Istruzioni

Linguaggio Assembly e linguaggio macchina

MIPS Instruction Set 1

ISA e linguaggio macchina

Linguaggio Assembly e linguaggio macchina

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

Esercizi da esame di Programmazione Assembler MIPS

7 May INTERRUPT ED ECCEZIONI I. Frosio

Università degli Studi di Roma La Sapienza

1 Esercizio. 2 Esercizio

i = 0; somma = 0; while i!= n { somma = somma + A[i]; if somma < n j = 0; else j = f2(a[i],somma); i = i + 1; $v0 return j

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

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)

Linguaggio Assembler MIPS

Calcolatori Elettronici

L ambiente di simulazione SPIM

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

Architettura degli Elaboratori B Introduzione al corso

/ sezione dichiarativa variabili globali / #define N 10 int vett [N];

Il processore: unità di controllo

come tradurre da C a MIPS un modello per generare codice macchina

Le costanti Le modalità di indirizzamento L assembly del MIPS

Assembly III SPIM: un ambiente di simulazione MIPS

Assembly MIPS: Istruzioni native e Pseudo-istruzioni Gestione di costanti in MIPS

Istruzioni: linguaggio macchina

Istruzioni: linguaggio macchina. Università di Bergamo - corso di Calcolatori Elettronici

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

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

Calcolatori Elettronici A a.a. 2008/2009

1. Schema generale di traduzione di un programma. Lo schema generale di un programma puo' essere cosi schematizzato:

Esercizi sulla macchina assembler, strutturazione a livelli, spazio di indirizzamento

Linguaggi di programmazione

Assembler MIPS R2000/3000

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

L unità di controllo di CPU a singolo ciclo

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

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

L'architettura del processore MIPS

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

MIPS Instruction Set 2

PROGRAMMAZIONE STRUTTURATA

Laboratorio di Architettura degli Elaboratori

Assembly. Motivazioni. Programmazione Assembly

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Esercitazione su Gerarchie di Memoria


Il linguaggio Java Istruzioni di Controllo

Architettura di tipo registro-registro (load/store)

Esercitazione su Instruction Level Parallelism Salvatore Orlando

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Il simulatore SPIM SPIM

Transcript:

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

SOMMARIO If... Then... If... Then... Else... For... Break... While... Do Do... While Switch (jump address table) 2

ES. 3.1 (IF... THEN...) Si traduca in assembly il seguente codice: a = <numero a caso> b = <numero a caso> c = 0; If (a<b) c=a+b Non si utilizzino pseudo-istruzioni (es. blt), ma solo istruzioni dell ISA (bne, beq, slt). Si verifichi la correttezza del valore di c alla fine dell esecuzione esecuzione. Per semplicità, si supponga che a, b e 3 c siano associate ai registri $t0,..., $t2.

ES. 3.1 - SOLUZIONE main: addi $t0, $zero, 5 # a = $t0 = 5 addi $t1, $zero, 27 #b=$t1=27 = addi $t2, $zero, 0 # c = $t2 = 0 slt $t3, $t0, $t1 # $t3 = 1 iff $t0<$t1 beq $t3, $zero, End # if $t3==0, goto End: add $t2, $t0,$t1 # Then... End: 4

ES. 3.2 (IF... THEN... ELSE...) Si traduca in assembly il seguente codice: a = <numero a caso> b = <numero a caso> c = 0; If (a<b) c=a+b; else c=a*b; Non si utilizzino pseudo-istruzioni (es. blt), ma solo istruzioni dell ISA (bne, beq, slt). Si verifichi la correttezza del valore di c alla fine dell esecuzione. esecuzione. Per semplicità, si supponga che a, b e c 5 siano associate ai registri $t0,..., $t2.

ES. 3.2 - SOLUZIONE main: addi $t0, $zero, 5 # a = $t0 = 5 addi $t1, $zero, 27 # b = $t1 = 27 addi $t2, $zero, 0 #c=$t2=0 = If: slt $t3, $t0, $t1 # $t3 = 1 iff $t0<$t1 beq $t3, $zero, Else # if $t3==0, goto Else Then: add $t2, $t0,$t1 $t1 # Then... j End # Goto End: Else: mult $t0, $t1 #HI HI, LO= $t0*$t1 $t1 mflo $t2 # $t2 = LO End: 6

ES. 3.3 (FOR...) Si scriva il codice che calcola la somma dei primi N numeri elevati al quadrato (N definito dal programmatore). Hint: N=50; Sum=0; for (n=0; n<n; n++) Sum+=n*n; 7

ES. 3.3 - SOLUZIONE main: addi $s0, $zero, 100 # N= $s0 = 100, number of samples addi $t0, $zero, 0 # $t0 = 0, counter i addi $s1, $zero, 0 # $s0 = 0, init sum for: beq $t0, $s0, end #if$t0==$s0(i==n) $s0 (i==n), loop ends mult $t0, $t0 # HI, LO = $t0 * $t0 mflo $t1 # $t1 = LO add $s1, $s1, $t1 # $s1 = $s1 + $t1 (Sum = Sum+i*i) i) addi $t0, $t0, 1 # $t0 = $t0 + 1 j for # loop end: 8

ES. 3.4 (BREAK...) Si scriva il codice che calcola l la somma dei primi i N numeri elevati al quadrato (N definito dal programmatore). Nel caso in cui l i-esimo numero da aggiungere (i*i) sia multiplo di 200, si termini prematuramente il ciclo for. Sum=0; for (i=1; i<n; i++) { If ((i*i)%200==0) Break; Sum+=i*i; } 9

ES. 3.4 - SOLUZIONE main: addi $s0, $zero, 100 # N= $s0 = 100, number of samples addi $t0, $zero, 1 # $t0 = 1, counter i addi $s1, $zero, 0 # $s0 = 0, init sum addi $t3, $zero, 200 # $t3 = 200 for: beq $t0, $s0, end # if $t0 == $s0 (i==n), loop ends mult $t0, $t0 # HI, LO = $t0 * $t0 mflo $t1 # $t1 = LO div $t1, $t3 # HI, LO = t1/200 mfhi $t2 # $t2 = HI (remainder) beq $t2, $zero, end # if ($t2/200 == 0), break add $s1, $s1, $t1 # $s1 = $s1 + $t1 (Sum = Sum+i*i) addi $t0, $t0, 1 # $t0 = $t0 + 1 j for # loop end: 10

ES. 3.5 (WHILE... DO) Si scriva il codice che effettua la somma dei primi N numeri elevati al quadrato, fermandosi nel momento in cui tale somma eccede il valore di 5500. Potenzialmente il loop potrebbe non essere eseguito nemmeno una volta (si verifichi la correttezza del codice inizializzando ad esempio il valore della somma a 100000). 11

ES. 3.5 - SOLUZIONE main: addi $t0, $zero, 0 # $t0 = 0, counter i addi $s1, $zero, 0 # $s0 = 0, init sum while: slti $t1, $s0, 5500 # if $s0<5500, $t1=1 beq $t1, $zero end # if $s0>=5000, goto end mult $t0, $t0 #HI HI, LO=$t0* $t0 mflo $t2 # $t2 = $t0, $t0 add $s0, $s0, $t2 # $s0 += $t0^2 addi $t0, $t0, 1 # $t0 += 1 j while # loop end: 12

ES. 3.6 (DO... WHILE) Si riscriva il codice dell esercizio predente per implementare il costrutto Do... While invece del costrutto While... Do. 13

ES. 3.6 - SOLUZIONE main: addi $t0, $zero, 1 # $t0 = 0, counter i addi $s1, $zero, 0 # $s0 = 0, init sum do: mult $t0, $t0 #HI HI, LO=$t0* $t0 mflo $t2 # $t2 = $t0, $t0 add $s0, $s0, $t2 # $s0 += $t0^2 addi $t0, $t0, 1 # $t0 += 1 addi $t1, $zero, 0 #$t1=0 slti $t1, $s0, 5500 # if $s0<5500, $t1=1 bne $t1, $zero, do # if $s0<5000, goto do end: 14

COSTRUTTO SWITCH Può essere implementata t mediante una serie di if-then-else Alternativa: uso di una jump address table cioè di una tabella che contiene una serie di indirizzi di istruzioni alternative { switch(k) case 0: f = i + j; break; case 1: f = g + h; break case 2: f = g - h; break; case 3: f=i- j; break; default: break; } 15

Byte address JUMP ADDRESS TABLE t4 + 12 t4 + 8 t4 + 4 L3 L2 L1 Enumero degli oggetti tramite un indice k. Questi oggetti sono gli indirizzi del codice da eseguire per ogni caso dello switch - sono memorizzati a distanza di 4 byte. In pratica un array di inidirizzi. t4 L0 Memoria principale (RAM) 16

#$s0,.., $s5 contengono f,..,k #$t4 contiene lo start address della jump address table (che si # suppone parta da k = 0). #verifica prima i limiti (default) slt $t3, $s5, $zero bne $t3, $zero, Exit # if k<0, Exit slti $t3, $s5, 4 beq $t3, $zero, Exit #if k>4, Exit #case vero e proprio muli $t1, $s5, 4 # t1 = k*4 (offset) add $t1, $t4, $t1 # t1 = address of A[k] lw $t0, 0($t1 $t1) jr $t0 # jump to A[k] L0: add $s0, $s3, $s4 j Exit L1: add $s0, $s1, $s2 STRUTTURA j Exit L2: sub $s0, $s1, $s2 j Exit L3: sub $s0, $s3, $s4 Exit: SWITCH/CASE OTTIMIZZATA 17

ESEMPIO switch(k) { case 0: f = i + j; break; case 1: f = g + h; break case 2: f = g - h; break; case 3: f = i - j; break; default: break; } 550,000 16 L3 = 500,018 16 L2 = 500,010 16 L1= 500, 008 16 L0 = 500,000 16 Jump Add dress Table (indirizzo iniziale è memorizz zato in $t4) k -> $s5 550,000 16 -> $t4.. muli $t1, $s5, 4 add $t1, $t4, $t1 lw $t0, 0($t1 $t1) jr $t0 L0: add $s0, $s3, $s4 j Exit L1: add $s0, $s1, $s2 j Exit L2: sub $s0, $s1, $s2 j Exit L3: sub $s0, $s3, $s4 Exit: add... 500,01c 01c 16 Exit: add... 500,018 16 L3: sub $s0, $s3, $s4 jexit 500,010 010 16 L2: sub $s0, $s1, $s2 j Exit 500,008 L1: add $s0, $s1, $s2 16 j Exit 500,000 L0: add $s0, $s3, $s4 16 18

ES. 3.7 SWITCH (JUMP ADDRESS TABLE) Si realizzi, utilizzando una Jump Addres Table, il codice Assembly che traduce la seguente porzione di codice: a= <numero scelto dal programmatore tra 0, 1 e 2> b= <numero scelto dal programmatore tra 0, 1 e 2> Switch (a*b) Case 0: a=1; b= 2; c=0; break; Case 1: a=0; c=0; c=100; break; Case 2: c=a; a=1; b=0. d= a + b + c; Hint: Per salvare in un registro l indirizzo di memoria associato all etichetta etich:, è sufficiente utilizzare: la $t0, etich # la &etich: Hint: Per allocare spazio in memoria per la Jump Address Table, possiamo usare la riga:.data 19 lookup:.space 12 # alloca 12 bytes in memoria

ES. 3.7 SOLUZIONE (1).data # Static data here.align 2 JAT:.space 12 # Allocate 12 bytes for the Jump Address Table.text # code here main: # Jump Address Table la $t0, JAT # $t0 contains the JAT base address la $t1, case0 # $t1 contains the address of case0 sw $t1, 0($t0) # Store $t1 in JAT[0] la $t1, case1 # $t1 contains the address of case1 sw $t1, 4($t0) # Store $t1 in JAT[1] la $t1, case2 # $t1 contains the address of case2 sw $t1, 8($t0) # Store $t1 in JAT[2] addi $s0, $zero, 1 # a = $s0 = 0 addi $s1, $zero, 1 # b = $s1 = 1 20

ES. 3.7 SOLUZIONE (1) mult $s0, $s1 #HI HI, LO=$s0*$s1 $s1 = a*b mflo $t1 # $t1 = a*b addi $t4, $zero, 4 # $t4 = 4 mult $t1, $t4 # HI, LO = $t1*4 mflo $t2 # $t2 = $t1*4 add $t3, $t2, $t0 # $t3 contains the JAT proper addres lw $t5, 0($t3) # Load the address contained in the JAT # Jump to the case, save ra register jal $t5 # Jump to case0, 1, 2 ori $7, $zero, $zero #nop add $s3, $s0, $s1 # d = $s3 = $s0 + $s1 = a+b add $s3, $s3, $s2 # d += c j end # Jump to end 21

ES. 3.7 SOLUZIONE (1) case0: addi $s0, $zero, 1 # a = $s0 = 1 addi $s1, $zero, 2 # b = $s1 = 2 addi $s2, $zero, 0 # c = $s2 = 0 jr $ra # jump to return address (in ra) case1: addi $s0, $zero, 0 # a = $s0 = 0 addi $s1, $zero, 0 # b = $s1 = 0 addi $s2, $zero, 100 # c = $s2 = 100 jr $ra # jump to return address (in ra) case2: add $s2, $zero, $s0 # c = a addi $s0, $zero, 1 # a = $s0 = 1 addi $s1, $zero, 0 # b = $s1 = 0 jr $ra # jump to return address (in ra) end: 22