Introduzione alla famiglia Motorola 68000 - Quelli di Informatica
Introduzione alla famiglia Motorola 68000 - Quelli di Informatica
Introduzione alla famiglia Motorola 68000 - Quelli di Informatica
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