31.05.2013 Views

Introduzione alla famiglia Motorola 68000 - Quelli di Informatica

Introduzione alla famiglia Motorola 68000 - Quelli di Informatica

Introduzione alla famiglia Motorola 68000 - Quelli di Informatica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Calcolatori Elettronici<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

<strong>Introduzione</strong> <strong>alla</strong><br />

<strong>famiglia</strong> <strong>Motorola</strong> <strong>68000</strong><br />

Maurizio Rebaudengo Matteo Sonza Reorda<br />

• Storia<br />

• <strong>Introduzione</strong><br />

• Registri interni<br />

Politecnico <strong>di</strong> Torino<br />

Dipartimento <strong>di</strong> Automatica e <strong>Informatica</strong><br />

• Mo<strong>di</strong> <strong>di</strong> in<strong>di</strong>rizzamento<br />

• Instruction set<br />

Sommario<br />

M. Rebaudengo, M.Sonza Reorda I.1<br />

2


Calcolatori Elettronici<br />

Storia<br />

<strong>Motorola</strong> ha introdotto il suo primo microprocessore ad<br />

8 bit nel 1974 ( MC6800).<br />

Nel 1979 esce sul mercato il microprocessore a 16/32 bit<br />

MC<strong>68000</strong> (non compatibile a livelli s/w rispetto al 6800).<br />

Questi due microprocessori <strong>di</strong>edero origine a due<br />

famiglie <strong>di</strong>stinte <strong>di</strong> microprocessori <strong>Motorola</strong>.<br />

Famiglia 6800<br />

A partire dal 6800 i microprocessori e microcontrollori<br />

ad 8 bit prodotti da <strong>Motorola</strong> sono:<br />

• 6502<br />

• 6802<br />

• 6805<br />

• 6809<br />

• serie HC11<br />

• serie HC16<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.2<br />

3<br />

4


Calcolatori Elettronici<br />

Famiglia <strong>68000</strong><br />

A partire dal <strong>68000</strong> i microprocessori a 16/32 bit prodotti<br />

da <strong>Motorola</strong> sono:<br />

• 68010<br />

• 68020<br />

• 68030<br />

• 68040<br />

• 68060<br />

• serie 68300<br />

Caratteristiche generali del<br />

microprocessore <strong>68000</strong><br />

• chip a 64 pin<br />

• processore CISC<br />

• 8 registri <strong>di</strong> dato general-purpose a 32 bit<br />

• 8 registri <strong>di</strong> in<strong>di</strong>rizzo general-purpose a 32 bit<br />

• data bus a 16 bit<br />

• spazio <strong>di</strong> in<strong>di</strong>rizzamento <strong>di</strong> 16Mbyte<br />

• I/O <strong>di</strong> tipo memory mapped<br />

• 2 livelli <strong>di</strong> privilegio: User e Supervisor<br />

• bus <strong>di</strong> dati e <strong>di</strong> in<strong>di</strong>rizzo non multiplexati<br />

• 7 livelli <strong>di</strong> interruzioni esterne.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.3<br />

5<br />

6


Calcolatori Elettronici<br />

Organizzazione dei dati<br />

I registri dato ed in<strong>di</strong>rizzo hanno un parallelismo <strong>di</strong> 32<br />

bit, ma è possibile lavorare con parole aventi un numero<br />

<strong>di</strong> bit inferiore.<br />

Le istruzioni possono operare con parole <strong>di</strong> 32, 16, 8<br />

oppure 1 bit.<br />

I tipi <strong>di</strong> dato ammessi sono:<br />

• byte: 8 bit<br />

• word: 16 bit<br />

• long word: 32 bit.<br />

Organizzazione dei dati<br />

(cont.)<br />

L’assembler <strong>68000</strong> permette <strong>di</strong> specificare il tipo <strong>di</strong> dato<br />

a cui si sta facendo riferimento, aggiungendo un<br />

suffisso allo mnemonico del’istruzione:<br />

• .B per dati <strong>di</strong> tipo byte<br />

• .W per dati <strong>di</strong> tipo word<br />

• .L per dati <strong>di</strong> tipo long.<br />

Esempio:<br />

MOVE.W DO, D1<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.4<br />

7<br />

8


Calcolatori Elettronici<br />

D0<br />

D1<br />

D1<br />

Organizzazione dei dati<br />

(cont.)<br />

Quando il processore lavora con un dato memorizzato in<br />

un registro ed il tipo <strong>di</strong> dato è inferiore a 32 bit, viene<br />

utilizzata esclusivamente la parte meno significativa del<br />

registro.<br />

Operazioni sulla parte meno significativa del registro<br />

non influiscono sui restanti bit.<br />

Organizzazione dei dati<br />

(cont.)<br />

Esempio:<br />

F1<br />

22<br />

13<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

ADD.B D0, D1 non cambia il contenuto<br />

M. Rebaudengo, M.Sonza Reorda I.5<br />

+<br />

=<br />

9<br />

X N Z V C<br />

1 0 0 0 1<br />

CCR<br />

10


Calcolatori Elettronici<br />

Memorizzazione dei dati<br />

La regola per ogni tipo <strong>di</strong> dato è la seguente:<br />

• il byte più significativo è memorizzato all’in<strong>di</strong>rizzo<br />

pari inferiore e ad in<strong>di</strong>rizzi successivi vengono<br />

memorizzati i byte via via meno significativi.<br />

Esempio<br />

Memorizzazione dei dati<br />

(cont.)<br />

all’in<strong>di</strong>rizzo xx0000 è memorizzata la word B52D;<br />

all’in<strong>di</strong>rizzo xx0002 è memorizzata la long word<br />

