Che materia stai cercando?

Anteprima

ESTRATTO DOCUMENTO

PROGRAMMI DA SVOLGERE:

o 6) Un vettore è una sequenza ordinata di dati dello stesso tipo

presenti in memoria. Scrivere un programma che allochi in

memoria un vettore contenente le 5 word (due byte) elencate di

seguito: 2A11, 2FB1, CC92, 3E40, A119 (suggerimento: usare la

direttiva DC ). Compilare il programma e, osservando il file .LIS,

riconoscere il tipo di organizzazione dei dati in memoria adottato

dal processore.

7) Estendere il precedente programma aggiungendo una seconda area

dati avente la stessa dimensione del primo vettore, ma non

inizializzata (suggerimento: usare la direttiva DS ). Usando le

opportune operazioni di trasferimento (MOVE), copiare il vettore

iniziale nella seconda area allocata dal programma, in modo che il

vettore risultante sia ordinato secondo una convenzione little-

endian.

OPERAZIONI DI SHIFT

o Il processore 68000 mette a disposizione le seguenti istruzioni di shift

(consultare il manuale per i dettagli della sintassi)

- ASL: shift aritmetico a sinistra;

- ASR: shift aritmetico a destra;

- LSL: shift logico a sinistra;

- LSR: shift logico a destra;

- ROL: ruota a sinistra;

- ROR: ruota a destra.

8) Scrivere un programma che contenga una variabile di tipo Word

(due byte) in cui sia memorizzato il seguente valore: B155. Il

programma deve caricare il dato in un registro ed applicargli uno

shift a destra. Compilare e simulare il programma. Osservare cosa

cambia usando uno shift a destra logico piuttosto che aritmetico

Ripetere le stesse prove con lo shift a sinistra.

9) Scrivere un programma che contenga una variabile di tipo Long (4

byte) in cui sia memorizzato il seguente valore: B155. Il programma

deve moltiplicare il precedente dato per il valore 19 = (10011 ) 2,

facendo uso soltanto di operazioni di shift e di addizione.

suggerimento: ricordare un esempio simile presentato nella parte

sulla rappresentazione dei numeri.

10) Scrivere un programma che contenga due variabili di tipo Word

(due byte) etichettate come A e B. Scegliere arbitrariamente il

contenuto delle due locazioni di memoria. Facendo uso di operazioni

di spostamento, il programma deve eseguire lo swap, ovvero deve

invertire i contenuti delle due locazioni di memoria A e B.

11) Scrivere un programma che contenga due variabili di tipo Word

(due byte) etichettate come A e B. Scegliere arbitrariamente il

contenuto delle due locazioni di memoria. Facendo uso di operazioni

di spostamento, di confronto (CMP) e di salto condizionato (Bcc), il

programma deve eseguire lo swap, ovvero deve invertire i contenuti

delle due locazioni di memoria, ma soltanto nel caso in cui il

contenuto di A sia minore del contenuto di B.

12)Scrivere un programma che calcola la moltiplicazione tra due

variabili A e B secondo il seguente approccio: somma A un numero

di volte indicato dal valore di B Ad esempio, per calcolare 5 x 3,

calcola 5 + 5 + 5= 15

suggerimento: usare costrutti di confronto (CMP) e salto

condizionato (Bcc) per creare un ciclo. Il ciclo deve essere ripetuto B

volte. Usare un registro dati Dx, da inizializzare con il valore di B e

decrementare fino a quando diventa 0, mentre in un altro registro

dati Dy si somma ripetutamente il valore di A.

MODI DI INDIRIZZAMENTO

• Indicano come la CPU accede agli operandi usati dalle proprie istruzioni;

Address,

• La loro funzione è quella di fornire un indirizzo effettivo (Effective

EA) per l’operando di un’istruzione:

– Es: In un’istruzione per la manipolazione di un dato, l’indirizzo effettivo è

l’indirizzo del dato da manipolare;

– Es: In un’istruzione di salto, l’indirizzo effettivo è l’indirizzo dell’istruzione

a cui saltare;

• Sono possibili moltissimi modi di indirizzamento. Nessun processore li

supporta tutti. il 68000 ne supporta una buona parte.

MODI DI INDIRIZZAMENTO DEL 68000

o Register Direct:

• Data-register Direct; Address-register Direct.

Register Direct

Vediamo il Addressing:

È il modo di indirizzamento più semplice. La sorgente o la destinazione

registro dati registro indirizzi.

di un operando è un o un Se il

registro è un operando sorgente, il contenuto del registro specificato

fornisce l’operando sorgente. Se il registro è un operando destinazione,

esso viene caricato con il valore specificato dall’istruzione,

sovrascrivendo il contenuto precedente.

Funzionamento:

Caratteristiche:

veloce,

È perché non c’è bisogno di accedere alla memoria esterna;

 corte,

Fa uso di istruzioni perché usa soltanto tre bit per specificare uno

 degli otto registri (reg), più un bit per indicare quale gruppo di registri

usare (mode):

- mode reg

= 0, = 0-7 per Dn

- mode reg

= 1, = 0-7 per An

- Ad esempio, per codificare la MOVE D0,D1 bastano 16 bit di parola

codice (non sono necessarie parole aggiuntive)

I programmatori lo usano per memorizzare variabili che sono usate di

 storage);

frequente (scratchpad

Immediate (or Literal)

• parte

Il valore stesso dell’operando effettivo costituisce

 dell’istruzione;

Può essere usato unicamente per specificare un operando sorgente (non

 si può scrivere su una costante!);

#

È indicato da un simbolo davanti all’operando sorgente;

 literal

Un operando immediato è anche chiamato

 Funzionamento:

 Caratteristiche:

 • Se la costante da manipolare ha dimensioni ridotte (pochi bit) è

possibile codificarla direttamente nei 16 bit dell’istruzione; non sono

literal

necessarie parole aggiuntive per codificare il oltre alla parola

direct

codice di 16 bit; se l’operando destinazione è un registro (register

addressing), l’intera istruzione viene codificata su 16 bit; non sono

necessarie ulteriori (lenti) accessi in memoria.

• Se la costante è “lunga”, è necessario usare una o più parole

aggiuntive che seguono la parola codice.

Absolute: short; long

È il modo più semplice per specificare un indirizzo di memoria completo;

 fornisce direttamente il valore dell’indirizzo

L’istruzione

 dell’operando in memoria;

Richiede due accessi in memoria: il primo è per prelevare l’istruzione e

 l’indirizzo assoluto che essa fornisce, il secondo è per accedere

all’operando effettivo;

Funzionamento:

 ESEMPIO MODI FONDAMENTALI:

o 1) Consideriamo questo frammento di programma in linguaggio di

alto livello (ad esempio C/C++):

char z, y = 27;

z = y + 24;

Il seguente frammento di codice lo implementa in assembler:

Programma assemblato:

Mappa della memoria:

2) Consideriamo questo frammento di programma in linguaggio di

alto livello (ad esempio C/C++):

char z, y = 27;

z = y + 24;

Il seguente frammento di codice lo implementa in assembler:

Programma Assemblato:

Mappa della memoria:

Address-register Indirect

L’istruzione specifica uno dei registri indirizzo;

 registro indirizzo contiene l’indirizzo

Il effettivo dell’operando;

 Il processore accede all’operando puntato dal registro indirizzo;

 Funzionamento:

 Auto-Increment

L’istruzione specifica uno dei registri indirizzo, usando la modalità

 Address Register Indirect. (An)+,

Se il modo di indirizzamento è specificato come il contenuto del

 incrementato automaticamente

