Calcolatori Elettronici Introduzione alla famiglia 68000 Introduzione alla famiglia Motorola 68000 Maurizio Rebaudengo Matteo Sonza Reorda Politecnico di Torino Dipartimento di Automatica e Informatica Sommario • Storia • Introduzione • Registri interni • Modi di indirizzamento • Instruction set 2 M. Rebaudengo, M.Sonza Reorda I.1 Calcolatori Elettronici Introduzione alla famiglia 68000 Storia Motorola ha introdotto il suo primo microprocessore ad 8 bit nel 1974 ( MC6800). Nel 1979 esce sul mercato il microprocessore a 16/32 bit MC68000 (non compatibile a livelli s/w rispetto al 6800). Questi due microprocessori diedero origine a due famiglie distinte di microprocessori Motorola. 3 Famiglia 6800 A partire dal 6800 i microprocessori e microcontrollori ad 8 bit prodotti da Motorola sono: • 6502 • 6802 • 6805 • 6809 • serie HC11 • serie HC16 4 M. Rebaudengo, M.Sonza Reorda I.2 Calcolatori Elettronici Introduzione alla famiglia 68000 Famiglia 68000 A partire dal 68000 i microprocessori a 16/32 bit prodotti da Motorola sono: • 68010 • 68020 • 68030 • 68040 • 68060 • serie 68300 5 Caratteristiche generali del microprocessore 68000 • chip a 64 pin • processore CISC • 8 registri di dato general-purpose a 32 bit • 8 registri di indirizzo general-purpose a 32 bit • data bus a 16 bit • spazio di indirizzamento di 16Mbyte • I/O di tipo memory mapped • 2 livelli di privilegio: User e Supervisor • bus di dati e di indirizzo non multiplexati • 7 livelli di interruzioni esterne. 6 M. Rebaudengo, M.Sonza Reorda I.3 Calcolatori Elettronici Introduzione alla famiglia 68000 Organizzazione dei dati I registri dato ed indirizzo hanno un parallelismo di 32 bit, ma è possibile lavorare con parole aventi un numero di bit inferiore. Le istruzioni possono operare con parole di 32, 16, 8 oppure 1 bit. I tipi di dato ammessi sono: • byte: 8 bit • word: 16 bit • long word: 32 bit. 7 Organizzazione dei dati (cont.) L’assembler 68000 permette di specificare il tipo di dato a cui si sta facendo riferimento, aggiungendo un suffisso allo mnemonico del’istruzione: • .B per dati di tipo byte • .W per dati di tipo word • .L per dati di tipo long. Esempio: MOVE.W DO, D1 8 M. Rebaudengo, M.Sonza Reorda I.4 Calcolatori Elettronici Introduzione alla famiglia 68000 Organizzazione dei dati (cont.) Quando il processore lavora con un dato memorizzato in un registro ed il tipo di dato è inferiore a 32 bit, viene utilizzata esclusivamente la parte meno significativa del registro. Operazioni sulla parte meno significativa del registro non influiscono sui restanti bit. 9 Organizzazione dei dati (cont.) Esempio: ADD.B non cambia il contenuto D0, D1 D0 F1 + D1 22 = D1 13 X N Z V C 1 0 0 0 1 CCR M. Rebaudengo, M.Sonza Reorda 10 I.5 Calcolatori Elettronici Introduzione alla famiglia 68000 Memorizzazione dei dati La regola per ogni tipo di dato è la seguente: • il byte più significativo è memorizzato all’indirizzo pari inferiore e ad indirizzi successivi vengono memorizzati i byte via via meno significativi. 11 Memorizzazione dei dati (cont.) Esempio all’indirizzo xx0000 è memorizzata la word B52D; all’indirizzo xx0002 è memorizzata la long word A756CF00. 0000 0002 0004 0006 B5 A7 CF 2D 56 00 0001 0003 0005 0007 12 M. Rebaudengo, M.Sonza Reorda I.6 Calcolatori Elettronici Introduzione alla famiglia 68000 Questo tipo di convenzione prende il nome di big endian, per distinguerla dalla convenzione Intel chiamata little endian. I Lillipuziani (in I viaggi di Gulliver) litigavano animosamente perché non erano d’accordo sul modo di rompere le uova, 2 erano i partiti avversi: quello dell’estremità grande ( big end) e quello dell’estremità piccola ( little end)... 13 Registri utente Il processore 68000 possiede i seguenti registri: • 8 registri di dato a 32 bit ( D0-D7) • 7 registri di indirizzo a 32 bit ( A0-A6) • 1 registro di stack per il modo user (A7 o USP) • 1 registro di stack per il modo supervisor (A7 o SSP) • 1 registro program counter (PC) • 1 registro di stato per il modo utente (CCR) • 1 registro di stato per il modo supervisor (SR) 14 M. Rebaudengo, M.Sonza Reorda I.7 Calcolatori Elettronici Introduzione alla famiglia 68000 Modo User 31 16 15 8 7 31 0 16 15 0 D0 D0 Address Registers Data Registers A6 D7 7 program counter PC A7 User stack pointer (USP) 0 User Condition Code Register CCR 15 Modo Supervisor 31 16 15 8 7 0 31 16 15 0 D0 D0 Address Registers Data Registers A6 D7 15 program counter PC A7 Supervisor stack pointer (SSP) 8 7 System 0 User SR Status Register 16 M. Rebaudengo, M.Sonza Reorda I.8 Calcolatori Elettronici Introduzione alla famiglia 68000 Registri di dato Il processore dispone di 8 registri di dato a 32 bit. I registri sono di tipo general-purpose, nel senso che ciascuna operazione permessa sul generico registro Di è permessa anche sul registro Dj. È possibile accedere al registro utilizzando esclusivamente la parte meno significativa del registro (byte o word). Tali operazioni sono specificate all’interno dell’istruzione assembler. 17 Registri di indirizzo Il processore 68000 ha 8 registri di indirizzo. Questi registri sono registri puntatore e memorizzano indirizzi di dati in memoria. I registri di indirizzo sono costituiti da 32 bit e le operazioni fatte su di essi riguardano l’intera parola da 32 bit. Per i registri di indirizzo valgono le seguenti regole: • operazioni fatte sul byte dal bit 0 al bit 7 non sono permesse; • un’operazione sulla word meno significativa ha influenza su tutti e 32 i bit: se la word meno significativa di un registro è caricata con un operando a 16 bit, il bit di segno dell’operando è esteso dal bit 16 al bit 31 della word più significativa. 18 M. Rebaudengo, M.Sonza Reorda I.9 Calcolatori Elettronici Introduzione alla famiglia 68000 Registro A7 Come nel caso dei registri di dato, un’operazione fatta sul registro Ai può essere ugualmente fatta sul registro Aj. C’è un’eccezione: il registro A7 è un registro di indirizzo special-purpose e funziona come stack pointer usato dalle procedure per memorizzare l’indirizzo di ritorno. Il registro A7 ha un’ulteriore particolarità: esistono due registri A7 (uno per ogni modo operativo di funzionamento): • lo stack pointer per il modo supervisor (SSP); • lo stack pointer per il modo user (USP); 19 Registri special-purpose Il processore 68000 ha due registri special-purpose: • il program counter (PC); • il registro di stato (SR). Il program counter è un registro a 32 bit e contiene l’indirizzo della prossima istruzione da eseguire. Poiché il processore dispone di soli 24 bit di indirizzamento, i bit dal 24 al 31 non sono utilizzati nel 68000. A partire dal 68020 i processori Motorola hanno uno spazio di indirizzamento di 32 bit. 20 M. Rebaudengo, M.Sonza Reorda I.10 Calcolatori Elettronici Introduzione alla famiglia 68000 Registro di stato T S I2 I1 I0 X N Z V C Il registro di stato SR è un registro a 16 bit ed è diviso in due campi logici: • gli 8 bit più significativi costituiscono il byte di sistema e controllano il modo operativo del 68000; • gli 8 bit meno significativi costituiscono il registro contente lo stato dei flag (chiamato registro di condizione del codice o CCR) 21 Byte di sistema È accessibile esclusivamente in modo supervisor e non può essere modificato quando il 68000 è in modo utente. I suoi bit significativi sono 5: • T (il trace mode bit) • S (il bit di modo: utente o supervisore) • I0, I1 e I2 (i bit di mascheramento dell’interrupt). Il bit S specifica lo stato del processore: 0 per modo user, 1 per modo supervisor. Il bit T settato (con valore 1) permette di far funzionare il processore in modalità single-step: al termine dell’esecuzione di ogni singola istruzione viene scatenata un’eccezione di trace che permette di effettuare il debug sul programma. 22 M. Rebaudengo, M.Sonza Reorda I.11 Calcolatori Elettronici Introduzione alla famiglia 68000 Byte di sistema (cont.) I bit I0, I1 e I2 determinano il livello di mascheramento dell’interrupt. Se al processore arriva una richiesta di interruzione esterna, si confronta il livello di interruzione con il valore memorizzato nella maschera di bit: se la priorità della richiesta pendente è minore od uguale alla priorità memorizzata nella maschera, la richiesta di interruzione rimane pendente, altrimenti viene servita. La richiesta di interruzione di livello 7 non è mascherabile ed è sempre servita indipendentemente dal valore della maschera di interruzione. 23 Registro CCR Il registro di condizione del codice ( CCR) memorizza lo stato dei flag aggiornati dopo l’esecuzione di ciascuna operazione aritmetico-logica eseguita dal processore. I bit significativi del CCR sono 5: • V (il bit di overflow); • Z (il bit di zero); • N (il bit di segno); • C (il bit di carry); • X (il bit di estensione). 24 M. Rebaudengo, M.Sonza Reorda I.12 Calcolatori Elettronici Introduzione alla famiglia 68000 Registro CCR (cont.) Il flag V vale 1 se il risultato di un’operazione aritmetica, interpretato in complemento a 2, dà un bit di segno scorretto. Il flag Z vale 1 se il risultato vale 0. Il flag N è una copia del bit più significativo del risultato. Il flag C rappresenta il riporto del bit più significativo dell’operando. Esempio L’istruzione ADD.B D0,D1 influisce solo sugli 8 bit meno significativi. L’eventuale riporto risultante è copiato nel flag di carry ed i bit da 8 a 31 rimangono inalterati. 25 Registro CCR (cont.) Il bit di estensione è molto simile al bit di carry. Nelle operazioni di addizione, sottrazione, negazione o shift il bit assume lo stesso valore e significato del bit di carry. Il bit X è stato aggiunto in altenativa al flag C, utilizzato come test flag (ad esempio per trasferire informazioni di ritorno da una procedura). Il bit X viene aggiornato solo in corrispondenza di quelle operazioni aritmetiche che effettivamente determinano un riporto. Le istruzioni logiche, di confronto, moltiplicazione, divisione non modificano il contenuto del bit X. 26 M. Rebaudengo, M.Sonza Reorda I.13 Calcolatori Elettronici Introduzione alla famiglia 68000 Modi di indirizzamento Il processore 68000 dispone di 14 diversi tipi di indirizzamento classificabili nei seguenti tipi base: • immediato • assoluto • registro diretto • registro indiretto • relativo al program counter • implicito. 27 Indirizzamento indiretto attraverso registro Nel modo di indirizzamento registro indiretto l’indirizzo dell’operando è contenuto in un registro di indirizzo. Il registro funziona da registro puntatore e può essere uno degli 8 registri di indirizzo A0-A7. Esempi MOVE.L (A0), D3 copia nel registro D3 il contenuto della cella di memoria avente l’indirizzo specificato nel registro A0. MOVE.W D4, (A6) copia la word memorizzata nel registro D4 a partire dalla locazione di memoria avente l’indirizzo specificato nel registro A6. 28 M. Rebaudengo, M.Sonza Reorda I.14 Calcolatori Elettronici Introduzione alla famiglia 68000 Indirizzamento indiretto attraverso registro con incremento posticipato Il contenuto del registro di indirizzo è incrementato di 1, 2 o 4 unità dopo che l’istruzione è eseguita: • un’operazione tra byte causa un incremento di 1 • un’operazione tra word causa un incremento di 2 • un’operazione tra long word causa un incremento di 4. Esempi MOVE.L (A0)+,D3 MOVE.W (A7)+,D4 29 Indirizzamento indiretto attraverso registro con incremento posticipato (cont.) L’eccezione è data dal caso in cui il registro A7 sia usato con un operando di tipo byte: il valore del registro è post-incrementato di 2 unità anziché di 1 unità. In questo modo il registro stack-pointer punta sempre ad un indirizzo pari. Esempio MOVE.B (A7)+,D4 30 M. Rebaudengo, M.Sonza Reorda I.15 Calcolatori Elettronici Introduzione alla famiglia 68000 Indirizzamento indiretto attraverso registro con decremento anticipato Il contenuto del registro di indirizzo specificato è decrementato prima dell’esecuzione dell’istruzione. Il registro di indirizzo è decrementato di 4, 2 od 1 unità a seconda che il tipo dell’operando sia longword, word oppure byte, rispettivamente. Esempi MOVE.L -(A0),D3 MOVE.W -(A7),D4 31 Gestione di code LIFO Attraverso i modi di decremento anticipato e incremento posticipato è possibile gestire facilmente code di tipo LIFO (user stack). Supponendo di voler realizzare uno stack che cresca con indirizzi decrescenti l’operazione di PUSH è implementata eseguendo un’operazione di predecremento e caricamento, mentre l’operazione di PULL è eseguita attraverso un’operazione di lettura e di postincremento. 32 M. Rebaudengo, M.Sonza Reorda I.16 Calcolatori Elettronici Introduzione alla famiglia 68000 Gestione di code LIFO (cont.) Esempio La seguente istruzione esegue l’operazione di PUSH del contenuto del registro D0 nella coda puntata dal registro A4. MOVE.L D0, -(A4) La seguente istruzione esegue l’operazione opposta di PULL dalla coda puntata dal registro A4 verso il registro di dato D0. MOVE.L (A4)+, D0 33 Gestione di code LIFO (cont.) Analogamente per realizzare stack che crescano per indirizzi di memoria crescenti le operazioni di PUSH vanno implementate eseguendo un’operazione di caricamento e postincremento, mentre l’operazione di PULL è eseguita attraverso un’operazione di predecremento e di lettura. Esempi MOVE.L D0, (A4)+ push MOVE.L -(A4), D0 pull 34 M. Rebaudengo, M.Sonza Reorda I.17 Calcolatori Elettronici Introduzione alla famiglia 68000 Lo stack Lo stack di sistema è realizzato in modo che il registro A7 contenga l’indirizzo dell’elemento in cima allo stack. Lo stack cresce per indirizzi decrescenti della memoria. Le operazioni che possono essere effettuate nello stack sono: • operazione di push: prima viene decrementato il valore dello stack pointer di 2 unità e poi viene caricato il dato nello stack; • operazione di pull: un dato è scaricato dallo stack e lo stack pointer è incrementato di 2 unità. 35 Lo stack (cont.) Esempio MOVE.W D0, -(A7) bassa del registro D0 push nello stack della word MOVE.W (A7)+, D2 registro D2. pull dallo stack e copia nel 36 M. Rebaudengo, M.Sonza Reorda I.18 Calcolatori Elettronici Introduzione alla famiglia 68000 Insieme delle istruzioni L’insieme di istruzioni per il processore 68000 comprende le seguenti famiglie di istruzioni: • movimento di dati; • operazioni aritmetiche; • operazioni logiche; • operazioni di scorrimento; • manipolazione di bit; • controllo del programma. 37 Istruzioni per il movimento di dati Le istruzioni per il movimento di dati comprendono: • MOVE, MOVEA; • MOVEM, MOVEQ, MOVEP; • MOVE to SR, MOVE from SR, MOVE to CCR; • MOVE USP; • LEA; • PEA; • EXG • SWAP. 38 M. Rebaudengo, M.Sonza Reorda I.19 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione MOVEA L’istruzione MOVEA (MOVE Address) permette di scrivere un valore in un registro di indirizzo. L’operando destinazione è sempre un registro di indirizzo. Possono essere usati esclusivamente dati di tipo word o long word. Quando il dato è di tipo word, viene eseguita l’estensione a 32 bit del segno dell’operando sorgente prima di copiare il valore nel registro di indirizzo destinazione. L’istruzione MOVEA non modifica il contenuto dei flag nel registro CCR. Esempi MOVEA.L #9F00H, A2 copia il valore immediato 00009F00 nel registro A2 MOVEA.W #9F00H, A2 copia nel registro A2 il valore immediato FFFF9F00. 39 Istruzione MOVEM L’istruzione MOVEM (MOVE Multiple registers) permette di trasferire un gruppo di registri da o verso la memoria; opera solo con dati di tipo word o long word. L’effetto di un’istruzione MOVEM è di trasferire i contenuti di una lista di registri a locazioni di memoria consecutive o di scrivere in una lista di registri il contenuto di locazioni consecutive di memoria. Il contenuto del registro CCR non è modificato dall’esecuzione dell’istruzione MOVEM. 40 M. Rebaudengo, M.Sonza Reorda I.20 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione MOVEM (cont.) La lista di registri è specificata attraverso la notazione Di-Dj/ApAq. Ad esempio la notazione A0-A4/D3-D7 specifica i registri di indirizzo A0, A1, A2, A3 ed i registri di dato D3, D4, D5, D6 e D7. Normalmente i programmatori usano questa istruzione per salvare i registri di lavoro all’ingresso di una procedura e per ripristinare il loro valore originario all’uscita della procedura stessa. Esempi MOVEM.L D0-D7/A0-A6,-(A7) salva nello stack il contenuto di tutti i registri di dato e dei registri di indirizzo tranne A7. MOVEM.L (A7)+,D0-D7/A0-A6 ripristina il contenuto dei registri di dato e dei registri di indirizzo (tranne A7), prelevandoli dallo stack. 41 Istruzione MOVEP L’istruzione MOVEP (MOVE Peripheral data) permette di copiare parole di word o long word tra un registro di dato ed un dispositivo periferico ad 8 bit mappato in memoria. I dispositivi periferici sono collegati al data-bus in modo che byte consecutivi sui periferici sono mappati nello spazio di indirizzamento della memoria ad indirizzi pari (o dispari) consecutivi: l’istruzione MOVEP esegue accessi in memoria a gruppi di due locazioni alla volta: se l’operando destinazione ha un indirizzo pari, viene fatto accesso solo ad indirizzi pari. L’istruzione MOVEP esegue esclusivamente il trasferimento di dati di tipo word o long word; i flag del registro CCR non sono modificati dall’istruzione. 42 M. Rebaudengo, M.Sonza Reorda I.21 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione MOVEP (cont.) L’operando che indica gli indirizzi dei registri del dispositivo periferico può essere specificato esclusivamente attraverso un indirizzamento di tipo registro indiretto con spiazzamento. In una istruzione di trasferimento da un registro di dato ad un dispositivo periferico il byte più significativo del registro è copiato per primo all’indirizzo minore, mentre il byte meno significativo è copiato per ultimo all’indirizzo maggiore in memoria. Esempi MOVEP.L D2, 0(A0) copia i 4 byte contenuti nel registro D2 negli indirizzi [ A0+0], [A0+2], [A0+4] e [A0+6]. In particolare copia il byte più significativo all’indirizzo [A0+0] ed il byte meno significativo all’indirizzo [ A0+6]. 43 Istruzione MOVE to CCR L’istruzione MOVE to CCR copia un dato nel registro CCR. Tale istruzione esegue un’operazione su dati di tipo word. L’istruzione MOVE <ea>, CCR copia il byte meno significativo dell’operando sorgente nel registro CCR; il byte più significativo è ignorato. Questa istruzione permette di pre-caricare il registro CCR. 44 M. Rebaudengo, M.Sonza Reorda I.22 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione MOVE to SR e MOVE from SR Permettono di eseguire operazioni di lettura e scrittura sul registro di stato SR. L’istruzione MOVE to SR copia una word nel registro SR; tale istruzione è privilegiata e può essere eseguita solo quando il processore opera in supervisor mode. L’istruzione MOVE from SR permette di leggere il contenuto del registro SR. Questa istruzione è privilegiata per il processore 68010, ma non per il 68000. In generale queste istruzioni sono utilizzate da chi scrive sistemi operativi e non sono utilizzate dai programmatori che scrivono programmi applicativi. 45 Istruzione MOVE USP Come è già stato accennato precedentemente il 68000 dispone di due registri A7: uno associato al modo utente e chiamato USP (user stack pointer) ed uno associato al modo supervisore e chiamato SSP (supervisor stack pointer). Quando il processore lavora in modo supervisore è possibile accedere al registro USP attraverso le istruzioni MOVE.L USP,An e MOVE.L An,USP. Quando il 68000 lavora in modo utente il registro SSP è completamente nascosto all’utente. 46 M. Rebaudengo, M.Sonza Reorda I.23 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni aritmetiche Le istruzioni aritmetiche comprendono: • ADD, ADDA, ADDQ, ADDI, ADDX; • SUB, SUBA, SUBQ, SUBI, SUBX; • DIVS, DIVU; • MULS, MULU; • CLR; • NEG, NEGX; • EXT; • ABCD, NBCD, SBCD. 47 Istruzioni logiche Le istruzioni logiche comprendono: • AND, ADDI; • OR, ORI; • EOR, EORI; • NOT. 48 M. Rebaudengo, M.Sonza Reorda I.24 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni di scorrimento Le istruzioni di scorrimento comprendono: • LSL, LSR; • ASL, ASR; • ROL, ROR, ROXL, ROXR. 49 Istruzioni di manipolazione dei bit Le istruzioni di manipolazione dei bit comprendono: • BTST; • BSET; • BCLR; • BCHG. 50 M. Rebaudengo, M.Sonza Reorda I.25 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni di manipolazione dei bit (cont.) Le istruzioni di manipolazione dei bit agiscono su uno specifico bit di un operando. Il bit manipolato viene copiato complementato nel flag Z. Gli altri flag non sono modificati da queste istruzioni. Le istruzioni di manipolazione dei bit possono essere applicate esclusivamente a: • locazioni di memoria di tipo byte; • registri di dato su 32 bit. La posizione del bit da manipolare può essere specificata attraverso un: • indirizzamento immediato; • registro di dato. 51 Istruzione BTST L’istruzione BTST (TeST a Bit) controlla un bit specifico di un operando. Se il bit vale zero il flag Z viene settato, altrimenti viene azzerato. L’istruzione BTST non modifica il valore dell’operando. Esempio BTST #5,D5 esegue un test del bit in posizione 5 del contenuto del registro D5. 52 M. Rebaudengo, M.Sonza Reorda I.26 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione BSET L’istruzione BSET (test a Bit and SET) aggiorna il flag Z in base al valore del bit specificato ( test) e forza ad uno il bit specificato ( set). Esempio BSET #2,(A3) esegue un test del bit in posizione 2 della locazione di memoria indirizzata dal registro A3 e quindi un suo set. 53 Istruzione BCLR L’istruzione BCLR (test a Bit and CLeaR) aggiorna il flag Z in base al valore del bit specificato ( test) ed azzera il bit specificato ( clear). Esempio Supponendo che il registro D6 contenga, all’atto dell’esecuzione dell’istruzione corrente, il valore 12, il bit all’interno del registro D7 avente posizione 12 viene testato e quindi azzerato. BCLR D6, D7 54 M. Rebaudengo, M.Sonza Reorda I.27 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione BCHG L’istruzione BCHG (test a Bit and CHanGe) aggiorna il flag Z in base al valore del bit specificato ( test) e complementa il bit specificato ( change). Esempio BCHG #6,D5 esegue il test del bit 6 del registro D5 e la sua complementazione. 55 Istruzioni per il controllo del programma All’interno dell’insieme di istruzioni per il controllo del programma si distinguono le seguenti classi di istruzioni: • confronto; • salto; • gestione delle procedure; • attivazione di un’eccezione; • controllo di sistema; • altre. 56 M. Rebaudengo, M.Sonza Reorda I.28 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni di confronto L’insieme delle istruzioni di confronto comprende: • CMP; • CMPA; • CMPI; • CMPM. 57 Istruzioni di salto L’insieme delle istruzioni di salto comprende: • Bcc; • BRA; • JMP; • DBcc. 58 M. Rebaudengo, M.Sonza Reorda I.29 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni per la gestione delle procedure L’insieme delle istruzioni per la gestione delle procedure è composto da: • JSR; • BSR; • RTS; • RTR; • LINK; • UNLK. 59 Istruzioni LINK e UNLK Lo stack frame può essere facilmente gestito da una coppia complementare di istruzioni: LINK (LINK and allocate) e UNLK (UNLinK). Per poter effettuare chiamate annidate di procedure, ogni volta che una procedura è chiamata deve essere riservato un nuovo stack frame. L’istruzione LINK crea uno stack frame di dimensione stabilita ed inizializza un registro di indirizzo in modo da puntare allo stack frame corrente. 60 M. Rebaudengo, M.Sonza Reorda I.30 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni LINK e UNLK (cont.) Esempio LINK A1,#-64 alloca uno stack frame di 64 byte e utilizza il registro A1 per puntare all’inizio dell’area dati locale, eseguendo le seguenti operazioni elementari: LINK: [SP] <- [SP]-4 [M[SP]] <- [A1] salva il contenuto di A1 [A1] <- [SP] copia SP in A1 [SP] <- [SP]-64 alloca stack frame Il contenuto del registro A1 (precedente all’istruzione) non è distrutto dall’istruzione di LINK; analogamente il valore di SP precedente all’allocazione dello stack frame non viene perduto, ma viene memorizzato in A1. 61 Istruzioni LINK e UNLK (cont.) L’istruzione LINK non distrugge nessuna informazione; è possibile dunque eseguire l’operazione inversa di cancellazione dello stack frame e del ripristino dello stato precedente attraverso l’istruzione UNLK. Esempio UNLK A1 esegue la cancellazione dello stack frame attraverso le seguenti operazioni elementari. <- [A1] disallocazione stack [A1] <- [M[SP]] ripristino A1 [SP] <- [SP]+4 ripristino SP UNLK: [SP] 62 M. Rebaudengo, M.Sonza Reorda I.31 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni LINK e UNLK (cont.) Esempio Il seguente frammento di codice riporta le istruzioni necessarie per eseguire il salvataggio dei registri di lavoro e l’allocazione di uno stack frame al momento dell’inizio di una procedura e le complementari operazioni di disallocazione e ripristino dei registri per il ritorno al programma chiamante. MOVEM.L D0-D7/A3-A6,-(SP) LINK A1,#-64 ... UNLK A1 MOVEM.L (SP)+,D0-D7/A3-A6 63 RTS Istruzioni LINK e UNLK (cont.) SP Stack frame Vecchio A1 Registri salvati Indirizzo di ritorno 64 M. Rebaudengo, M.Sonza Reorda I.32 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzioni che generano trap Il processore 68000 fornisce alcune istruzioni usate per generare delle eccezioni: • ILLEGAL; • CHK; • TRAP; • TRAPV. 65 Istruzione ILLEGAL L’istruzione ILLEGAL (ILLEGAL instruction) provoca l’esecuzione di un’eccezione. 66 M. Rebaudengo, M.Sonza Reorda I.33 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione CHK L’istruzione CHK (CHecK register against bounds) è usata per confrontare un registro di dato (operando destinazione) ed un intervallo di valori compreso tra 0 ed un limite superiore specificato in complemento a 2 (operando sorgente). Un’eccezione è eseguita se il registro di dato contiene un valore inferiore a 0 oppure maggiore del limite superiore. Possono essere confrontate solo parole di tipo word. 67 Istruzione TRAP L’istruzione TRAP (TRAP) permette di scatenare un’eccezione di trap. Il formato dell’istruzione è TRAP #n, numero compreso tra 0 e 15. dove n è un L’istruzione TRAP scatena la trap avente numero d’ordine n all’interno della tabella degli indirizzi del vettore delle eccezioni. 68 M. Rebaudengo, M.Sonza Reorda I.34 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione TRAPV L’istruzione TRAPV (TRAP on oVerflow) esegue il processamento di un’eccezione solo se il flag di overflow è settato. 69 Istruzioni di controllo di sistema Le istruzioni di controllo di sistema sono usate per eseguire operazioni privilegiate (valide solo per il modo supervisor): • MOVE to SR, MOVE from SR, MOVE USP; • ANDI SR, ORI SR, EORI SR ; • RESET; • STOP; • RTE. 70 M. Rebaudengo, M.Sonza Reorda I.35 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione RESET L’istruzione RESET (RESET external devices) causa l’attivazione della linea esterna di RESET. La linea di RESET è normalmente connessa con dispositivi esterni, questa istruzione permette dunque al programmatore di resettare via software la circuiteria esterna al processore. 71 Istruzione STOP L’istruzione STOP (load status register and STOP) causa l’interruzione dell’esecuzione del processore. Il formato dell’istruzione è STOP #n, dove n è un numero su 16 bit. Il processore carica il registro di stato con il valore immediato n ed interrompe l’esecuzione delle operazioni entrando nello stato di stop. Il processore esce dallo stato di stop solo quando accade un evento di trace, di interrupt o di reset. 72 M. Rebaudengo, M.Sonza Reorda I.36 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione RTE L’istruzione RTE (ReTurn from Exception) è l’istruzione di ritorno da una routine di gestione delle eccezioni. Essa ripristina il valore che il registro di stato ed il program counter avevano al momento dell’esecuzione dell’eccezione. 73 Miscellanea di istruzioni L’insieme di istruzioni per il processore 68000 comprende infine le seguenti: • Scc; • NOP; • TAS; • TST. 74 M. Rebaudengo, M.Sonza Reorda I.37 Calcolatori Elettronici Introduzione alla famiglia 68000 Istruzione TAS L’istruzione TAS (Test And Set an operand) esegue un test sugli 8 bit meno significativi dell’operando. Tutti i flag di condizione sono aggiornati, tranne il flag X. Il bit 7 dell’operando è settato. Sono ammessi solo operandi di tipo byte. 75 M. Rebaudengo, M.Sonza Reorda I.38