A756CF00.<br />

0000<br />

0002<br />

0004<br />

0006<br />

B5 2D<br />

A7 56<br />

CF 00<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

0001<br />

0003<br />

0005<br />

0007<br />

M. Rebaudengo, M.Sonza Reorda I.6<br />

11<br />

12


Calcolatori Elettronici<br />

Questo tipo <strong>di</strong> convenzione prende il nome <strong>di</strong><br />

big en<strong>di</strong>an, per <strong>di</strong>stinguerla d<strong>alla</strong> convenzione<br />

Intel chiamata little en<strong>di</strong>an.<br />

I Lillipuziani (in I viaggi <strong>di</strong> Gulliver) litigavano<br />

animosamente perché non erano d’accordo sul<br />

modo <strong>di</strong> rompere le uova, 2 erano i partiti<br />

avversi: quello dell’estremità grande ( big end) e<br />

quello dell’estremità piccola ( little end)...<br />

Registri utente<br />

Il processore <strong>68000</strong> possiede i seguenti registri:<br />

• 8 registri <strong>di</strong> dato a 32 bit (D0-D7)<br />

• 7 registri <strong>di</strong> in<strong>di</strong>rizzo a 32 bit ( A0-A6)<br />

• 1 registro <strong>di</strong> stack per il modo user (A7 o USP)<br />

• 1 registro <strong>di</strong> stack per il modo supervisor (A7 o SSP)<br />

• 1 registro program counter (PC)<br />

• 1 registro <strong>di</strong> stato per il modo utente (CCR)<br />

• 1 registro <strong>di</strong> stato per il modo supervisor (SR)<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.7<br />

13<br />

14


Calcolatori Elettronici<br />

31 16 15 8 7 0<br />

Modo User<br />

D0<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

31 16 15 0<br />

D0<br />

Data Registers Address<br />

Registers<br />

program counter PC<br />

31 16 15 8 7 0<br />

D7 User stack pointer (USP)<br />

Con<strong>di</strong>tion Code Register<br />

Modo Supervisor<br />

D0<br />

7 0<br />

M. Rebaudengo, M.Sonza Reorda I.8<br />

A6<br />

A7<br />

User CCR<br />

31 16 15 0<br />

D0<br />

Data Registers Address<br />

Registers<br />

program counter PC<br />

D7 Supervisor stack<br />

pointer (SSP)<br />

15 8 7 0<br />

A6<br />

A7<br />

System User SR<br />

Status Register<br />

15<br />

16


Calcolatori Elettronici<br />

Registri <strong>di</strong> dato<br />

Il processore <strong>di</strong>spone <strong>di</strong> 8 registri <strong>di</strong> dato a 32 bit.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

I registri sono <strong>di</strong> tipo general-purpose, nel senso che<br />

ciascuna operazione permessa sul generico registro D i<br />

è permessa anche sul registro D j.<br />

È possibile accedere al registro utilizzando<br />

esclusivamente la parte meno significativa del registro<br />

(byte o word). Tali operazioni sono specificate all’interno<br />

dell’istruzione assembler.<br />

Registri <strong>di</strong> in<strong>di</strong>rizzo<br />

Il processore <strong>68000</strong> ha 8 registri <strong>di</strong> in<strong>di</strong>rizzo. Questi registri<br />

sono registri puntatore e memorizzano in<strong>di</strong>rizzi <strong>di</strong> dati in<br />

memoria.<br />

I registri <strong>di</strong> in<strong>di</strong>rizzo sono costituiti da 32 bit e le operazioni<br />

fatte su <strong>di</strong> essi riguardano l’intera parola da 32 bit.<br />

Per i registri <strong>di</strong> in<strong>di</strong>rizzo valgono le seguenti regole:<br />

• operazioni fatte sul byte dal bit 0 al bit 7 non sono<br />

permesse;<br />

• un’operazione sulla word meno significativa ha influenza<br />

su tutti e 32 i bit: se la word meno significativa <strong>di</strong> un<br />

registro è caricata con un operando a 16 bit, il bit <strong>di</strong><br />

segno dell’operando è esteso dal bit 16 al bit 31 della<br />

word più significativa.<br />

M. Rebaudengo, M.Sonza Reorda I.9<br />

17<br />

18


Calcolatori Elettronici<br />

Registro A7<br />

Come nel caso dei registri <strong>di</strong> dato, un’operazione fatta sul<br />

registro A i può essere ugualmente fatta sul registro A j.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

C’è un’eccezione: il registro A7 è un registro <strong>di</strong> in<strong>di</strong>rizzo<br />

special-purpose e funziona come stack pointer usato dalle<br />

procedure per memorizzare l’in<strong>di</strong>rizzo <strong>di</strong> ritorno.<br />

Il registro A7 ha un’ulteriore particolarità: esistono due<br />

registri A7 (uno per ogni modo operativo <strong>di</strong><br />

funzionamento):<br />

• lo stack pointer per il modo supervisor (SSP);<br />

• lo stack pointer per il modo user (USP);<br />

Registri special-purpose<br />

Il processore <strong>68000</strong> ha due registri special-purpose:<br />

• il program counter (PC);<br />

• il registro <strong>di</strong> stato (SR).<br />

Il program counter è un registro a 32 bit e contiene<br />

l’in<strong>di</strong>rizzo della prossima istruzione da eseguire. Poiché<br />

il processore <strong>di</strong>spone <strong>di</strong> soli 24 bit <strong>di</strong> in<strong>di</strong>rizzamento, i<br />

bit dal 24 al 31 non sono utilizzati nel <strong>68000</strong>.<br />