registro indirizzo è di una quantità

dopo l’uso

pari alla dimensione dell’operando (“post-incremento”).

Funzionamento:

 Auto-Decrement

• L’istruzione specifica uno dei registri indirizzo, usando la modalità

 Address Register Indirect. -(An),

Se il modo di indirizzamento è specificato come il contenuto

 decrementato automaticamente

del registro indirizzo è di una

prima dell’uso

quantità pari alla dimensione dell’operando (“pre-

decremento”).

ISTRUZIONE LEA

o Ax Address

• Serve a calcolare e caricare in un registro l’Effective (EA)

così come verrebbe calcolato da un’istruzione che abbia indirizzi di

memoria come operandi;

• E’ utile per evitare di far calcolare direttamente all’istruzione l’EA,

Ax;

generandolo prima ed eventualmente salvandolo in un registro

• Nel caso di indirizzi costanti (che non vanno quindi calcolati) non è

particolarmente utile ed è sostituibile con un trasferimento

Ax

dell’indirizzo (costante) nel registro destinazione – (vedi esempio

sotto).

ESEMPIO

o • Scrivere un programma assembly che sommi cinque numeri

memorizzati in locazioni di memoria consecutive;

• Assemblare ed eseguire sul simulatore;

• Sperimentare: l’effetto dell’istruzione LEA; l’effetto

dell’autoincremento.

- Codice esempio: register indirect

Il seguente frammento di codice usa l’address

addressing post-increment

con per sommare cinque numeri

locazioni di memoria consecutive.

memorizzati in

- Tracce del programma

- Esecuzione

PROBLEMA

o Identificare l’addressing mode usato per l’operando sorgente in ciascuna

delle seguenti istruzioni SOLUZIONE

Se doveste tradurre in linguaggio assembly il seguente frammento di

o pseudo-codice, quali modi di indirizzamento utilizzereste?

SOLUZIONE

Indexed short

• Addressing

• In generale, l’Indexed combina due componenti mediante

somma, per formare l’Effective Address (EA):

- base address

Il primo componente è detto ed è specificato come

parte dell’istruzione (come nell’absolute addressing);

- index register

Il secondo componente è detto e contiene il valore

da sommare al base address per ottener l’EA;

• È adatto per accedere ai valori di array e di tabelle;

• Il processore MC68000 non supporta esplicitamente l’Indexed

Addressing. Short Addressing

Tuttavia, è possibile usare l’Indexed nei

(32+32)Kbyte agli estremi dei 4GB dello spazio di memoria.

Based

• Based Addressing Addressing,

• è esattamente l’inverso dell’Indexed in

quanto combina due componenti mediante somma, per formare l’EA,

ma:

- displacement

Il primo componente è detto ed è specificato come

parte dell’istruzione (come nell’absolute addressing);

- base address

Il secondo componente è detto ed è contenuto in un

registro.

• È adatto per accedere ai valori di array e di tabelle di cui si conosca

la posizione relativa ad assembly time, ma non quella iniziale.

Based Addressing come l’Indexed.

• Il processore MC68000 supporta il

• Based Indexed: short; long

Based Indexed Addressing

• combina due componenti mediante somma,

per formare l’EA, ma:

- base

Il primo componente è detto registro base e contiene il

address

- Il secondo componente è detto registro indice e contiene il

displacement

• Consente di calcolare a run time sia la posizione iniziale che quella

relativa di tabelle ed array Short Based Indexed Long

• Il processore MC68000 supporta lo ed il

Based Indexed

ESEMPIO DI USO DELLA LEA

o ADD

• Osservazione: Se l’istruzione dell’esempio precedente dovesse

essere ripetuta molte volte, sarebbe inefficiente ripetere ogni volta

durante l’esecuzione il calcolo dell’Effective Address;

LEA

• Conviene usare l’istruzione per calcolare una sola volta

Ax,

l’Effective address e salvarlo in un registro che può poi essere

utilizzato continuamente senza ripere il calcolo.

• Relative

• “Relative” indica che il calcolo dell’indirizzo è relativo al Program

differenza rispetto all’indirizzo

Counter (PC), ovvero calcolato per

dell’istruzione attualmente eseguita;

• Questi modi di indirizzamento calcolano l’indirizzo effettivo come

displacement

somma di un fisso specificato nell’istruzione e del valore

corrente del PC;

• Fanno spesso uso di displacement piccoli, di 8 o 16 bit, per specificare

indirizzi “vicini” all’istruzione corrente, anziché ricorrere a indirizzi

assoluti di 32 bit;

• Il 68000 non consente di utilizzare questi modi di indirizzamento per

specificare operandi che potrebbero essere modificati.

• Relative Indexed: short; long

Relative;

• Variante del Based Indexed, base register

• Funziona come il ma il è sostituito dal

PC; read-only,

• Può essere usato per saltare ad aree di memoria può essere

usato anche per i dati ma è più frequente trovarlo usato per le

istruzioni. ESEMPI DI PROGRAMMAZIONE

PROGRAMMA CON MATRICI

o 13) Scrivere un programma che contenga in memoria una matrice di

byte di dimensione RG x CL (RG righe e CL colonne). Il programma

deve trovare il valore minimo all'interno della matrice. Considerare

ad esempio RG=3 e CL=3.

La matrice viene linearizzata per essere disposta in memoria, byte

dopo byte. La matrice è linearizzata per righe.

Scorriamo la matrice riga per riga e, per ogni riga, colonna per colonna. Serve

un ciclo innestato: un ciclo all’interno di un ciclo più esterno.

Per la ricerca del minimo, inizializziamo una variabile (scegliamo il registro

D3) con il massimo valore che un byte con segno può avere ($7F). Durante lo

scorrimento, viene prelevato ogni elemento della matrice e confrontato con

D3. Se il valore appena letto dalla matrice è minore di D3, esse viene usato

per sovrascrivere D3 e diventa così il nuovo minimo temporaneo L’ultimo

valore che rimarrà in D3 dopo lo scorrimento della matrice rappresenterà il

valore più basso presente.

PROGRAMMI CON VETTORI

o 14)Il programma deve contenere un vettore di N word (due byte). Le

istruzioni del programma devono rovesciare il contenuto del vettore:

Ad esempio – Vettore prima dell’esecuzione: [ $3, $29, $2, $5, $C,

$22 ] – Vettore prima dell’esecuzione: [ $22, $C, $5, $2, $29, $3 ].

Usare la modalità di indirizzamento con autoaggiornamento.

PROGRAMMI CON STRINGHE

o 15) Scrivere un programma che contenga due stringhe (vettori di

caratteri), una stringa più lunga STR, ed una più corta TKN. Il

programma deve verificare se la stringa più corta TKN è contenuta

in quella più lunga STR. Area dati del programma: una stringa è

un vettore di caratteri; Un carattere si indica tra apici singoli e

rappresenta la codifica in codice ASCII di quel carattere: AD

esempio, ‘c’ è di fatto il byte di valore $63.

RICAPITOLAZIONE ISTRUZIONI

SHIFT

1) TEST E BIT-TEST

2) OPERAZIONI DI SCAMBIO

3) ADD/SUB “QUICK”

4) Spesso occorre effettuare incrementi/decrementi di piccole quantità.

Un’istruzione però può codificare valori immediati soltanto con 16 o 32

bit; ciò può implicare un certo spreco di memoria.

somma/sottrae un immediato codificabile su tre bit (valori da 1 a 8,

escludendo lo 0, che non serve). L’immediato è codificato direttamente

