Sottoprogramma Un blocco di istruzioni, come ad esempio lanello di ritardo, può costituire un...

2
Sottoprogramm a Un blocco di istruzioni, come ad esempio l’anello di ritardo, può costituire un sottoprogramma (subroutine) a stante, richiamabile dal programma principale, al quale la CPU “ritorna” dopo l’esecuzione del sottoprogramma; è opportuno sfruttare questa possibilità soprattutto quando il blocco di istruzioni è utile in più punti del programma principale; in questo modo si evita di riscrivere due o più volte il blocco di istruzioni. Un sottoprogramma deve essere scritto (inserendolo prima della pseudoistruzione END, altrimenti viene ignorato dal programma di assemblaggio) seguendo le stesse regole di un normale programma, avendo l’accortezza di definire il suo indirizzo di partenza (tramite la pseudoistruzione ORG nn) in una cella diversa da quella del programma principale e di altri eventuali sottoprogrammi, così da non sovrapporre le varie zone di memoria occupate da programmi, sottoprogrammi e dati oggetto di elaborazione. Per “chiamare” un sottoprogramma dal programma principale occorre quindi inserire l’istruzione “CALL nn”, il cui operando nn costituisce l’indirizzo di inizio del sottoprogramma che si vuole chiamare (tale indirizzo è sostituibile da un etichetta che deve essere anche indicata nell’apposita colonna all’altezza della prima istruzione del sottoprogramma e seguita dai due punti “:”, come per le normali etichette). Una chiamata a sottoprogramma equivale a un salto, cioè a una forzatura del contenuto del program counter, con la differenza che per ogni chiamata è previsto un “ritorno” all’istruzione successiva a quella di chiamata (CALL nn) presente nel programma principale (viceversa per i salti non è definito un ritorno all’istruzione successiva al salto stesso). Da ciò ne consegue che il sistema, nel momento in cui lascia il programma principale per eseguire un sottoprogramma, deve conservare memoria dell’indirizzo di ritorno al programma principale; ciò avviene automaticamente durante l’istruzione di chiamata, nella quale, prima della forzatura del program counter all’indirizzo del sottoprogramma, viene copiato l’indirizzo successivo a quello di chiamata (già presente nel program counter durante l’esecuzione dell’istruzione corrente e diviso in due byte, parte alta e parte bassa dell’indirizzo) in una zona di memoria denominata area di stack, anch’essa distinta dalle zone di programmi, sottoprogrammi e dati. Per consentire il ritorno al programma principale, ogni sottoprogramma deve terminare con l’istruzione “RET”, che copia nel program counter l’indirizzo precedentemente salvato nell’area di stack, ripristinando la situazione di partenza.

Transcript of Sottoprogramma Un blocco di istruzioni, come ad esempio lanello di ritardo, può costituire un...

Page 1: Sottoprogramma Un blocco di istruzioni, come ad esempio lanello di ritardo, può costituire un sottoprogramma (subroutine) a sé stante, richiamabile dal.