A partire dal 68020 i processori <strong>Motorola</strong> hanno uno<br />

spazio <strong>di</strong> in<strong>di</strong>rizzamento <strong>di</strong> 32 bit.<br />

M. Rebaudengo, M.Sonza Reorda I.10<br />

19<br />

20


Calcolatori Elettronici<br />

Registro <strong>di</strong> stato<br />

T S I 2 I 1 I 0 X N Z V C<br />

Il registro <strong>di</strong> stato SR è un registro a 16 bit ed è <strong>di</strong>viso in<br />

due campi logici:<br />

• gli 8 bit più significativi costituiscono il byte <strong>di</strong><br />

sistema e controllano il modo operativo del <strong>68000</strong>;<br />

• gli 8 bit meno significativi costituiscono il registro<br />

contente lo stato dei flag (chiamato registro <strong>di</strong><br />

con<strong>di</strong>zione del co<strong>di</strong>ce o CCR)<br />

Byte <strong>di</strong> sistema<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

È accessibile esclusivamente in modo supervisor e non può<br />

essere mo<strong>di</strong>ficato quando il <strong>68000</strong> è in modo utente.<br />

I suoi bit significativi sono 5:<br />

• T (il trace mode bit)<br />

• S (il bit <strong>di</strong> modo: utente o supervisore)<br />

• I0, I1 e I2 (i bit <strong>di</strong> mascheramento dell’interrupt).<br />

Il bit S specifica lo stato del processore: 0 per modo user, 1<br />

per modo supervisor.<br />

Il bit T settato (con valore 1) permette <strong>di</strong> far funzionare il<br />

processore in modalità single-step: al termine dell’esecuzione<br />

<strong>di</strong> ogni singola istruzione viene scatenata un’eccezione <strong>di</strong><br />

trace che permette <strong>di</strong> effettuare il debug sul programma.<br />

M. Rebaudengo, M.Sonza Reorda I.11<br />

21<br />

22


Calcolatori Elettronici<br />

Byte <strong>di</strong> sistema<br />

(cont.)<br />

I bit I0, I1 e I2 determinano il livello <strong>di</strong> mascheramento<br />

dell’interrupt. Se al processore arriva una richiesta <strong>di</strong><br />

interruzione esterna, si confronta il livello <strong>di</strong> interruzione<br />

con il valore memorizzato nella maschera <strong>di</strong> bit: se la<br />

priorità della richiesta pendente è minore od uguale <strong>alla</strong><br />

priorità memorizzata nella maschera, la richiesta <strong>di</strong><br />

interruzione rimane pendente, altrimenti viene servita.<br />

La richiesta <strong>di</strong> interruzione <strong>di</strong> livello 7 non è<br />

mascherabile ed è sempre servita in<strong>di</strong>pendentemente<br />

dal valore della maschera <strong>di</strong> interruzione.<br />

Registro CCR<br />

Il registro <strong>di</strong> con<strong>di</strong>zione del co<strong>di</strong>ce ( CCR) memorizza lo<br />

stato dei flag aggiornati dopo l’esecuzione <strong>di</strong> ciascuna<br />

operazione aritmetico-logica eseguita dal processore.<br />

I bit significativi del CCR sono 5:<br />

• V (il bit <strong>di</strong> overflow);<br />

• Z (il bit <strong>di</strong> zero);<br />

• N (il bit <strong>di</strong> segno);<br />

• C (il bit <strong>di</strong> carry);<br />

• X (il bit <strong>di</strong> estensione).<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.12<br />

23<br />

24


Calcolatori Elettronici<br />

Registro CCR<br />

(cont.)<br />

Il flag V vale 1 se il risultato <strong>di</strong> un’operazione aritmetica,<br />

interpretato in complemento a 2, dà un bit <strong>di</strong> segno<br />

scorretto.<br />

Il flag Z vale 1 se il risultato vale 0.<br />

Il flag N è una copia del bit più significativo del risultato.<br />

Il flag C rappresenta il riporto del bit più significativo<br />

dell’operando.<br />

Esempio<br />

L’istruzione ADD.B D0,D1 influisce solo sugli 8 bit<br />

meno significativi. L’eventuale riporto risultante è<br />

copiato nel flag <strong>di</strong> carry ed i bit da 8 a 31 rimangono<br />

inalterati.<br />

Registro CCR<br />

(cont.)<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

Il bit <strong>di</strong> estensione è molto simile al bit <strong>di</strong> carry. Nelle<br />

operazioni <strong>di</strong> ad<strong>di</strong>zione, sottrazione, negazione o shift il bit<br />

assume lo stesso valore e significato del bit <strong>di</strong> carry.<br />

Il bit X è stato aggiunto in altenativa al flag C, utilizzato<br />

come test flag (ad esempio per trasferire informazioni <strong>di</strong><br />

ritorno da una procedura).<br />

Il bit X viene aggiornato solo in corrispondenza <strong>di</strong> quelle<br />

operazioni aritmetiche che effettivamente determinano un<br />

riporto. Le istruzioni logiche, <strong>di</strong> confronto, moltiplicazione,<br />

<strong>di</strong>visione non mo<strong>di</strong>ficano il contenuto del bit X.<br />

M. Rebaudengo, M.Sonza Reorda I.13<br />

25<br />

26


Calcolatori Elettronici<br />

Mo<strong>di</strong> <strong>di</strong> in<strong>di</strong>rizzamento<br />

Il processore <strong>68000</strong> <strong>di</strong>spone <strong>di</strong> 14 <strong>di</strong>versi tipi <strong>di</strong><br />

in<strong>di</strong>rizzamento classificabili nei seguenti tipi base:<br />