nei 16 bit dell’istruzione.

OPERAZIONI CON IMMEDIATI

5) MOLTIPLICAZIONE E DIVISIONE

6) La moltiplicazione opera sempre su operandi a 16 bit, in modo che il

risultato richieda al massimo 32 bit.

MANIPOLAZIONE INDIRIZZI

7) TRASFERIMENTO MULTIPLI: MOVEM

8) CONFRONTO MEMORIA- MEMORIA

9) DBcc: TEST, DECREMENT, BRANCH

10) cc

Fintantoché la condizione rimane falsa, decrementa il registro Dx

fornito all’istruzione, e se questo non era zero prima del decremento

(ovvero se ora non vale -1) salta all’etichetta fornita all’istruzione. Negli

altri casi, passa all’istruzione seguente. Fornisce un modo sintetico per

gestire i cicli, sostituendo con un’unica istruzione il decremento di un

contatore e la verifica di una condizione, che normalmente richiedono

diverse istruzioni separate. Supporta tutti i cc usati in Inoltre,

Bcc.

ammette anche le forme e ( = false, e = true) per ignorare

DBF DBT F T

la condizione ed usare solo il registro di conteggio.

ISTRUZIONI STOP, NOP

11) PROGRAMMA DBcc

o 16)Scrivere un programma che sommi gli N elementi di un vettore.

Assemblare ed eseguire il programma sul simulatore.

Sperimentare l’uso dell’istruzione DBcc.

17) Scrivere un programma che esegua il prodotto scalare tra due

vettori di word, etichettati A e B – A e B allocati staticamente ed

inizializzati con DC. Assemblare il programma con ASIMTOOL ed

eseguirlo sul simulatore ASIM.

18)Scrivere un programma che: – Riconosca un token in una stringa –

Ne memorizzi l’indirizzo in una locazione di memoria. Assemblare

ed eseguire il programma sul simulatore.

19)Riprendere il programma che sommava le word di un vettore di

lunghezza N usando la DBcc. La dimensione N del vettore era data

attraverso una costante EQU – per cambiare la dimensione, occorre

riscrivere e riassemblare il programma.

Riscrivere il programma in modo che la dimensione del vettore sia

essa stessa una variabile in memoria (definita tramite DC ) – è

quindi possibile cambiare dinamicamente la dimensione del vettore

che verrà effettivamente usato.

Confrontare i due listati generati dai due programmi. Nel

programma che usa la EQU, il PLC non sarà incrementato in

corrispondenza dell’etichetta N poiché essa non corrisponde ad una

locazione fisicamente allocata in memoria.

COSTRUTTI PER IL CONTROLLO ASSEMLBY

Le strutture di controllo normalmente utilizzate nei linguaggi di alto livello

(ad esempio il C/C++) sono automaticamente tradotte dal compilatore in

sequenze di istruzioni assembler.

Strutture di controllo in C/C++:

IF

o IF… ELSE

o DO… WHILE

o WHILE

o FOR

o

ESERCIZI

- Analizzare tutti i programmi precedentemente sviluppati e

riconoscere i costrutti condizionali ed iterativi di volta in volta

utilizzati.

18) SOTTOPROGRAMMI

- E’ utile e spesso necessario scomporre i programmi in sottoprogrammi.

- Sottoprogramma o subroutine – un segmento di codice che svolge

un’elaborazione su dati forniti in input e restituisce eventualmente

risultati in output, indipendentemente da altri segmenti.

- Realizza un’astrazione procedurale, fornendo un servizio attraverso

un’interfaccia.

- Consente un’organizzazione modulare dei programmi.

Istruzioni di collegamento a sottoprogramma

Sottoprogrammi: parametri

- Un sottoprogramma scambia con il programma chiamante dei dati sia in

input che in output;

- Le informazioni scambiate sono dette parametri;

- Nel testo del sottoprogramma, ci si riferisce ai parametri mediante dei

nomi simbolici: i parametri formali;

- L’attivazione (o invocazione) di un sottoprogramma richiede che ai

parametri formali siano assegnate degli opportuni valori: parametri

effettivi.

Sottoprogrammi: problematiche

• Collegamento (o linkage ): modo in cui un calcolatore rende possibili le

operazioni di chiamata e di ritorno delle procedure, gestendo opportunamente

gli indirizzi delle istruzioni;

• Passaggio dei parametri: insieme di convenzioni sulle modalità di

scambio dei parametri, che definiscono quali informazioni si scambiano il

programma chiamante ed il sottoprogramma (“cosa”), sia in ingresso che in

uscita ovvero al ritorno del sottoprogramma e attraverso quali meccanismi

avviene lo scambio (memoria, registri, …) (“come”).

Scambio dei parametri

Nei linguaggi procedurali di alto livello:

• “cosa” va passato, ovvero l’elenco ed il tipo dei parametri di scambio viene

definito nella dichiarazione della procedura:

- Esempio: void prod (int a, int b, int *p)

• “come” avviene lo scambio è convenuto dal linguaggio: la convenzione è

implementata dal compilatore Se si programma in assembler, è il

programmatore che stabilisce ed implementa le convenzioni:

- a meno che non si debba scrivere moduli assembler che interagiscono

con moduli C o di altro linguaggio di alto livello;

- in tal caso occorre che il programmatore rispetti le convenzioni del

compilatore.

Sottoprogrammi: procedure e funzioni

In alcuni linguaggi di alto livello (Pascal) si distingue esplicitamente tra

o funzioni:

- sottoprogrammi al cui nome è associato un valore “di ritorno”

assegnabile ad una variabile. Esempio: a := max(b, c);

procedure,

- che invece compiono solo una elaborazione sui parametri di

scambio ma non hanno un valore di ritorno. Esempio:

stampa(vettore, n);

In C tutti i sottoprogrammi sono detti funzioni. Le procedure hanno un

o dato di ritorno di tipo void.

Sottoprogrammi: esecuzioni

ESEMPIO IN C

o

Sottoprogrammi in Assembly

- La chiamata di un sottoprogramma interrompe l’esecuzione sequenziale

delle istruzioni del programma chiamante pertanto si presenta come un

caso particolare di salto;

- point)

L’indirizzo della prima istruzione della subroutine (entry deve

Program Counter;

essere caricato nel

- A differenza di un normale salto, occorre prevedere un meccanismo per

il ritorno al chiamante.

Istruzioni di collegamento a sottoprogramma

To Subroutine o Call)

• Le istruzioni di salto a sottoprogramma (Jump

salvano il valore del PC per consentire il ritorno al programma chiamante;

From Subroutine)

• Le istruzioni di ritorno da sottoprogramma (Return

ripristinano il valore del PC salvato per realizzare il ritorno al programma

chiamante; Register,

• Il valore del PC può essere salvato in un apposito registro (Link

LR) e/o in una opportuna area di memoria chiamata stack

• Esempi di istruzioni per la chiamata di subroutine:

- Motorola 68000: jsr label, bsr label;

- Intel 8086: call label;

- PowerPC e MIPS: jal label.

COLLEGAMENTO (LINKAGE)

• Il problema di consentire il ritorno dal sottoprogramma al programma

chiamante, o meglio all’istruzione del programma chiamante successiva

collegamento del sottoprogramma

alla chiamata, è detto problema di

linkage

(subroutine )

• Quattro soluzioni sono possibili:

- L’indirizzo di ritorno è salvato in un registro di macchina;

- L’indirizzo di ritorno è salvato in una particolare locazione di memoria

(ad esempio, nelle locazioni immediatamente precedenti l’entry point

della subroutine);

- L’indirizzo di ritorno è salvato in una particolare locazione di memoria

associata al programma chiamante;

- L’indirizzo di ritorno è salvato in un’area di memoria separata detta

stack. LINK REGISTER jump&link

• In alcune architetture (PowerPC, MIPS) un’istruzione di carica

Register)

