CALCOLATORI ELETTRONICI II Gestione delle subroutine.

27
CALCOLATORI ELETTRONICI II Gestione delle subroutine

Transcript of CALCOLATORI ELETTRONICI II Gestione delle subroutine.

Page 1: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

CALCOLATORI ELETTRONICI II

Gestione delle subroutine

Page 2: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

SUBROUTINES / 1

Vantaggi delle subroutines

In maniera analoga alle funzioni/metodi dei linguaggi ad alto livello, anche in assembly le subroutines garantiscono una maggiore semplicità, modularità e riusabilità del software.

Inoltre riducono il consumo di memoria necessario per la memorizzazione del codice, nel caso in cui un determinato insieme di istruzioni debba essere richiamato più volte durante l’elaborazione.

Page 3: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

SUBROUTINES / 2

Salto a sottoprogramma

L’istruzione di salto a subroutine (JSR) permette di saltare da un programma – programma principale – ad un altro programma – sottoprogramma.

Esempio

JSR moltiplicazione ;salta al sottoprogramma “moltiplicazione”

L’esecuzione del sottoprogramma termina con l’istruzione RET, con la quale si ritorna ad eseguire il programma principale, o meglio il programma chiamante.

Page 4: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

SUBROUTINES / 3

JSR A

RET

Programma principale Sottoprogramma A

JSR A

1. chiamata

1. risposta

2. chiamata

2. risposta

Page 5: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

JMP e JSR / 1

La sintassi di JSR (Jump To Subroutine) è la stessa dell’istruzione di salto incondizionato JMP, cioè:

JSR <dest>

dove dest è l’indirizzo di memoria della prima istruzione della subroutine espresso sotto forma di numero binario a 32 bit o di riferimento simbolico(label).

Page 6: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

JMP e JSR / 2

A differenza dell’istruzione JMP, il microprogramma associato all’istruzione JSR, prima di rimpiazzare il contenuto del PC con l’indirizzo <dest>, deve memorizzarne il valore in memoria.In questo modo, al termine della subroutine, l’esecuzione può riprendere dall’istruzione successiva alla JSR.

L’area di memoria preposta alla memorizzazione degli indirizzi di ritorno delle subroutines deve permettere di gestire efficentemente anche situazioni più complesse, in cui i sottoprogrammi chiamano a loro volta altri sottoprogrammi (nested subroutines).

Differenza tra JMP e JSR

Page 7: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

SUBROUTINES ANNIDATE

JSR A

RET

Programma principale

Sottoprogr.A

JSR A RET

Sottoprogr.B

JSR B

RET

Sottoprogr.C

JSR C

1

23

45

6

Page 8: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

STACK / 1

La gestione dei sottoprogrammi è basata su una struttura dati chiamata stack (pila), gestita con una tecnica LIFO (Last In First Out): gli elementi vengono prelevati a partire dall’ultimo che è stato memorizzato.L’operazione di inserimento di un elemento alla sommità (top) dello stack è chiamata push, mentre l’operazione inversa è chiamata pop.

Page 9: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

STACK / 2

Le operazioni di PUSH e POP, sebbene non disponibili nel set di istruzioni del PD32, vengono comunque implementate come pseudoistruzioni di movimento dati.Le pseudoistruzioni sono non sono implementate a livello hardware, ma sono messe a disposizione dall’assemblatore che provvede a mapparle nelle istruzioni del microprocessore equivalenti.

Page 10: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

GESTIONE STACK PD32 / 1

Nel PD32 lo stack è costituito da longword e ad esso è associato un particolare registro detto SP (Stack Pointer) che nel PD32 coincide con il registro R7. Tale registro punta sempre alla cima (top) dello stack.

Per “ragioni storiche”, nel PD32 lo stack cresce verso indirizzi di memoria decrescenti. Sia S l’indirizzo iniziale dello stack (base), allora gli n elementi presenti sono memorizzati nelle locazioni consecutive:

S, S-4, S-8,…,S-4*n

STACK

elem.2 byte 2

SBASES-1

S-2

S-3

S-4

S-5

S-6

S-7

S-8

elem.1 byte 4 LSB

elem.1 byte 3

elem.1 byte 2

elem.1 byte 1 MSB

elem.2 byte 4 LSB

elem.2 byte 3

elem.2 byte 1 MSB

S-8 R7

TOP

Page 11: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

GESTIONE STACK PD32 / 2