• imme<strong>di</strong>ato<br />

• assoluto<br />

• registro <strong>di</strong>retto<br />

• registro in<strong>di</strong>retto<br />

• relativo al program counter<br />

• implicito.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

In<strong>di</strong>rizzamento in<strong>di</strong>retto attraverso registro<br />

Nel modo <strong>di</strong> in<strong>di</strong>rizzamento registro in<strong>di</strong>retto l’in<strong>di</strong>rizzo<br />

dell’operando è contenuto in un registro <strong>di</strong> in<strong>di</strong>rizzo.<br />

Il registro funziona da registro puntatore e può essere uno<br />

degli 8 registri <strong>di</strong> in<strong>di</strong>rizzo A0-A7.<br />

Esempi<br />

MOVE.L (A0), D3 copia nel registro D3 il contenuto della<br />

cella <strong>di</strong> memoria avente l’in<strong>di</strong>rizzo specificato nel registro A0.<br />

MOVE.W D4, (A6) copia la word memorizzata nel registro<br />

D4 a partire d<strong>alla</strong> locazione <strong>di</strong> memoria avente l’in<strong>di</strong>rizzo<br />

specificato nel registro A6.<br />

M. Rebaudengo, M.Sonza Reorda I.14<br />

27<br />

28


Calcolatori Elettronici<br />

In<strong>di</strong>rizzamento in<strong>di</strong>retto attraverso<br />

registro con incremento posticipato<br />

Il contenuto del registro <strong>di</strong> in<strong>di</strong>rizzo è incrementato <strong>di</strong> 1,<br />

2 o 4 unità dopo che l’istruzione è eseguita:<br />

• un’operazione tra byte causa un incremento <strong>di</strong> 1<br />

• un’operazione tra word causa un incremento <strong>di</strong> 2<br />

• un’operazione tra long word causa un incremento <strong>di</strong><br />

4.<br />

Esempi<br />

MOVE.L (A0)+,D3<br />

MOVE.W (A7)+,D4<br />

In<strong>di</strong>rizzamento in<strong>di</strong>retto attraverso<br />

registro con incremento posticipato<br />

(cont.)<br />

L’eccezione è data dal caso in cui il registro A7 sia usato<br />

con un operando <strong>di</strong> tipo byte: il valore del registro è<br />

post-incrementato <strong>di</strong> 2 unità anziché <strong>di</strong> 1 unità. In questo<br />

modo il registro stack-pointer punta sempre ad un<br />

in<strong>di</strong>rizzo pari.<br />

Esempio<br />

MOVE.B (A7)+,D4<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.15<br />

29<br />

30


Calcolatori Elettronici<br />

In<strong>di</strong>rizzamento in<strong>di</strong>retto attraverso<br />

registro con decremento anticipato<br />

Il contenuto del registro <strong>di</strong> in<strong>di</strong>rizzo specificato è<br />

decrementato prima dell’esecuzione dell’istruzione. Il<br />

registro <strong>di</strong> in<strong>di</strong>rizzo è decrementato <strong>di</strong> 4, 2 od 1 unità a<br />

seconda che il tipo dell’operando sia longword, word<br />

oppure byte, rispettivamente.<br />

Esempi<br />

MOVE.L -(A0),D3<br />

MOVE.W -(A7),D4<br />

Gestione <strong>di</strong> code LIFO<br />

Attraverso i mo<strong>di</strong> <strong>di</strong> decremento anticipato e incremento<br />

posticipato è possibile gestire facilmente code <strong>di</strong> tipo<br />

LIFO (user stack).<br />

Supponendo <strong>di</strong> voler realizzare uno stack che cresca<br />

con in<strong>di</strong>rizzi decrescenti l’operazione <strong>di</strong> PUSH è<br />

implementata eseguendo un’operazione <strong>di</strong><br />

predecremento e caricamento, mentre l’operazione <strong>di</strong><br />

PULL è eseguita attraverso un’operazione <strong>di</strong> lettura e <strong>di</strong><br />

postincremento.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.16<br />

31<br />

32


Calcolatori Elettronici<br />

Esempio<br />

Gestione <strong>di</strong> code LIFO<br />

(cont.)<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

La seguente istruzione esegue l’operazione <strong>di</strong> PUSH del<br />

contenuto del registro D0 nella coda puntata dal registro<br />

A4.<br />

MOVE.L D0, -(A4)<br />

La seguente istruzione esegue l’operazione opposta <strong>di</strong><br />

PULL d<strong>alla</strong> coda puntata dal registro A4 verso il registro<br />

<strong>di</strong> dato D0.<br />

MOVE.L (A4)+, D0<br />

Gestione <strong>di</strong> code LIFO<br />

(cont.)<br />

Analogamente per realizzare stack che crescano per<br />

in<strong>di</strong>rizzi <strong>di</strong> memoria crescenti le operazioni <strong>di</strong> PUSH<br />

vanno implementate eseguendo un’operazione <strong>di</strong><br />

caricamento e postincremento, mentre l’operazione <strong>di</strong><br />

PULL è eseguita attraverso un’operazione <strong>di</strong><br />

predecremento e <strong>di</strong> lettura.<br />

Esempi<br />

MOVE.L D0, (A4)+ push<br />

MOVE.L -(A4), D0 pull<br />

M. Rebaudengo, M.Sonza Reorda I.17<br />

33<br />

34


Calcolatori Elettronici<br />

Lo stack<br />

Lo stack <strong>di</strong> sistema è realizzato in modo che il registro<br />

A7 contenga l’in<strong>di</strong>rizzo dell’elemento in cima allo stack.<br />