l’indirizzo di ritorno in un registro del processore (Link e

successivamente effettua il salto. Nell’esempio, il Link Register è chiamato

:

$ra jal label Effetto: [PC]->$ra, label->PC

• Un’altra istruzione effettua l’operazione reciproca, il caricamento nel PC del

valore salvato nel registro di link:

jr $ra Effetto: [$ra]-> PC

• Tuttavia, il nesting delle subroutine e la ricorsione richiedono il

salvataggio del link register all’interno di una memoria esterna.

LINKAGE TRAMITE MEMORIA

• Sono possibili due varianti:

- Il sottoprogramma definisce un’area di memoria usata per lo scambio

dei parametri;

- Il programma chiamante alloca un’area di memoria per lo scambio dei

parametri e ne passa l’indirizzo iniziale al sottoprogramma.

Quest’ultimo accede ai parametri effettivi mediante un opportuno

spiazzamento rispetto all’indirizzo base (ad es., usando un modo di

displacement).

indirizzamento indiretto con

LINKAGE TRAMITE MEMORIA: PROBLEMI

diversi programmi

• Se sono in esecuzione contemporaneamente, ed

oppure

entrambi chiamano lo stesso sottoprogramma, chiamata

• se il sottoprogramma chiama se stesso, realizzando una

ricorsiva

per entrambi i casi, se accade che un sottoprogramma sia chiamato

(ovvero,

mentre ne è già in esecuzione un’altra “istanza”)

• … allora la locazione per l’indirizzo di ritorno verrà sovrascritta, e si

perderà l’indirizzo di ritorno per la prima chiamata.

PASSAGGIO DI PARAMETRI TRAMITE stack

• Il modo più efficace per gestire aree di memoria per lo scambio di parametri

stack:

è il cosiddetto

- stack (“pila”) fa riferimento al fatto che ciascun dati non è memorizzato

sempre nello stessa locazione, ma piuttosto alla prima libera;

- precisamente ogni elemento è memorizzato nella locazione successiva a

quella in cui è stato posto il dato oggetto della precedente

memorizzazione;

- man mano che i dati vengono memorizzati, essi si “accatastano” o

“impilano” l’uno sull’altro nella memoria.

• Lo stack è gestito tramite un puntatore, tipicamente un registro, che

memorizza l’indirizzo della prima locazione libera in memoria, quasi sempre

Stack Pointer

chiamato (SP).

• Il processo di memorizzazione di un dato (push) consiste nel porre il dato

SP, SP

stesso in memoria all’indirizzo incrementando poi in modo che

continui a contenere l’indirizzo della prima locazione libera.

• Il processo di prelievo di un dato dalla memoria (pop) consiste

push:

nell’effettuare in maniera speculare le operazioni del

- SP

viene prima decrementato in modo da contenere l’indirizzo

dell’ultimo dato che era stato inserito, dopodiché viene fatta la lettura

- la locazione è quel punto considerata libera (in quanto puntata

SP).

dall’indirizzo contenuto in

ESEMPIO DI FUNZIONAMENTO DELLO STACK

Accesso allo stack

Importante: push

• Le uniche operazioni di accesso allo stack sono quelle di

pop

per l’inserimento e per il prelievo; cima

• Non è possibile accedere a posizione arbitrarie, ma solo all’ultima, la

dello stack – la locazione è quel punto considerata libera (in quanto puntata

SP);

dall’indirizzo contenuto in in

• Inserimenti e prelievi vanno sempre fatti in maniera speculare (Last

First Out , LIFO):

- il primo dato letto sarà l’ultimo inserito (la cima)

- non è possibile “saltare” ad elementi interni

Organizzazione dello stack

• Processori differenti adottano scelte differenteper l’organizzazione dello

stack:

- SP

cima dello stack: è l’indirizzo della prima locazione libera (come

nell’esempio) o dell’ultima occupata;

- SP

direzione: parte da un valore di indirizzo basso e viene incrementato

con i push (come nell’esempio), o parte da un valore alto e viene

decrementato con i push (stack a crescere/decrescere);

• Le due scelte sono indipendenti e possono essere combinate in qualsiasi

modo.

Supporto per stack

• Di base, non è un meccanismo fisico e non richiede un cambiamento

all’architettura del processore;

• E’ un modo di organizzare e gestire la memoria;

• Spesso i processori forniscono anche un supporto architetturale,

stack pointer

tipicamente limitato alla presenza di un registro dedicato,

push pop,

ad di istruzioni di e ed al salvataggio automatico dell’indirizzo di

ritorno in occasione della chiamata a funzione.

Stack nel processore Motorola 68000 SP

decrescere

• Il M68000 adotta un’organizzazione dello stack a con che

locazione occupata.

punta all’ultima

A7

• Il registro è un registro speciale usato esplicitamente o implicitamente

A7 SP

da alcune istruzioni come Stack Poiter; è anche indicato come in

assembler;

A7’ A7,

• è uno Stack Pointer fisicamente diverso da usato in modalità

supervisore (ad esempio, dal codice del sistema operativo);

push pop.

• Non sono presenti istruzioni esplicite di e

MOVE.L D1,-(SP)

push

• ottenuto come predecremento:

MOVE (SP)+,D3

pop

• ottenuto come postincremento:

• In alcuni processori (es. il Motorola 68000 e nella famiglia Intel x86)

automaticamente

l’istruzione di salto a subroutine salva l’indirizzo di ritorno

sulla cima dello stack:

jsr subr push(SP, PC); subr PC

Effetto: _

• Reciprocamente, un’istruzione di ritorno da subroutine consente il

ripristino dell’indirizzo di ritorno dalla cima dello stack

rts pop(SP, PC)

Effetto:

ESEMPIO CON JSR

20)Scrivere una subroutine che calcola il valore assoluto del registro

D0: D0

|D0| ->

Chiamare la subrouting da un programma principale, che la applica

a tutti gli elementi di un vettore di interi con segno di tipo Long.

A7’)

Osservare il comportamento dello stack (puntato da durante

l’invocazione della subroutine.

PASSAGGIO DI PARAMETRI

Problematiche per la gestione deI sottoprogrammi:

prima)

