ELEMANIA
PIC16F690 - Istruzioni aritmetiche e logiche
Addizione e sottrazione: ADDLW, ADDWF, SUBLW e SUBWF

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.

Incremento e decremento: INCF e DECF

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.

Rotazione: RLF e RRF

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

 

Operazioni logiche:  ANDLW, ANDWF, IORLW, IORWF, XORLW, XORWF, COMF

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:

             MOVLW B'10101010' ; carica in W il valore binario indicato
             ANDLW B'11110000' ; effettua l'AND bit a bit fra W e il valore binario indicato

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):

             MOVLW B'01010101 ' ; carica in W il valore binario indicato
             MOVWF TEMP           ; copia W in TEMP
             COMF TEMP, F          ; complementa a 2 TEMP

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:

             MOVLW 0xFF         ; carica in W il valore binario '11111111'
             XORWF TEMP,F      ; inverte tutti i bit di TEMP facendo l'ex-OR con W

 

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it