Lo stack cresce per in<strong>di</strong>rizzi decrescenti della memoria.<br />

Le operazioni che possono essere effettuate nello stack<br />

sono:<br />

• operazione <strong>di</strong> push: prima viene decrementato il<br />

valore dello stack pointer <strong>di</strong> 2 unità e poi viene<br />

caricato il dato nello stack;<br />

• operazione <strong>di</strong> pull: un dato è scaricato dallo stack e<br />

lo stack pointer è incrementato <strong>di</strong> 2 unità.<br />

Esempio<br />

Lo stack<br />

(cont.)<br />

MOVE.W D0, -(A7) push nello stack della word<br />

bassa del registro D0<br />

MOVE.W (A7)+, D2 pull dallo stack e copia nel<br />

registro D2.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.18<br />

35<br />

36


Calcolatori Elettronici<br />

Insieme delle istruzioni<br />

L’insieme <strong>di</strong> istruzioni per il processore <strong>68000</strong><br />

comprende le seguenti famiglie <strong>di</strong> istruzioni:<br />

• movimento <strong>di</strong> dati;<br />

• operazioni aritmetiche;<br />

• operazioni logiche;<br />

• operazioni <strong>di</strong> scorrimento;<br />

• manipolazione <strong>di</strong> bit;<br />

• controllo del programma.<br />

Istruzioni per il movimento <strong>di</strong> dati<br />

Le istruzioni per il movimento <strong>di</strong> dati comprendono:<br />

• MOVE, MOVEA;<br />

• MOVEM, MOVEQ, MOVEP;<br />

• MOVE to SR, MOVE from SR, MOVE to CCR;<br />

• MOVE USP;<br />

• LEA;<br />

• PEA;<br />

• EXG<br />

• SWAP.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.19<br />

37<br />

38


Calcolatori Elettronici<br />

Istruzione MOVEA<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

L’istruzione MOVEA (MOVE Address) permette <strong>di</strong> scrivere un<br />

valore in un registro <strong>di</strong> in<strong>di</strong>rizzo. L’operando destinazione è<br />

sempre un registro <strong>di</strong> in<strong>di</strong>rizzo. Possono essere usati<br />

esclusivamente dati <strong>di</strong> tipo word o long word. Quando il dato è<br />

<strong>di</strong> tipo word, viene eseguita l’estensione a 32 bit del segno<br />

dell’operando sorgente prima <strong>di</strong> copiare il valore nel registro <strong>di</strong><br />

in<strong>di</strong>rizzo destinazione.<br />

L’istruzione MOVEA non mo<strong>di</strong>fica il contenuto dei flag nel<br />

registro CCR.<br />

Esempi<br />

MOVEA.L #9F00H, A2 copia il valore imme<strong>di</strong>ato 00009F00<br />

nel registro A2<br />

MOVEA.W #9F00H, A2 copia nel registro A2 il valore<br />

imme<strong>di</strong>ato FFFF9F00.<br />

Istruzione MOVEM<br />

L’istruzione MOVEM (MOVE Multiple registers) permette <strong>di</strong><br />

trasferire un gruppo <strong>di</strong> registri da o verso la memoria;<br />

opera solo con dati <strong>di</strong> tipo word o long word.<br />

L’effetto <strong>di</strong> un’istruzione MOVEM è <strong>di</strong> trasferire i contenuti<br />

<strong>di</strong> una lista <strong>di</strong> registri a locazioni <strong>di</strong> memoria<br />

consecutive o <strong>di</strong> scrivere in una lista <strong>di</strong> registri il<br />

contenuto <strong>di</strong> locazioni consecutive <strong>di</strong> memoria.<br />

Il contenuto del registro CCR non è mo<strong>di</strong>ficato<br />

dall’esecuzione dell’istruzione MOVEM.<br />

M. Rebaudengo, M.Sonza Reorda I.20<br />

39<br />

40


Calcolatori Elettronici<br />

Istruzione MOVEM<br />

(cont.)<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

La lista <strong>di</strong> registri è specificata attraverso la notazione Di-Dj/Ap-<br />

Aq. Ad esempio la notazione A0-A4/D3-D7 specifica i registri <strong>di</strong><br />

in<strong>di</strong>rizzo A0, A1, A2, A3 ed i registri <strong>di</strong> dato D3, D4, D5, D6 e D7.<br />

Normalmente i programmatori usano questa istruzione per salvare<br />

i registri <strong>di</strong> lavoro all’ingresso <strong>di</strong> una procedura e per ripristinare il<br />

loro valore originario all’uscita della procedura stessa.<br />

Esempi<br />

MOVEM.L D0-D7/A0-A6,-(A7) salva nello stack il contenuto<br />

<strong>di</strong> tutti i registri <strong>di</strong> dato e dei registri <strong>di</strong> in<strong>di</strong>rizzo tranne A7.<br />

MOVEM.L (A7)+,D0-D7/A0-A6 ripristina il contenuto dei<br />

registri <strong>di</strong> dato e dei registri <strong>di</strong> in<strong>di</strong>rizzo (tranne A7), prelevandoli<br />

dallo stack.<br />

Istruzione MOVEP<br />

L’istruzione MOVEP (MOVE Peripheral data) permette <strong>di</strong><br />

copiare parole <strong>di</strong> word o long word tra un registro <strong>di</strong> dato<br />

ed un <strong>di</strong>spositivo periferico ad 8 bit mappato in memoria. I<br />

<strong>di</strong>spositivi periferici sono collegati al data-bus in modo<br />

che byte consecutivi sui periferici sono mappati nello<br />