Linkage (visto

 Passaggio dei parametric

Il problema in questo caso non è salvare un singolo, specifico valore (quello

PC

del prima del salto alla subroutine), come accade per il linkage;

parametri

Bisogna invece rendere accessibili al sottoprogramma i valori dei

su cui il sottoprogramma lavorerà; in generale, possono essere in numero e di

dimensione qualsiasi. Bisogna inoltre che il sottoprogramma possa rendere

risultati

accessibili i al programma chiamante al ritorno.

PASSAGGIO DI PARAMETRI CON REGISTRI

E’ la tecnica più veloce, non richiede accessi in memoria. Programma

chiamante e sottoprogramma si accordano sull’uso dei registri; i parametri di

ingresso sono messi sempre in alcuni specifici registri, dove il programma

chiamato si aspetterà di trovarli; viceversa per i risultati, che saranno scritti

dal sottoprogramma in alcuni registri prefissati, dove il programma

chiamante si aspetterà di trovarli. un limite.

Il numero ridotto di registri generali del processore rappresenta

• Ad esempio: il sottoprogramma riceve due interi, che si aspetta di trovare

R2 R3.

nei registri e

Produce inoltre un risultato, che il programma chiamante si aspetterà di

R2.

trovare nel registro

PASSAGGIO DI PARAMETRI SU MEMORIA

Invece che basarsi sul ridotto numero di registri interni al processore per lo

scambio di parametri, programma chiamante e sottoprogramma possono

di memoria.

condividere un’area

Lo scambio di parametri consiste quindi nella scrittura dei dati all’interno

dell’area di memoria e nel passaggio del solo indirizzo di partenza dell’area di

memoria, deve essere comunque stabilita una convenzione sull’ordine con cui

i dati sono disposti all’interno dell’area di memoria.

Si deve assumere che l’area di memoria sia sempre disponibile, poiché la

chiamata può avvenire in qualsiasi momento.

L’indirizzo di partenza dell’area di memoria può essere comunicato tramite

Ax

un registro indirizzo (ad esempio un registro del M68000); Ciò permette di

usare di volta in volta aree fisiche diverse.

PASSAGGIO DI PARAMETRI TRAMITE STACK

stack

Lo fornisce un meccanismo ideale per gestire aree di memoria durante

lo scambio di parametri;

Last in First Out,

La disciplina LIFO (l’ultimo elemento inserito sarà il

primo letto) è ideale per memorizzare parametri e indirizzo di ritorno, in

annidate

particolare per consentire le chiamate a sottoprogrammi, situazione

in cui un sottoprogramma a sua volta chiama altri sottoprogrammi

chiamate ricorsive)

(eventualmente sé stesso, in quelle che si chiamano

STACK PER LE ANNIDATE

3 ripulirà

Appena il sottoprogramma termina, lo stack, tramite delle 2.

pop

operazioni di riportandolo alla condizione creata dal sottoprogramma

Successivamente, può essere chiamato un differente sottoprogramma (ad

4). Linkage scambio di parametri

esempio, e avvengono indipendentemente

dallo stato degli altri sottoprogrammi e dalle specifiche locazioni in cui sono

memorizzati.

Ciascun “collegamento” tra programma chiamante e sottoprogramma avviene

push

esclusivamente tramite operazione di operazioni di di indirizzi di

pop,

ritorno e parametri nello stack e prelievi tramite operazioni di

indipendentemente dalla posizione nello stack

STACK PER LE CHIAMATE RICORSIVE

sé stessa:

E’ possibile che una funzione chiami Le istruzioni della funzione

sono le stesse, ma le locazioni occupate nello stack da indirizzo di ritorno e

istanza

parametri sono diverse per ciascuna chiamata (ovvero, per ciascuna

della funzione)

ESEMPIO: PASSAGGIO DI PARAMETRI TRAMITE STACK b e,

21)Scrivere una subroutine che prenda due parametri Long, ed e

be.

calcoli Parametri e risultato devono essere passati tramite

stack. Scrivere un esempio di programma che chiama la subroutine

scritta.

ESEMPIO: RICORSIONE

22)Scrivere un sottoprogramma programma che calcoli il fattoriale di

un intero tramite chiamate ricorsive. Invocare il sottoprogramma in

un programma principale di esempio.

In un linguaggio di alto livello, il programma potrebbe essere

sviluppato come segue:

RECORD DI ATTIVAZIONE NELLO STACK

Oltre all’indirizzo di ritorno ed ai parametri scambiati tra programma

chiamante e sottoprogramma, tipicamente nello stack si salvano anche le

variabili locali del sottoprogramma; ad esempio, in un’area dello stack

immediatamente successiva ai parametri. L’intera struttura composta da

indirizzo di ritorno, parametri, locazioni per ospitare il valore di ritorno ed

Stack Frame,

area delle variabili locali viene spesso indicata con il nome di

Record di Attivazione.

o

ISTRUZIONE LINK DEL 68000

Per facilitare la gestione del record di attivazione sullo stack, il processore

Motorola 68000 dispone di un’istruzione specifica: LINK Ax, #im

Effetto: push(Ax); [SP]_Ax ; [SP]+im_SP;

Ax Ax

Salva il contenuto del registro sullo stack, carica in il valore

SP im;

aggiornato dello Stack Pointer, ed infine incrementa (A7) dell’offset

Sommando im SP, LINK

il valore negativo al contenuto di l’istruzione

im

riserva un’area di memoria di byte sulla cima dello stack. Quest’area è

utilizzata per l’allocazione delle variabili locali del sottoprogramma.

Dualmente: UNLK Ax effettua: [Ax]_SP; pop(Ax).

LINK E UNLK LINK.

Stato dello stack prima e dopo Supponiamo che la routine richieda due

Word

variabili locali, entrambe (4 byte in tutto).

UNLK. UNLK Ax

Stato dello stack prima e dopo L’istruzione ripristina in

Ax Ax

il valore puntato da (old_Ax) e

ESEMPI CON LINK/ UNLK

23) SOTTOSISTEMA DI INGRESSO/USCITA (I/O)

Calcolatore: sottosistemi

- Processing Unit)

• Processore o CPU (Central

- • Memoria centrale

- • Sottosistema di input/output (I/O)

Sottosistema di input/output (I/O)

• Periferiche (peripherals) di Ingresso/Uscita, o Input/Output (I/O),

praticamente tutti i componenti esterni all’interazione diretta

processore-memoria.

- Esempi: tastiera, monitor, dispositivi di puntamento, periferiche USB,

disco rigido (memoria di massa), timer, gestore delle interruzioni,

Controllore del Direct Memory Address (DMA), etc etc.

INTERFACCIAMENTO CON I/O

Due approcci per l’interfacciamento tra processore e dispositivi di I/O

- “I/O mapped” I/O: il processore dispone di un’interfaccia indirizzo/dato

separato per l’I/O (es. Intel x86) e i dispositivi sono in uno spazio di

indirizzamento separato e sono presenti istruzioni apposite;

- “memory-mapped” I/O: i dispositivi sono attivati da alcuni specifici

indirizzi, per il processore, gli accessi ai dispositivi di I/O sono visti

come operazioni in memoria (es. M68000)

I/O- mapped I/O

Memory- mapped I/O

Interfaccia della periferica registri;

Tipicamente, l’interfaccia di qualsiasi dispositivo è composta da

locazioni, simili a quelle in memoria, da cui è possibile leggere o su cui è

possibile scrivere. Tre tipi di registri:

- controllo e stato;

registri di

- indirizzo;

registri

- dato.

registri

• Registri Controllo/Stato:

- Controllo: scritti dal processore, determinano mediante opportune

codifiche (diverse da periferica a periferica) cosa il dispositivo deve fare;

- Stato: scritti dalla periferica e letti dal processore, danno la possibilità

al dispositivo di informare il processore circa l’esito delle

operazioni;effettuate;

Indirizzo Dato:

• Registri e hanno lo stesso significato di quelli usati per la

memoria, ma fanno riferimento ad un insieme (tipicamente ridotto) di

locazioni fisicamente presenti nella periferica.

ESEMPIO: TERMINALE

24) Terminale: rappresenta un dispositivo combinato Monitor/Tastiera

console)