SottoprogrammaUn blocco di istruzioni, come ad esempio l’anello di ritardo, può costituire un sottoprogramma (subroutine) a sé stante, richiamabile dal programma principale, al quale la CPU “ritorna” dopo l’esecuzione del sottoprogramma; è opportuno sfruttare questa possibilità soprattutto quando il blocco di istruzioni è utile in più punti del programma principale; in questo modo si evita di riscrivere due o più volte il blocco di istruzioni.Un sottoprogramma deve essere scritto (inserendolo prima della pseudoistruzione END, altrimenti viene ignorato dal programma di assemblaggio) seguendo le stesse regole di un normale programma, avendo l’accortezza di definire il suo indirizzo di partenza (tramite la pseudoistruzione ORG nn) in una cella diversa da quella del programma principale e di altri eventuali sottoprogrammi, così da non sovrapporre le varie zone di memoria occupate da programmi, sottoprogrammi e dati oggetto di elaborazione.Per “chiamare” un sottoprogramma dal programma principale occorre quindi inserire l’istruzione “CALL nn”, il cui operando nn costituisce l’indirizzo di inizio del sottoprogramma che si vuole chiamare (tale indirizzo è sostituibile da un etichetta che deve essere anche indicata nell’apposita colonna all’altezza della prima istruzione del sottoprogramma e seguita dai due punti “:”, come per le normali etichette).Una chiamata a sottoprogramma equivale a un salto, cioè a una forzatura del contenuto del program counter, con la differenza che per ogni chiamata è previsto un “ritorno” all’istruzione successiva a quella di chiamata (CALL nn) presente nel programma principale (viceversa per i salti non è definito un ritorno all’istruzione successiva al salto stesso). Da ciò ne consegue che il sistema, nel momento in cui lascia il programma principale per eseguire un sottoprogramma, deve conservare memoria dell’indirizzo di ritorno al programma principale; ciò avviene automaticamente durante l’istruzione di chiamata, nella quale, prima della forzatura del program counter all’indirizzo del sottoprogramma, viene copiato l’indirizzo successivo a quello di chiamata (già presente nel program counter durante l’esecuzione dell’istruzione corrente e diviso in due byte, parte alta e parte bassa dell’indirizzo) in una zona di memoria denominata area di stack, anch’essa distinta dalle zone di programmi, sottoprogrammi e dati.Per consentire il ritorno al programma principale, ogni sottoprogramma deve terminare con l’istruzione “RET”, che copia nel program counter l’indirizzo precedentemente salvato nell’area di stack, ripristinando la situazione di partenza.

Page 2: Sottoprogramma Un blocco di istruzioni, come ad esempio lanello di ritardo, può costituire un sottoprogramma (subroutine) a sé stante, richiamabile dal.

Ove prevista la presenza di almeno un sottoprogramma (o comunque l’uso dell’area di stack), per evitare sovrapposizioni accidentali tra le zone di memoria coinvolte nel programma, è buona norma di programmazione, iniziare il programma principale definendo l’indirizzo di inizio dell’area di stack, cioè l’inizializzazione del puntatore di area di stack (registro stack pointer , cioè SP) , tramite l’istruzione “LD SP,nn”, dove nn deve essere un indirizzo diverso e “lontano” dalle altre zone coinvolte, tenendo presente che le celle interessate dal salvataggio dei dati, sono quelle che precedono tale indirizzo; in caso di mancata inizializzazione del registro SP, quest’ultimo potrebbe casualmente contenere un indirizzo conflittuale con tali zone, rimasto da precedenti usi del sistema o dal suo avvio.Ogni sottoprogramma può a sua volta chiamare un’altro sottoprogramma (sottoprogrammi nidificati), terminato il quale, tornerà al sottoprogramma chiamante, che potrà così ripartire e terminare, per poi ritornare al programma principale.Sia l’istruzione CALL che l’istruzione RET possono, separatamente, essere condizionate (tramite le istruzioni “CALL cc,nn” e “RET cc”), così come avviene per i salti.

Esempio: ORG 0000H ;indirizzo inizio programma principaleLD SP,7000H ;definisci area di stack

...........................................................................................................................

.

...........................................................................................................................

.CALL RIT ;chiama il sottoprogramma anello di ritardo*

...........................................................................................................................

.

...........................................................................................................................

.HALT

ORG 0100H ;indirizzo sottoprogramma anello di ritardoRIT: LD B,38H ;prima istruzione anello di ritardo.............................................. ;ultima istruzione anello di ritardo

RET ;torna al programma principale

END ;fine programma e sottoprogrammi

*nell’istruzione, al posto del nome dell’etichetta, può comparire l’indirizzo 0100H, relativo all’indirizzo di inizio del sottoprogramma, all’altezza del quale non è più necessaria l’etichetta seguita dai due punti.

prog

ram

ma

prin

cipa

leso

ttopr

ogra

mm

a