spazio <strong>di</strong> in<strong>di</strong>rizzamento della memoria ad in<strong>di</strong>rizzi pari (o<br />

<strong>di</strong>spari) consecutivi: l’istruzione MOVEP esegue accessi in<br />

memoria a gruppi <strong>di</strong> due locazioni <strong>alla</strong> volta: se l’operando<br />

destinazione ha un in<strong>di</strong>rizzo pari, viene fatto accesso solo<br />

ad in<strong>di</strong>rizzi pari.<br />

L’istruzione MOVEP esegue esclusivamente il trasferimento<br />

<strong>di</strong> dati <strong>di</strong> tipo word o long word; i flag del registro CCR non<br />

sono mo<strong>di</strong>ficati dall’istruzione.<br />

M. Rebaudengo, M.Sonza Reorda I.21<br />

41<br />

42


Calcolatori Elettronici<br />

Istruzione MOVEP<br />

(cont.)<br />

L’operando che in<strong>di</strong>ca gli in<strong>di</strong>rizzi dei registri del<br />

<strong>di</strong>spositivo periferico può essere specificato<br />

esclusivamente attraverso un in<strong>di</strong>rizzamento <strong>di</strong> tipo<br />

registro in<strong>di</strong>retto con spiazzamento.<br />

In una istruzione <strong>di</strong> trasferimento da un registro <strong>di</strong> dato<br />

ad un <strong>di</strong>spositivo periferico il byte più significativo del<br />

registro è copiato per primo all’in<strong>di</strong>rizzo minore, mentre<br />

il byte meno significativo è copiato per ultimo<br />

all’in<strong>di</strong>rizzo maggiore in memoria.<br />

Esempi<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

MOVEP.L D2, 0(A0) copia i 4 byte contenuti nel<br />

registro D2 negli in<strong>di</strong>rizzi [A0+0], [A0+2], [A0+4] e [A0+6].<br />

In particolare copia il byte più significativo all’in<strong>di</strong>rizzo<br />

[A0+0] ed il byte meno significativo all’in<strong>di</strong>rizzo [ A0+6].<br />

Istruzione MOVE to CCR<br />

L’istruzione MOVE to CCR copia un dato nel registro<br />

CCR. Tale istruzione esegue un’operazione su dati <strong>di</strong> tipo<br />

word. L’istruzione MOVE , CCR copia il byte meno<br />

significativo dell’operando sorgente nel registro CCR; il<br />

byte più significativo è ignorato.<br />

Questa istruzione permette <strong>di</strong> pre-caricare il registro<br />

CCR.<br />

M. Rebaudengo, M.Sonza Reorda I.22<br />

43<br />

44


Calcolatori Elettronici<br />

Istruzione MOVE to SR e<br />

MOVE from SR<br />

Permettono <strong>di</strong> eseguire operazioni <strong>di</strong> lettura e scrittura<br />

sul registro <strong>di</strong> stato SR. L’istruzione MOVE to SR copia<br />

una word nel registro SR; tale istruzione è privilegiata e<br />

può essere eseguita solo quando il processore opera in<br />

supervisor mode.<br />

L’istruzione MOVE from SR permette <strong>di</strong> leggere il<br />

contenuto del registro SR. Questa istruzione è<br />

privilegiata per il processore 68010, ma non per il <strong>68000</strong>.<br />

In generale queste istruzioni sono utilizzate da chi scrive<br />

sistemi operativi e non sono utilizzate dai<br />

programmatori che scrivono programmi applicativi.<br />

Istruzione MOVE USP<br />

Come è già stato accennato precedentemente il <strong>68000</strong><br />

<strong>di</strong>spone <strong>di</strong> due registri A7: uno associato al modo utente<br />

e chiamato USP (user stack pointer) ed uno associato al<br />

modo supervisore e chiamato SSP (supervisor stack<br />

pointer).<br />

Quando il processore lavora in modo supervisore è<br />

possibile accedere al registro USP attraverso le istruzioni<br />

MOVE.L USP,An e MOVE.L An,USP.<br />

Quando il <strong>68000</strong> lavora in modo utente il registro SSP è<br />

completamente nascosto all’utente.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.23<br />

45<br />

46


Calcolatori Elettronici<br />

Istruzioni aritmetiche<br />

Le istruzioni aritmetiche comprendono:<br />

• ADD, ADDA, ADDQ, ADDI, ADDX;<br />

• SUB, SUBA, SUBQ, SUBI, SUBX;<br />

• DIVS, DIVU;<br />

• MULS, MULU;<br />

• CLR;<br />

• NEG, NEGX;<br />

• EXT;<br />

• ABCD, NBCD, SBCD.<br />

Istruzioni logiche<br />

Le istruzioni logiche comprendono:<br />

• AND, ADDI;<br />

• OR, ORI;<br />

• EOR, EORI;<br />

• NOT.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.24<br />

47<br />

48


Calcolatori Elettronici<br />

Istruzioni <strong>di</strong> scorrimento<br />

Le istruzioni <strong>di</strong> scorrimento comprendono:<br />

• LSL, LSR;<br />

• ASL, ASR;<br />

• ROL, ROR, ROXL, ROXR.<br />

Istruzioni <strong>di</strong> manipolazione dei bit<br />

Le istruzioni <strong>di</strong> manipolazione dei bit comprendono:<br />

• BTST;<br />

• BSET;<br />

• BCLR;<br />

• BCHG.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.25<br />

49<br />

50


Calcolatori Elettronici<br />

Istruzioni <strong>di</strong> manipolazione dei bit<br />

(cont.)<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

Le istruzioni <strong>di</strong> manipolazione dei bit agiscono su uno<br />