(cosiddetta

Osservazione:

- i dati sono scritti uno dopo l’altro sullo stesso indirizzo;

- Il funzionamento del dispositivo garantisce che valori scritti

successivamente sullo stesso indirizzo vengano trasferiti come dati

distinti;

- non

qui l’indirizzo corrisponde fisicamente ad una locazione di

memoria!!

INTERAZIONE CPU- PERIFERICA

• Osservazione:

- CNTRL

controllo/stato

il registro di segnala il fatto che sia stato

premuto il tasto ENTER, alzando il bit più significativo (che

stato);

rappresenta un’informazione di

- per aspettare fino alla pressione del tasto, il programma principale

CNTRL

contiene un ciclo che legge il registro e itera (bloccandosi nel

0.

ciclo) quando il bit di stato è

Polling” controllato da programma”):

• “ (o “I/O tecnica per l’interazione

CPU-periferica in cui la CPU accede ripetutamente ai registri di stato fino a

quando la periferica è pronta (come nell’esempio precedente). Impedisce alla

CPU di fare altro durante l’attesa! La CPU si blocca in quello che si chiama

busy-waiting.

• Alternativa: “Interruzioni” (interrupts), dette anche “eccezioni”

(exceptions); il processore può eseguire altre istruzioni mentre la periferica

lavora. Appena questa è pronta, il processore viene interrotto (tramite

un’opportuna infrastruttura circuitale fornita dal sistema), e passa ad

eseguire la parte di programma che gestisce l’interazione con la periferica.

INTERRUZIONI

GESTIONE DI EVENTI

Ciclo base del processore:

- le istruzioni sono eseguite una dopo l’altra in sequenza;

- eventuali salti spostano l’esecuzione ad una differente sequenza sulla

base di condizioni comunque dipendenti dal programma in esecuzione.

In molti casi, tuttavia, è necessario che il processore esegua una routine

quando si verifica un evento esterno, indipendente dal programma in

esecuzione; l’evento accade in momenti che non sono predicibili da parte del

processore.

Gli eventi esterni sono quasi sempre asincroni; Spesso si presentano con

molto più bassa

frequenza rispetto alla frequenza con la quale il processore

carica ed esegue le istruzioni.

polling I/O controllato da programma),

Nel (o la CPU accede ripetutamente

ai registri di stato fino a quando la periferica è pronta (come nell’esempio del

Terminale); impedisce alla CPU di fare altro durante l’attesa! La CPU si

busy-waiting.

blocca in quello che si chiama

Alternativa: “Interruzioni” (interrupts): dette anche “eccezioni”

(exceptions); segnale

un’interruzione è un mandato direttamente dalla

periferica al processore per interromperne l’esecuzione e lanciare l’esecuzione

di un programma differente. Il processore può eseguire altre istruzioni

mentre la periferica lavora. Appena questa è pronta, il processore viene

interrotto (tramite un’opportuna infrastruttura circuitale fornita

dal sistema), e passa ad eseguire il programma che gestisce l’interazione con

la periferica.

INTERRUZIONI ASINCRONE

Tipicamente (ma non necessariamente) le interruzioni sono innescate da un

evento esterno, ad esempio la pressione di un tasto, e possono quindi

avvenire in qualsasi momento.

- asincrona

L’interruzione è rispetto al programma

L’accettazione di un’interruzione comporta la sospensione del programma in

esecuzione ed il salto ad una routine per la gestione dell’interruzione

ISR).

Service Routine,

(Interrupt

- NON si tratta quindi di un salto o di una chiamata a sottoprogramma

eseguita “consapevolmente” dal programma interrotto.

MODIFICA AL CICLO DI VON-NEUMANN

Come realizzare le interruzioni? Se il ciclo del processore fosse puramente

quello mostrato a destra, sorgerebbero alcuni problemi:

- un’applicazione potrebbe impadronirsi della risorsa CPU senza mai

terminare;

- non ci sarebbe modo di rimuovere forzatamente un’applicazione che

entri per errore in un ciclo infinito;

- Sistema Operativo,

il in generale, avrebbe un controllo limitato sul

Sistema.

La soluzione comunemente adottata consiste nel permettere al “supervisore”

(il Sistema Operativo) di prendere periodicamente il controllo del processore.

Questo avviene esclusivamente nel caso in cui si verifichino eventi

“eccezionali”, di solito asincroni con l’esecuzione del programma

correntemente in corso.

In assenza di tali eventi l’elaborazione procede nella maniera consueta

MODALITA’ DI ESECUZIONE

La presenza di eventi è spesso collegata alla gestione delle funzionalità “di

basso livello” del calcolatore, gestione del disco, periferiche, timer, etc.

Normalmente, i programmi per la gestione di tali funzionalità devono avere

accesso a tutte le caratteristiche del calcolatore, tipicamente è meglio evitare

invece che questo sia concesso ai normali programmi utente.

Molti processori prevedono pertanto (almeno) due modalità:

- Supervisore (accesso pieno alle funzionalità del sistema);

- Utente (accesso limitato alle sole istruzioni di processazione).

cambia modalità di esecuzione

All’accettazione dell’interruzione, la CPU

passando da Utente a Supervisore. stato

La modalità di esecuzione attiva in un certo momento è parte dello del

processore. Tipicamente, in modalità di esecuzione differenti il processore

M68000

stack differenti;

accede anche a ad esempio nel la modalità è indicata

S Registro di Stato

dal bit del (SR); sono presenti due Stack Pointer (A7 e

A7’) usati rispettivamente in modalità Utente e Supervisore.

DRIVER

La modalità di esecuzione Supervisore è normalmente pensata per

l’esecuzione di routine del Sistema Operativo. L’insieme di routine, comprese

le ISR, che gestiscono l’interazione con una particolare periferica viene detto

driver.

Ogni periferica ha il proprio funzionamento e necessita pertanto dei propri

driver; questo è il motivo per cui l’installazione di una nuova periferica

comporta normalmente l’installazione dei corrispondenti driver!

TIPOLOGIE DI INTERRUZIONI

Reset:

- Riporta la macchina in uno stato iniziale noto;

- È generato da condizioni d’errore non recuperabili;

Traps:

- Forniscono un meccanismo controllato di passaggio allo stato

supervisore;

- Sono eventi sincroni (rispetto all’elaborazione);

Interrupts in senso stretto:

- Permettono di gestire richieste di “attenzione” da parte di periferiche

(tipicamente di I/O);

- Sono eventi asincroni (rispetto all’elaborazione).

TRAPS

Generano un’interruzione al termine di ogni istruzione eseguita, o in

corrispondenza di particolari circostanze determinate dal programma; sono

sincrone

pertanto con il programma. debug

Sono usate per consentire l’esecuzione passopasso ed il dei programmi.

T

Nel M68000 sono abilitate dal bit del registro di Stato (SR).

INTERRUZIONI: FUNZIONAMENTO

• Segnale di Interrupt (INT): segnale di interruzione per il processore;

• Ack: segnale

Segnale di di accettazione dell’interruzione:

• ISR (Procedura di Servizio degli Interrupt): Procedura lanciata quando

viene accolto l’interrupt.

• Sequenza di attivazione:

1) la Periferica alza il segnale (INT);

2) il Processore interrompe il programma in esecuzione;

3) la Periferica viene informata che l’interrupt è stato ricevuto (Ack);

4) viene eseguita la procedura (ISR);

5) si ripristina il Programma originale.

SEQUENZA DI ATTIVAZIONE: DETTAGLI

• Esecuzione normale;

• Servizio dell’interruzione:

- Salvataggio del contesto (hardware);

- Identificazione del device;

- Salto all’entry-point della Interrupt Service Routine (ISR);

- Salvataggio del contesto (software);

- Servizio dell’interruzione;

- Ripristino del contesto (software);

- Ripristino del contesto (hardware).

• Ripresa dell’esecuzione normale.

