Set di istruzioni
Il set di istruzioni passa da 35 a più di 70, quindi è più che
raddoppiato, ma questo non provoca grossi problemi in quanto le nuove istruzioni
sono in parte identiche alle precedenti e le nuove sono assai pratiche.
Come riassunto si può dire che i problemi di traslazione del sorgente
riguardano in generale :
- istruzioni con mnemonico e funzione analoga a quella dei PIC16, ma
modificano i bit dello STATUS in modo diverso
- istruzioni con mnemonico e funzione nuova
- istruzioni con mnemonico simile al nome utilizzato per macro oppure agli mnemonici delle pseudo istruzioni accettate dal MPASM
Un primo punto riguarda la lunghezza delle istruzioni enhanced che è, di
base, 16 bits.
Quindi le istruzioni iniziano sempre in locazioni PARI e un salto ad un
indirizzo programma dispari è errato.
Questo è importante per chi ha l' abitudine di utilizzare il simbolo $ per
puntare un salto.
Ancor più imporatnte considerando che alcune istruzioni sono codificate su 4
bytes.
Un altro punto riguarda le istruzioni di rotazione che, nei mid-range,
coinvolgono sempre il Carry (gli opcodes rlf e rrf).
Negli enhanced, invece, sono disponibili due opcodes per ogni direzione della
rotazione, ovvero :
- rrcf / rlcf che agiscono come gli equivalenti rlf /rrf
- rrncf / rlncf che, invece, ruotano il registro oggetto SENZA
coinvolgere il Carry
Dunque una sostituzione diretta dei mid-range rlf / rrf è, per gli
enghanced, rlcf / rrcf , dato che MPASM, compilando per un PIC18, indica gli
eventuali opcodes rlf / rrf come errori.
Un altro punto riguarda i diverso effetto delle istruzioni sullo STATUS.
Le istruzioni di rotazione degli enhanced possono modificare un bit
addizionale N non presente nello STATUS dei PIC16 altre, come i rotate
modificano anche il bit Z, cosa che, invece, nei mid range non era possibile.
Questo rende molto più ampia e flessibile la casistica dei test possibili, ma
richiede di rivedere il sorgente per evitare risultati errati in comparazioni
successive.
La tabella seguente riporta alcune istruzioni
comparate evidenziando le diverse risposte dei flag di STATUS:
Istruzione |
STATUS |
16F |
18F |
ADDLW |
C, DC,
Z |
C, DC, Z, OV,
N |
ADDWF |
C, DC,
Z |
C, DC, Z, OV,
N |
ANDLW |
Z |
Z, N |
ANDWF |
Z |
Z, N |
COMF |
Z |
Z, N |
DECF |
Z |
C, DC, Z, OV,
N |
INCF |
Z |
C, DC, Z, OV,
N |
IORLW |
Z |
Z, N |
IORWF |
Z |
Z, N |
MOVF |
Z |
Z, N |
RETFIE |
GIE |
GIE/GIEH
GIEL/PEIE |
RLCF (RLF) |
C, DC,
Z |
C, Z,
N |
RRCF
(RRF) |
C, DC,
Z |
C, Z,
N |
SUBLW |
C, DC,
Z |
C, DC, Z, OV,
N |
SUBWF |
C, DC,
Z |
C, DC, Z, OV,
N |
XORLW |
Z |
Z, N |
XORWF |
Z |
Z, N |
Altre differenze riguardano il fatto che il registro WREG è realmente
accessibile da tutte le istruzioni, quindi la NEGW è sostituita da una NEGF
WREG.
Esistono poi istruzioni del tutto assenti dal set a 14 bit:
- BTG per l' inversione dello stato di un bit
- una serie di branch sui flag dello STATUS (BC, BNC, BZ, BNZ, BN, BNN,
BOV, BNOV)
- una chiamata a subroutine "corta" RCALL
- MULWF e MULLW che effettuano una moltiplicazione 8 bit
hardware
- DAW per l' aggiustamento delle operazioni in BCD
- PUSH e POP per la manipolazione dello stack
- Alcune istruzioni per la manipolazione dei banchi e degli FSR (MOVLB,
LFSR)
- 8 istruzioni di lettura e scrittura delle tabelle
- 4 comparazioni con skip tra WREG e un file
- 2 istruzioni di incremento e decemento con skip se non-zero
- La MOVFF che sposta file to file nell' intera area di memoria
- SUBFWB che sottrae f da WREG con borrow e SUBWFB
che sottrae WREG da f con borrow
- TSTFSZ che testa se il file è a 0
Oltre a queste, sono abilitabili altre istruzioni del set detto
"esteso" che assumono una certa imporatnza con il compilatore C.
Un cenno particolare sarà dato più avanti al punto 2 e 6.
Una sezione diversa dei tutorial è dedicata ad una analisi più
approfondita del set di istruzioni a 16 bit.
|