specifico bit <strong>di</strong> un operando. Il bit manipolato viene<br />

copiato complementato nel flag Z. Gli altri flag non sono<br />

mo<strong>di</strong>ficati da queste istruzioni.<br />

Le istruzioni <strong>di</strong> manipolazione dei bit possono essere<br />

applicate esclusivamente a:<br />

• locazioni <strong>di</strong> memoria <strong>di</strong> tipo byte;<br />

• registri <strong>di</strong> dato su 32 bit.<br />

La posizione del bit da manipolare può essere specificata<br />

attraverso un:<br />

• in<strong>di</strong>rizzamento imme<strong>di</strong>ato;<br />

• registro <strong>di</strong> dato.<br />

Istruzione BTST<br />

L’istruzione BTST (TeST a Bit) controlla un bit specifico<br />

<strong>di</strong> un operando. Se il bit vale zero il flag Z viene settato,<br />

altrimenti viene azzerato.<br />

L’istruzione BTST non mo<strong>di</strong>fica il valore dell’operando.<br />

Esempio<br />

BTST #5,D5 esegue un test del bit in posizione 5<br />

del contenuto del registro D5.<br />

M. Rebaudengo, M.Sonza Reorda I.26<br />

51<br />

52


Calcolatori Elettronici<br />

Istruzione BSET<br />

L’istruzione BSET (test a Bit and SET) aggiorna il flag Z<br />

in base al valore del bit specificato ( test) e forza ad uno<br />

il bit specificato ( set).<br />

Esempio<br />

BSET #2,(A3) esegue un test del bit in posizione<br />

2 della locazione <strong>di</strong> memoria in<strong>di</strong>rizzata dal registro A3 e<br />

quin<strong>di</strong> un suo set.<br />

Istruzione BCLR<br />

L’istruzione BCLR (test a Bit and CLeaR) aggiorna il flag<br />

Z in base al valore del bit specificato ( test) ed azzera il<br />

bit specificato ( clear).<br />

Esempio<br />

Supponendo che il registro D6 contenga, all’atto<br />

dell’esecuzione dell’istruzione corrente, il valore 12, il bit<br />

all’interno del registro D7 avente posizione 12 viene<br />

testato e quin<strong>di</strong> azzerato.<br />

BCLR D6, D7<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.27<br />

53<br />

54


Calcolatori Elettronici<br />

Istruzione BCHG<br />

L’istruzione BCHG (test a Bit and CHanGe) aggiorna il<br />

flag Z in base al valore del bit specificato ( test) e<br />

complementa il bit specificato ( change).<br />

Esempio<br />

BCHG #6,D5 esegue il test del bit 6 del registro D5<br />

e la sua complementazione.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

Istruzioni per il controllo del programma<br />

All’interno dell’insieme <strong>di</strong> istruzioni per il controllo del<br />

programma si <strong>di</strong>stinguono le seguenti classi <strong>di</strong><br />

istruzioni:<br />

• confronto;<br />

• salto;<br />

• gestione delle procedure;<br />

• attivazione <strong>di</strong> un’eccezione;<br />

• controllo <strong>di</strong> sistema;<br />

• altre.<br />

M. Rebaudengo, M.Sonza Reorda I.28<br />

55<br />

56


Calcolatori Elettronici<br />

Istruzioni <strong>di</strong> confronto<br />

L’insieme delle istruzioni <strong>di</strong> confronto comprende:<br />

• CMP;<br />

• CMPA;<br />

• CMPI;<br />

• CMPM.<br />

Istruzioni <strong>di</strong> salto<br />

L’insieme delle istruzioni <strong>di</strong> salto comprende:<br />

• Bcc;<br />

• BRA;<br />

• JMP;<br />

• DBcc.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.29<br />

57<br />

58


Calcolatori Elettronici<br />

Istruzioni per la gestione delle<br />

procedure<br />

L’insieme delle istruzioni per la gestione delle procedure<br />

è composto da:<br />

• JSR;<br />

• BSR;<br />

• RTS;<br />

• RTR;<br />

• LINK;<br />

• UNLK.<br />

Istruzioni LINK e UNLK<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

Lo stack frame può essere facilmente gestito da una<br />

coppia complementare <strong>di</strong> istruzioni: LINK (LINK and<br />

allocate) e UNLK (UNLinK).<br />

Per poter effettuare chiamate annidate <strong>di</strong> procedure,<br />

ogni volta che una procedura è chiamata deve essere<br />

riservato un nuovo stack frame.<br />

L’istruzione LINK crea uno stack frame <strong>di</strong> <strong>di</strong>mensione<br />

stabilita ed inizializza un registro <strong>di</strong> in<strong>di</strong>rizzo in modo da<br />

puntare allo stack frame corrente.<br />

M. Rebaudengo, M.Sonza Reorda I.30<br />

59<br />

60


Calcolatori Elettronici<br />

Esempio<br />

Istruzioni LINK e UNLK<br />

(cont.)<br />

LINK A1,#-64 alloca uno stack frame <strong>di</strong> 64 byte e<br />

utilizza il registro A1 per puntare all’inizio dell’area dati<br />

locale, eseguendo le seguenti operazioni elementari:<br />

LINK: [SP]


Calcolatori Elettronici<br />

Esempio<br />

Istruzioni LINK e UNLK<br />

(cont.)<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

Il seguente frammento <strong>di</strong> co<strong>di</strong>ce riporta le istruzioni<br />

necessarie per eseguire il salvataggio dei registri <strong>di</strong> lavoro<br />

e l’allocazione <strong>di</strong> uno stack frame al momento dell’inizio <strong>di</strong><br />