IL SALVATAGGIO DELLO STATO

L’elaborazione eseguita dalla ISR in risposta all’interruzione potrebbe essere

completamente indipendente da quella interrotta; questa deve poter

riprendere l’esecuzione dal punto dell’interruzione senza “accorgersi” di nulla

(a parte il ritardo dovuto al servizio dell’interruzione); occorre salvare

(prima) e ripristinare (dopo) lo stato del programma che viene di volta in

volta interrotto. Le informazioni da salvare e ripristinare comprendono:

- il valore corrente del Program Counter (PC);

- i flag di condizione e, in generale, tutto lo Status Register (SR);

- il contenuto di qualsiasi registro che sia usato sia dal programma che

dalla routine di gestione dell’interruzione.

Program Counter (PC) e Status Register (SR) vanno salvati in ogni caso; il

salvataggio deve necessariamente essere fatto in automatico all’accettazione

dell’interruzione da parte di un apposito circuito presente nel processore.

Stack Pointer)

La parte restante dello stato di esecuzione (registri e può

essere salvata in software dalla stessa ISR, tipicamente mediante dei push

sullo stack:

- Il salvataggio può richiedere trasferimenti di dati in memoria;

- questo carico aggiuntivo deve essere ridotto al minimo! (Le interruzioni

possono essere molto frequenti);

- meglio salvare i registri solo se questo è effettivamente necessario.

LATENZA DI UN’INTERRUZIONE

Il salvataggio dello stato incrementa il ritardo tra l’istante di ricezione della

richiesta di interruzione e l’istante in cui inizia l’esecuzione della routine di

latenza di interrupt.

interrupt; questo tempo viene detto

È il tempo massimo che intercorre tra la richiesta di attenzione e l’effettivo

servizio dell’interruzione.

ASPETTI DA GESTIRE

• Interrupt multipli e priorità: le fonti di interrupt sono molteplici ed

operano indipendentemente l’una dall’altra (ad es., diverse periferiche

priorità

collegate al calcolatore). Occorre definire una per gestire il caso in

nello stesso momento;

cui si presentino più interrupt

• Interrupt innestati: occorre gestire il caso in cui un interrupt a priorità

maggiore ne interrompa una a priorità minore deve essere possibile gestire

interrupt innestati (come nel caso delle subroutine), salvando e ripristinando

lo stato di ciascuna ISR a sua volta interrotta;

• Presenza di più periferiche: spesso le linee fisiche per la segnalazione

INT)

dell’interrupt (ad es., il segnale sono poche, o comunque in numero

inferiore rispetto alle periferiche fisicamente connesse al calcolatore. Più

condividere

periferiche possono quindi la stessa linea fisica; ad esempio, un

INT almeno una

unico segnale di si alza se periferica ad esso collegata ha

generato un interrupt. Quando accetta un’interrupt, però, la CPU deve

adesso anche identificare la periferica che l’ha generata;

•Interrupt vettorizzate: ogni periferica manda un codice identificativo sul

vettore)

bus (chiamato per farsi riconoscere dalla CPU; il vettore può poi

essere usato per individuare la specifica ISR che deve gestire quella

particolare interrupt.

INTERRUZIONI NEL M68000

Sono presenti 3 linee fisiche, che codificano sia la presenza di interrupt che il

suo livello di priorità:

IPL1, IPL0) 000

- di interrupt

(IPL2, = ->assenza

IPL1, IPL0) 001

- a priorità più bassa

(IPL2, = ->interrupt

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

- IPL1, IPL0) 110 a priorità più alta

(IPL2, = ->interrupt

- IPL1, IPL0) 111

(IPL2, = ->RESET (ha priorità su tutto)

ISR, Status Register

Se il processore sta eseguendo una lo contiene

I2, I1, I0

all’interno dei tre bit il livello di priorità dell’interrupt corrente;

S 1, ISR sempre eseguita

mentre il bit è in ogni caso visto che una è in

modalità supervisore. livello di priorità

Se si presenta un interrupt con un minore o uguale a

la richiesta di

quello corrente, l’interrupt innestata non è ammessa e

interruzione non viene accettata.

Più periferiche possono condividere lo stesso livello di priorità.

All’accettazione dell’interruzione, la CPU aspetta sul bus di sistema un dato

vettore,

di 8 bit, il inviato dalla periferica (diverso per ciascuna periferica).

Il vettore è usato per identificare la specifica periferica che ha determinato

l’interruzione.

Identificare la periferica significa, essenzialmente, poter individuare la

tabella delle

corretta ISR che può gestirla. Il processore gestisce una

interruzioni, indirizzi

contenente gli di tutte le ISR presenti.

vettore ISR

indice

Il è usato come nella tabella per individuare la corretta e

gestire la periferica che ha causato l’interruzione.

La tabella delle interruzioni è posta in memoria a partire dall’indirizzo 0.

Contiene 256 locazioni di 4 byte. Ogni locazione contiene l’indirizzo dell’entry

ISR.

point (prima istruzione) di una differente

E’ quindi possibile avere 256 differenti ISR:

- le prime 24 hanno funzioni speciali;

- da 25 a 31: interruzioni autovettorizzate;

- da 32 a 47: trap;

- restanti: interrupt utilizzabili per l’interazione con periferiche

generiche.

M68000: TABELLA DELLE INTERRUZIONI

INTERRUZIONI NEL M68000

particolarmente veloci

Per avere interruzioni è possibile evitare il passaggio

sul bus del vettore. Un apposito segnale informa il processore che la

interrupt

periferica non presenterà il vettore, si parla in questo caso di

autovettorizzate.

ISR

La particolare da chiamare è derivata direttamente dal livello di

priorità, come segue:

- 1 ISR 25

Livello di priorità _ esegui la numero

- 2 ISR 26

Livello di priorità _ esegui la numero

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

- 7 ISR 31

Livello di priorità _ esegui la numero

Interruzioni autovettorizzate: l’indirizzo all’interno della tabella delle

ISR

interruzioni (numero di moltiplicato per 4) è quindi derivato a partire

dal livello di priorità, come segue: ( 24 + livello di priorità ) * 4 = 60HEX +

indirizzo della locazione nella tabella in cui è

(livello di priorità) * 4 =

contenuto l’indirizzo dell’entry-point della ISR

RETI LOGICHE: INTRODUZIONE

CIRCUITI E PORTE LOGICHE

Esempio di rete di commutazione: accesa

Se i due deviatori sono collegati in parallelo, la lampada è (f=1) se

almeno uno dei due deviatori è collegato (xi=1) accesa

Se i due deviatori sono collegati in serie, la lampada è (f=1) solo se

x2=1)

entrambi i deviatori sono collegati (x1=1 e accesa

Nella configurazione sottostante, la lampada è (f=1) solo se i deviatori

x2=0 x1=0 x2=1)

