Le operazioni di somma e sottrazione hanno sempre operandi a 8 bit; uno dei due operandi è sempre il registro W; il risultato può essere salvato in W oppure in un altro registro.
L'istruzione ADDLW somma un valore costante al registro W e salva il risultato in W:
ADDLW 2 ; W = W +2
L'istruzione ADDWF effettua la somma fra W e un altro registro e salva il risultato in W oppure nel registro stesso:
ADDWF 0E, F ; somma il registro all'indirizzo 0E con W e
salva il risultato nel registro
ADDWF 0E, W ; somma il registro all'indirizzo 0E con W e
salva il risultato in W
In modo perfettamente analogo si comportano le due istruzioni per effettuare la sottrazione: SUBLW e SUBWF.
L'istruzione INCF incrementa il contenuto di un registro e salva il risultato nel registro stesso oppure in W. Facciamo un esempio supponendo che TEMP sia l'etichetta associata con l'indirizzo di un registro:
TEMP EQU 25 ; associo a TEMP l'indirizzo 25
(esadecimale)
INCF TEMP, F ; TEMP = TEMP + 1
INCF TEMP, W ; W = TEMP + 1
Identica è la sintassi dell'istruzione di decremento DECF.
L'istruzione RLF (rotate left) sposta tutti i bit interni a un registro di una posizione verso sinistra. Il bit più significativo (quello che si trova più a sinistra di tutti) rientra da destra come bit zero (il meno significativo) in modo ciclico. Tuttavia prima di "rientrare" il bit più significativo passa attraverso il flag C (Carry) dello Status Register.
Vediamo un semplice esempio. Supponiamo che il registro temp contenga il valore binario 00000001 e supponiamo di eseguire ripetutamente l'istruzione:
RLF TEMP, F
La tabella seguente mostra il contenuto del registro e del flag C dopo ogni esecuzione di RLF:
C | TEMP | |
x | 00000001 | |
RLF | 0 | 00000010 |
RLF | 0 | 00000100 |
RLF | 0 | 00001000 |
RLF | 0 | 00010000 |
RLF | 0 | 00100000 |
RLF | 0 | 01000000 |
RLF | 0 | 10000000 |
RLF | 1 | 00000000 |
RLF | 0 | 00000001 |
RLF | 0 | 00000010 |
Se viene specificato W come destinazione, il risultato della rotazione viene salvato in W invece che nel registro stesso:
RLF TEMP, W
L'istruzione RRF (rotate right) funziona in modo analogo solo che la rotazione avviene verso destra. L'esempio nella seguente tabella dovrebbe chiarire il comportamento di RRF:
C | TEMP | |
x | 00000001 | |
RRF | 1 | 00000000 |
RRF | 0 | 10000000 |
RRF | 0 | 01000000 |
RRF | 0 | 00100000 |
RRF | 0 | 00010000 |
RRF | 0 | 00001000 |
RRF | 0 | 00000100 |
RRF | 1 | 00000010 |
RRF | 0 | 00000001 |
RRF | 1 | 00000000 |
L'istruzione ANDLW effettua l'operazione logica AND bit a bit fra il contenuto di W e una costante e salva il risultato in W:
Al termine dell'esecuzione della precedente coppia di istruzioni il registro W contiene il valore 10100000.
L'istruzione ANDWF funziona allo stesso modo ma effettua l'AND fra il contenuto di W e quello di un altro registro e salva il risultato in W oppure nel registro stesso:
ANDWF 0C, F ; calcola l'AND fra W e il registro di
indirizzo 0C e salva nel registro
ANDWF 0C, W ; calcola l'AND fra W e il registro di indirizzo
0C e salva in W
In modo perfettamente analogo IORLW e IORWF calcolano l'OR logico bit a bit e XORLW e XORWF calcolano l'EXOR (OR esclusivo) bit a bit.
L'istruzione COMF calcola il complemento a 2 del contenuto di un registro e salva il risultato nel registro stesso (F) oppure in W (W):
Al termine dell'esecuzione TEMP contiene il valore 10101010.
Non esiste un'istruzione assembly per effettuare la negazione (operazione logica NOT), ma si può ottenere lo stesso risultato con un OR esclusivo con il valore FF (tutti i bit a 1). Si veda a questo proposito il seguente esempio:
Sito realizzato in base al
template offerto da
http://www.graphixmania.it