una procedura e le complementari operazioni <strong>di</strong><br />

<strong>di</strong>sallocazione e ripristino dei registri per il ritorno al<br />

programma chiamante.<br />

MOVEM.L D0-D7/A3-A6,-(SP)<br />

LINK A1,#-64<br />

...<br />

UNLK A1<br />

MOVEM.L (SP)+,D0-D7/A3-A6<br />

RTS<br />

Istruzioni LINK e UNLK<br />

(cont.)<br />

SP<br />

Stack frame<br />

Vecchio A1<br />

Registri salvati<br />

In<strong>di</strong>rizzo <strong>di</strong> ritorno<br />

M. Rebaudengo, M.Sonza Reorda I.32<br />

63<br />

64


Calcolatori Elettronici<br />

Istruzioni che generano trap<br />

Il processore <strong>68000</strong> fornisce alcune istruzioni usate per<br />

generare delle eccezioni:<br />

• ILLEGAL;<br />

• CHK;<br />

• TRAP;<br />

• TRAPV.<br />

Istruzione ILLEGAL<br />

L’istruzione ILLEGAL (ILLEGAL instruction) provoca<br />

l’esecuzione <strong>di</strong> un’eccezione.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.33<br />

65<br />

66


Calcolatori Elettronici<br />

Istruzione CHK<br />

L’istruzione CHK (CHecK register against bounds) è<br />

usata per confrontare un registro <strong>di</strong> dato (operando<br />

destinazione) ed un intervallo <strong>di</strong> valori compreso tra 0 ed<br />

un limite superiore specificato in complemento a 2<br />

(operando sorgente).<br />

Un’eccezione è eseguita se il registro <strong>di</strong> dato contiene<br />

un valore inferiore a 0 oppure maggiore del limite<br />

superiore.<br />

Possono essere confrontate solo parole <strong>di</strong> tipo word.<br />

Istruzione TRAP<br />

L’istruzione TRAP (TRAP) permette <strong>di</strong> scatenare<br />

un’eccezione <strong>di</strong> trap.<br />

Il formato dell’istruzione è TRAP #n, dove n è un<br />

numero compreso tra 0 e 15.<br />

L’istruzione TRAP scatena la trap avente numero<br />

d’or<strong>di</strong>ne n all’interno della tabella degli in<strong>di</strong>rizzi del<br />

vettore delle eccezioni.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.34<br />

67<br />

68


Calcolatori Elettronici<br />

Istruzione TRAPV<br />

L’istruzione TRAPV (TRAP on oVerflow) esegue il<br />

processamento <strong>di</strong> un’eccezione solo se il flag <strong>di</strong><br />

overflow è settato.<br />

Istruzioni <strong>di</strong> controllo <strong>di</strong> sistema<br />

Le istruzioni <strong>di</strong> controllo <strong>di</strong> sistema sono usate per<br />

eseguire operazioni privilegiate (valide solo per il modo<br />

supervisor):<br />

• MOVE to SR, MOVE from SR, MOVE USP;<br />

• ANDI SR, ORI SR, EORI SR ;<br />

• RESET;<br />

• STOP;<br />

• RTE.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.35<br />

69<br />

70


Calcolatori Elettronici<br />

Istruzione RESET<br />

L’istruzione RESET (RESET external devices) causa<br />

l’attivazione della linea esterna <strong>di</strong> RESET.<br />

La linea <strong>di</strong> RESET è normalmente connessa con<br />

<strong>di</strong>spositivi esterni, questa istruzione permette dunque al<br />

programmatore <strong>di</strong> resettare via software la circuiteria<br />

esterna al processore.<br />

Istruzione STOP<br />

L’istruzione STOP (load status register and STOP) causa<br />

l’interruzione dell’esecuzione del processore.<br />

Il formato dell’istruzione è STOP #n, dove n è un numero<br />

su 16 bit.<br />

Il processore carica il registro <strong>di</strong> stato con il valore<br />

imme<strong>di</strong>ato n ed interrompe l’esecuzione delle operazioni<br />

entrando nello stato <strong>di</strong> stop.<br />

Il processore esce dallo stato <strong>di</strong> stop solo quando<br />

accade un evento <strong>di</strong> trace, <strong>di</strong> interrupt o <strong>di</strong> reset.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.36<br />

71<br />

72


Calcolatori Elettronici<br />

Istruzione RTE<br />

L’istruzione RTE (ReTurn from Exception) è l’istruzione<br />

<strong>di</strong> ritorno da una routine <strong>di</strong> gestione delle eccezioni.<br />

Essa ripristina il valore che il registro <strong>di</strong> stato ed il<br />

program counter avevano al momento dell’esecuzione<br />

dell’eccezione.<br />

Miscellanea <strong>di</strong> istruzioni<br />

L’insieme <strong>di</strong> istruzioni per il processore <strong>68000</strong><br />

comprende infine le seguenti:<br />

• Scc;<br />

• NOP;<br />

• TAS;<br />

• TST.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.37<br />

73<br />

74


Calcolatori Elettronici<br />

Istruzione TAS<br />

L’istruzione TAS (Test And Set an operand) esegue un<br />

test sugli 8 bit meno significativi dell’operando. Tutti i<br />

flag <strong>di</strong> con<strong>di</strong>zione sono aggiornati, tranne il flag X.<br />

Il bit 7 dell’operando è settato. Sono ammessi solo<br />

operan<strong>di</strong> <strong>di</strong> tipo byte.<br />

<strong>Introduzione</strong> <strong>alla</strong> <strong>famiglia</strong> <strong>68000</strong><br />

M. Rebaudengo, M.Sonza Reorda I.38<br />

75

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!