sono collegati in maniera differente (x1=1 e oppure e

Segnali elettrici e valori logici

ESEMPIO: PORTE LOGICHE TTL

• Esempio: soglie e margine di rumore per la tecnologia TTL

DA BOOLE A SHANNON

- sistema formale

Ci serve un per descrivere e manipolare segnali logici;

- L’algebra di Boole fu introdotta nel 1854 come strumento per la

soluzione matematica di problemi di logica;

- Il suo uso per descrivere reti binarie di commutazione si deve a Claude

Shannon ALGEBRA DI BOOLE

L’Algebra di Boole può essere vista come un’algebra astratta definita su un

supporto K = {0,1} e tre operazioni

- AND (⋅): K × K →K

- OR (+): K × K K

- NOT (¬): K K

POSTULATI

Un’Algebra di Boole può essere definita in qualsiasi struttura goda dei

seguenti postulati:

Proprietà commutativa:

• x y = y x x + y = y + x

⋅ ⋅

Proprietà associativa:

• (x y) z = x (y z)

⋅ ⋅ ⋅ ⋅

(x + y) + z = x + (y + z)

•Per la proprietà associativa posso definire AND e OR a più di 2

operandi. Ad esempio: x y z = (x y) z = x (y z)

⋅ ⋅ ⋅ ⋅ ⋅ ⋅

Proprietà di idempotenza:

• x x = x x + x = x

• Proprietà di assorbimento:

x (x + y) = x x + (x y) = x

⋅ ⋅

PROPRIETA’

Proprietà distributiva

• x (y + z) = (x y) + (x z)

⋅ ⋅ ⋅

x + (y z) = (x + y) (x + z)

⋅ ⋅

Proprietà di convoluzione

• ¬ (¬ x) = x

Proprietà del minimo e del massimo:

• x 0 = 0

x + 1 = 1

RIEPILOGO

LEGGE DI DUALITA’ dualità,

Da qualsiasi identità booleana se ne può trarre un'altra per

sostituendo cioè ad ogni operatore e agli elementi 0 ed 1 il rispettivo duale.

In altre parole, i 14 postulati impiegati per definire l'algebra non sono tutti

indipendenti fra loro.

TEOREMA DI MORGAN

Utili quando sia necessario realizzare una funzione contenente OR avendo a

disposizione solo AND e viceversa; (in entrambi i casi avendo sempre a

disposizione anche la NOT) ¬ (x y) = (¬ x) + (¬ y)

¬ (x + y) = (¬ x) (¬ y)

PROPRIETA’ UTILI

0 1

• ed sono l’uno il complemento dell’altro

¬0 = 1 ¬1 = 0

Convoluzione:

• negando due volte un elemento si ottiene l’elemento stesso

¬(¬ a) = a

0

• è l’elemento neutro della somma

a + 0 = a

1

• è l’elemento neutro del prodotto

a 1 = a

• Assorbimento del complemento

a + (¬ a)b = a + b

ASSORBIMENTO DEL COMPLEMENTO

• Esempio di dimostrazione a + (¬ a)b = a + b

• Per la dimostrazione usare la proprietà distributiva ed infine il

complemento

a + (¬ a)b = aa + ab + (¬ a)a + (¬ a)b = [a + (¬ a)] (a+b) = a+b

ALGEBRE DI BOOLE

• La definizione di AdB non specifica quale sia K e come siano definite le

operazioni “+” , “·” e “¬”; specifica soltanto un insieme di proprietà che

devono essere soddisfatte da tali operazioni.

• Sono così possibili diversi modelli di algebra di Boole , uno dei quali è

quello introdotto all’inizio.

• Altri possibili modelli di algebra di Boole, l’algebra dei circuiti:

• I circuito logici sono circuiti elettronici nei quali una grandezza elettrica

ai morsetti di ingresso e di uscita può assumere solo due valori,

convenzionalmente rappresentati con i due elementi dell’algebra di

Boole 0 ed 1.

• In elettronica digitale si studia come realizzare circuiti elettronici per il

quale il legame tra ingressi ed uscite corrisponde a quello delle

operazioni fondamentali AND, OR e NOT dell’algebra di Boole – PORTE

LOGICHE unilaterali,

• Nelle reti logiche le uscite della rete corrispondono a valori

di grandezze elettriche misurate in opportuni punti del circuito; il flusso

dell’elaborazione procede fisicamente in un’unica direzione, dai segnali

di ingresso verso i segnali di uscita

Es. la d.d.p. misurata rispetto a massa

o bilaterali,

• Nelle reti logiche invece, l’uscita della rete è determinata

dalla presenza o dall’assenza di “contatto” tra due punti della rete.

– l’algebra della logica delle proposizioni

– l’algebra degli insiemi

PORTE LOGICHE O GATE

VARIABILI E FUNZIONI BOOLEANE

valori booleani;

K

• Elementi del sostegno dell’algebra _ variabili booleane;

• Variabili che possono assumere valori booleani _

funzioni booleane

K n y f x

• Funzioni di variabili booleane in _ ( , , , ) 1 2 =

x x

K

- Le variabili possono essere a loro volta funzioni booleane

- F

Un insieme di funzioni sul sostegno di un’algebra si dice

funzionalmente completo qualsiasi

se funzione dell’algebra può

F

essere ottenuta come composizione di funzioni appartenenti ad

TABELLA DELLA VERITA’

• Se l’algebra è finita, qualsiasi funzione può in linea di principio essere

tabella di verità;

rappresentata mediante una tabella, definita

• Funzione algebrica

Funzione definita in maniera tabellare per cui alla variabile dipendente sono

associate tutte le possibili combinazioni delle n variabili indipendenti

ove:

• n=numero delle variabili indipendenti

• N=numero totale di punti della funzione

• M=numero totale delle funzioni di n variabili

ESEMPIO DI FUNZIONI IN DUE VARIABILI

n = 2 _ N=22=4 righe nella tabella di verità

M = 24 = 16 differenti modi di riempire la tabella di verità

Ovvero, esistono16 diverse funzioni booleane di due variabili: MINI

MIZZAZIONE DI CIRCUITI COMBINATORI

FUNZIONI LOGICHE ELEMENTARI circuiti

Operazioni fondamentali sui valori booleani (bit). Corrispondono ai

elementari che possiamo usare come “mattoncini” per costruire circuiti più

complessi.

PROGRETTO DI RETI LOGICHE tabella di verità,

Una funzione logica generica è esprimibile attraverso la che

elenca i valori che le uscite devono avere per ciascuna possibile combinazione

degli ingressi.

EQUIVALENZA TRA RETI LOGICHE

Come realizzare la corrispondenza tra una generica tabella e una sua

possibile realizzazione circuitale?

Osservazione: la rete sulla destra risponde agli ingressi nella

stessa maniera di quella che abbiamo trovato (basta verificare il

valore generato per ciascuna combinazione degli ingressi), ma è

sicuramente più piccola e meno costosa!!

TEORIA DELLE RETI LOGICHE

minimi

Come identificare circuiti, o reti, ? Risulta chiaro come sia necessario

formale

uno strumento per l’analisi ed il progetto delle reti logichE… usiamo

l’Algebra di Boole!

ALCUNE DEFINIZIONI…

MINTERMINI E MAXTERMINI

FORMA NORMALE DI TIPO P


ACQUISTATO

1 volte

PAGINE

183

PESO

54.50 MB

AUTORE

r.lollo

PUBBLICATO

6 mesi fa


DETTAGLI
Corso di laurea: Corso di laurea in ingegneria biomedica
SSD:
A.A.: 2017-2018

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher r.lollo di informazioni apprese con la frequenza delle lezioni di Calcolatori elettronici 1 e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Napoli Federico II - Unina o del prof Cilardo Alessandro.

Acquista con carta o conto PayPal

Scarica il file tutte le volte che vuoi

Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato

Recensioni
Ti è piaciuto questo appunto? Valutalo!

Altri appunti di Corso di laurea in ingegneria biomedica

Ingegneria biomedica - Campi elettromagnetici
Appunto
Ingegneria Clinica - Prof. Paolo Bifulco
Appunto
Esercizi Svolti Strumentazione Biomedica
Esercitazione
Ingegneria biomedica - Formulario
Appunto