Come detto in precedenza le istruzioni PUSH e POP non sono vere e proprio istruzioni che appartengono al set del PD32, bensì sono istruzioni che il compilatore traduce in particolari MOV.

PUSH:inserisce elemento “e” in pila

SBASES-1S-2S-3S-4S-5S-6S-7S-8

S R7

e_b4e_b3e_b2e_b1

Page 12: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

GESTIONE STACK PD32 / 2

Come detto in precedenza le istruzioni PUSH e POP non sono vere e proprio istruzioni che appartengono al set del PD32, bensì sono istruzioni che il compilatore traduce in particolari MOV.

POP:estrae l’elemento “e” dalla pila

SBASES-1S-2S-3S-4S-5S-6S-7S-8

S-4 R7

e_b4e_b3e_b2e_b1

Page 13: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

STACK & PD32 / 2

Le pseudoistruzioni per la gestione dello stack

PSEUDO-ISTRUZIONE

OP. COMMENTO

PUSH S Inserisce in cima allo stack una longword indirizzata dall’operando sorgente S. Viene tradotta come: MOVL S, -(R7)

POP D Estrae dallo stack una longword e la pone nella locazione indicata dall’operando D. Viene tradotta come: MOVL (R7)+, D

PUSHSR - Inserisce lo Status Register in cima allo stack. Viene tradotta come: MOVRFRSR -(R7)

POPSR - Ripristina lo Status Register con la longword presente in cima allo stack. Viene tradotta come: MOVTOSR (R7)+

Page 14: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

ESEMPIO PUSHPRIMA DI ESEGUIRE PUSH R6…

000027FC BASE78

56

34

12

000027F8

TOP000027F8

R700000410PC11223344R6

000027FC BASE78

56

34

12

000027F4

000027F8

R700000414PC11223344R6

44

33

22

11000027F4 TOP

… E DOPO

Page 15: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

ESEMPIO POPPRIMA DI ESEGUIRE POP R5… … E DOPO

000027FC BASE78

56

34

12000027F8

00000414PCFFFFFFFFR5

44

33

22

11000027F4 TOP

000027F4R7

000027FC BASE78

56

34

12TOP000027F8

00000418PC11223344R5

000027F8R7

Page 16: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

STACK E SUBROUTINE

L’istruzione JSR inserisce (PUSH) in cima allo stack il valore del PC, ovvero l’indirizzo di ritorno della subroutine. In maniera analoga, l’istruzione RET estrae dalla cima dello stack una longword che memorizza all’interno del PC. Nella successiva fase di fetch sarà quindi caricata nell’IR l’istruzione che segue la JSR.

Lo stack è inoltre utilizzato dalla subroutine chiamata per salvare i registri che saranno utilizzati e quindi sovrascritti, così da poterne ripristinare il valore originale prima di eseguire il RET. Questa operazione assicura che la funzione chiamante trovi i registri inalterati una volta terminata l’esecuzione della subroutine. (OPERAZIONE MOLTO UTILE!!!!!!!)

Page 17: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

STACK E PARAMETRI

Esistono diverse tecniche per il passaggio di parametri ad una subroutine:

•La soluzione più efficiente è prevedere l’utilizzo di uno o più registri per il passaggio diretto dei parametri alla subroutines. In tal modo si evitano completamente accessi alla memoria. Il limite di tale tecnica è legato al ristretto numero di registri disponibili.

•Nel caso in cui i parametri da passare alla subroutine non possano essere memorizzati direttamente all’interno dei registri del PD32 è comunque possibile utilizzare i registri per indirizzare una o più aree di memoria nelle quali siano state preventivamente memorizzate i parametri da scambiare.

Page 18: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

Direttive di definizione variabiliSintassi: label dl/dw/db n {,nj}

Dichiara una variabile di nome label inizializzata al valore n.

Eventuali altri numeri specificati oltre il primo sono allocati consecutivamente in memoria a partire dall’indirizzo associato a label. Tale indirizzo è scelto dall’assemblatore!

var1 DW 4

var1 è un place-holder per una word collocata in memoria in una locazione scelta dall’assemblatore ed inizializzata a 4.

var2 DL 4, 22h, 3

alloca 3 longwords inizializzate a 4, 22h e 3. var2 punta alla prima locazione

Page 19: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

PD32 (esercizio)

Sintassi/Semantica Istruzioni:

MicroOpGen

Esercizio 1:

Dati due operandi X e Y definiti attraverso longword all’interno di variabili, implementare attraverso una subroutine l’algoritmo che produce come output la moltiplicazione X*Y

Page 20: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

PD32 / 1 (soluzione)

;subroutine per la moltiplicazione;Pre-condizioni:; moltiplicando e moltiplicatore in R0 e R1; indirizzo di memoria per risultato in R2;Post-condizioni:; Il risultato della moltiplicazione e' memorizzato nella longword indirizzata da R2; In caso di overflow ritorna con il flag di carry settato e non aggiorna la memoria

INTERFACCIA DELLA SUBROUTINE MOLTIPLICAZIONE

Page 21: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

PD32 / 2 (soluzione)MOLTIPLIACAZIONE:

push r1push r3xorl r3,r3

loop: cmpl #0,r1jz update

addl r0,r3jc overflowsubl #1,r1jmp loop

update: movl r3,(r2)overflow:

pop r3pop r1retend

Nella subroutine definita vado a “sporcare”i registri R1 e R3…..allora li salvo nellostack per poi ripristinarli alla terminazione.

L’output del metodo è restituito nell’indirizzopuntato da R2 in memoria

Page 22: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

PD32 / 3 (soluzione)

org 400h

baseadd equ 1000h ;conterra' il risultatomoltiplicando DL ?moltiplicatore DL ?

code ;inizia programmamovl moltiplicando,R1 ;carica il moltiplicando in R1movl moltiplicatore,R0 ;carica il moltiplcatore in R0movl baseadd,r2 ;carica l'indirizzo dove memorizzare il risultato in R2jsr MOLTIPLICAZIONE ;invoca la subroutine per la moltiplicazione

HALT

Codice del “chiamante” della subroutine MOLTIPLICAZIONE

Page 23: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

PD32 / 4 (soluzione)

Come fa tutto a funzionare ed il flusso di esecuzione del programma a continuare l’esecuzione anche dopo la chiamata alla subroutine MOLTIPLICAZIONE???

Come mai effettivamente l’istruzione HALT viene eseguita dalla CPU dopo aver terminato

MOLTIPLICAZIONE???

Suggerimento: come evolve il PC??

Page 24: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

PD32 (esercizio casa)

Sintassi/Semantica Istruzioni:

MicroOpGen

Esercizio Casa:

Implementare l’algoritmo per il Selection Sort in maniera modulare, sfruttando la metodologia delle subroutine.

Page 25: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

Utilizzo subroutine mondo reale

1. Implementazione di chiamate a funzioni / metodi

2. Interruzione asincrona del flusso di esecuzione di un programma

3. Implementazione di porzioni di codice per la gestione di eventi (Gestione driver )

4. ….un milione di altri usi……

Page 26: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

Istruzioni I/O PD32 Classe 7

TIPO CODICE OPERANDI C N Z V P I COMMENTO0 INs dev, D0 - - - - - - Il dato contenuto nel

buffer del device dev è trasferito nella

destinazione D0. dev ->d0

1 OUTs S,dev - - - - - - Il dato sorgente S viene trasferito nel

buffer del device dev.S->dev

2 START dev - - - - - - Viene azzerato il flip-flop STATUS del dev e

viene avviata l'operazione.

3 JR dev, D1 - - - - - - Se STATUS=1 salta alla destinazione D1

4 JNR dev, D1 - - - - - - Se STATUS=0 salta alla destinazione D1

Per la destinazione D0 sono ammessi tutti i tipi di indirizzamento tranne quello immediato.Per la destinazione D1 sono ammessi tutti i tipi di indirizzamento tranne quello con registro e immediato.

Page 27: CALCOLATORI ELETTRONICI II Gestione delle subroutine.

Formato istruzioni I/O

TIPO k I/O s ----- ----- MODO DEST

CLASSE

31 29 28 24 23 16 15 14 13 12 11 9 8 6 5 3 2 0

Per l’operando dev sono ammessi solo due modi di indirizzamento: diretto con registro ed assoluto. Per la codifica di questo campo sono usati i campi I/O e k.

Il campo I/O può assumere solo due valori:• 01 => indica che il contenuto di k è l’indirizzo del device• 10 => indica che l’indirizzo del device è contenuto nel registro generale specificato dai primi 3 bit del campo k

Poichè i campi modo sorgente e sorgente sono inutilizzati, la sorgente S viene specificata nei campi modo destinazione e destinazione.

111