Assembler Befehle
ADDLW
ADDLW
|
ADD Zahl und W
|
Syntax:
|
ADDLW k
|
Operanten:
|
0 ≤ k ≤ 255
|
Operation:
|
(W) + k → (W)
|
Beeinflusste Statusbits:
|
C, DC, Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k ADD addiert und das Ergebnis landet wieder im W Register
|
ADDWF
ADDWF
|
ADD W und f
|
Syntax:
|
ADDWF f,d
|
Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
Operation:
|
(W) + (f) → (destination)
|
Beeinflusste Statusbits:
|
C, DC, Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f addiert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
ANDLW
ANDLW
|
AND Zahl mit W
|
Syntax:
|
ANDLW k
|
Operanten:
|
0 ≤ k ≤ 255
|
Operation:
|
(W) + k → (W)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k verundet und das Ergebnis landet wieder im W Register
|
Beispiel:
...
MOVLW 0xCC ;Ladet Die Zahl 0xCC (Hex) in den Arbeitsregister.
;Sieht Binär so aus: '11001100'
ANDLW 0xF0 ;Führt die Logische Operation "AND" (UND)
;mit 0xF0 (binär: '11110000') durch und ladet die Zahl
;wieder ins Arbeitsregister W.
;Nun steht im Arbeitsregister 0xC0 ('11000000')
...
Mit der Logischen Operation "AND" lässt sich sehr schön ein Teil eines Bytes auf 0 setzen. Und zwar werden alle Teile auf 0 gesetzt, wo eine 0 im 2.Byte steht, dort wo eine 1 stand, bleibt alles erhalten.
ANDWF
ANDWF
|
AND W mit f
|
Syntax:
|
ANDWF f,d
|
Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
Operation:
|
(W) .AND. (f) → (destination)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f verundet und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
BCF
BCF
|
Bit Clear f
|
Syntax:
|
BCF f,b
|
Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
Operation:
|
0 → (f)
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Bit ‘b’ in Register ‘f’ wird auf 0 gesetzt
|
BSF
BSF
|
Bit Set f
|
Syntax:
|
BSF f,b
|
Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
Operation:
|
0 → (f<b>)
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Bit ‘b’ in Register ‘f’ wird auf 1 gesetzt
|
BTFSC
BTFSC
|
Bit Test f, Skip if Clear
|
Syntax:
|
BTFSC f,b
|
Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
Operation:
|
skip if (f<b>) = 0
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Wenn das Bit b im Register f 0 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 1 ist, dann wird der nächste Befehl ausgeführt.
|
BTFSS
BTFSS
|
Bit Test f, Skip if Set
|
Syntax:
|
BTFSS f,b
|
Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
Operation:
|
skip if (f<b>) = 1
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Wenn das Bit b im Register f 1 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 0 ist, dann wird der nächste Befehl ausgeführt.
|
CALL
CALL
|
Call Subroutine
|
Syntax:
|
CALL k
|
Operanten:
|
0 ≤ k ≤ 2047
|
Operation:
|
(PC) + 1 → TOS,
k → PC<10:0>,
(PCLATH<4:3>) → PC<12:11>
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Als erstes wird die Rückkehradresse (PC+1) in den Stack geschrieben. Dann Die 11bit Sprungadresse in den PC geladen (die 2 MSB kommen aus dem PCLATH).
|
CLRF
CLRF
|
Clear f
|
Syntax:
|
CLRF f
|
Operanten:
|
0 ≤ f ≤ 127
|
Operation:
|
00h → (f),
1 → Z
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Das komplette Byte im Register f wird gelöscht (lauter 0er). Das hat zur folge, das Z gesetzt wird.
|
CLRW
CLRW
|
Clear W
|
Syntax:
|
CLRW
|
Operanten:
|
/
|
Operation:
|
00h → (W),
1 → Z
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Das Arbeitsregister W wird gelöscht und anschließed das Z-Bit auf 1 gesetzt.
|
CLRWDT
CLRWDT
|
Clear Watchdog Timer
|
Syntax:
|
CLRWDT
|
Operanten:
|
/
|
Operation:
|
00h → WDT,
0 → WDT prescaler,
1 → TO,
1 → PD
|
Beeinflusste Statusbits:
|
TO, PD
|
Beschreibung:
|
Der Watchdogtimer (TMR0) wird resettet. es wird ebenfalls der Prescaler resettet. Die Statusbits T0 und PD werden gesetzt.
|
COMF
COMF
|
Complement f
|
Syntax:
|
COMF f,d
|
Operanten:
|
0 ≤ f ≤ 127 und
d ∈ [0,1]
|
Operation:
|
(f) → (destination)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Alle Bits des Registers f werden invertiert (1 wird 0 und 0 wird 1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert.
|
DECF
DECF
|
Decrement f
|
Syntax:
|
DECF f,d
|
Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
Operation:
|
(f) – 1 → (destination)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Das Register f wird decrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert.
|
DECFSZ
DECFSZ
|
Decrement f, skip if 0
|
Syntax:
|
DECFSZ f,d
|
Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
Operation:
|
(f) – 1 → (destination), skip if result = 0
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Das Register f wird decrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. Danach wird überprüft, ob das Ergebnis 0 war. Wenn ja, dann wird an Stelle des nächsten Befehls ein NOP durchgeführt.
|
GOTO
GOTO
|
uncontitional Branch
|
Syntax:
|
GOTO k
|
Operanten:
|
0 ≤ k ≤ 2047
|
Operation:
|
k → PC<10:0>,
PCLATH<4:3> → PC<12:11>
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Goto veranlasst einen Sprung an die Adresse k im Programmspeicher. Es werden aber nur die 11 niedrigstens Bit der Adresse mit GOTO bestimmt, die beiden höchsten werden aus dem Register PCLATH geladen.
|
INCF
INCF
|
Increment f
|
Syntax:
|
INCF f,d
|
Operanten:
|
0 ≤ f ≤ 127,
d ∈ [0,1]
|
Operation:
|
(f) + 1 → (destination)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Das Register f wird incrementiert (f=f+1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert.
|
INCFSZ
INCFSZ
|
Increment f, skip if 0
|
Syntax:
|
INCFSZ f,d
|
Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
Operation:
|
(f) + 1 → (destination), skip if result = 0
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Das Register f wird incrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. Danach wird überprüft, ob das Ergebnis 0 war. Wenn ja, dann wird an Stelle des nächsten Befehls ein NOP durchgeführt.
|
IORLW
IORLW
|
Inclusive OR Literal with W
|
Syntax:
|
IORLW k
|
Operanten:
|
0 ≤ k ≤ 255
|
Operation:
|
(W) .OR. k → (W)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k verodert und das Ergebnis landet wieder im W Register
|
IORWF
IORWF
|
Inclusive OR W und f
|
Syntax:
|
IORWF f,d
|
Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
Operation:
|
(W) .OR. (f) → (destination)
|
Beeinflusste Statusbits:
|
C, DC, Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f verodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
MOVF
MOVF
|
Move f
|
Syntax:
|
MOVF f,d
|
Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
Operation:
|
(W) + (f) → (destination)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Der Inhalt des Registers f wird entweder in das Arbeitsregister W (d=0) oder wieder in sich selbst kopiert (d=1). Das "in sich selber kopieren" hat den Sinn, zu überprüfen, ob das Register leer ist. Wenn dem nämlich so wäre, dann würde das Z-Bit gesetzt werden.
|
MOVLW
MOVLW
|
Move Literal to W
|
Syntax:
|
MOVLW k
|
Operanten:
|
0 ≤ k ≤ 255
|
Operation:
|
k → (W)
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Die Zahl k wird in das Arbeitsregister geladen
|
MOVWF
MOVWF
|
Move W to f
|
Syntax:
|
MOVWF f
|
Operanten:
|
0 ≤ f ≤ 127
|
Operation:
|
(W) → (f)
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Das Arbeitsregister W wird in das Register f geladen
|
NOP
NOP
|
No Operation
|
Syntax:
|
NOP
|
Operanten:
|
/
|
Operation:
|
/
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Ein Takt lang wird NICHTS gemacht.
|
RETFIE
RETFIE
|
Return from Interrupt
|
Syntax:
|
RETFIE
|
Operanten:
|
/
|
Operation:
|
TOS → PC,
1 → GIE
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Dieser Befehl steht am Ende der Interrupt Service Routine - aber auch NUR dort!!! Damit wird das Programm wieder an der Stelle fortgesetzt, wo es von einem Interrupt unterbrochen wurde.
|
RETLW
RETLW
|
Return with Literal in W
|
Syntax:
|
RETLW k
|
Operanten:
|
0 ≤ k ≤ 255
|
Operation:
|
k → (W);
TOS → PC
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Der Wert k wird in das W Register geschrieben, dann die Returnadresse aus dem Stack geholt und in den PC geladen. Das Programm wird an der Stelle fortgesetzt, wo die letzte Subroutine aufgerufen wurde.
|
RETURN
RETURN
|
Return from Subroutine
|
Syntax:
|
RETURN
|
Operanten:
|
/
|
Operation:
|
TOS → PC
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Das Programm wird an der Stelle fortgesetzt, wo die letzte Subroutine aufgerufen wurde.
|
RLF
RLF
|
Rotate Left f through Carry
|
Syntax:
|
RLF f,d
|
Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
Operation:
|
siehe unten
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Das Register F wird links rum über das Carryflag "rotiert". D.h. das MSB landet im Carryflag und das Carryflag landet im LSB. Das Ergebnis landet entweder im Arbeitsregister W (d=0) oder wieder im Register f (d=1).
|
RRF
RRF
|
Rotate Right f through Carry
|
Syntax:
|
RRF f,d
|
Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
Operation:
|
siehe unten
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Das Register F wird rechts rum über das Carryflag "rotiert". D.h. das Carryflag landet im MSB und das LSB landet im Carryflag. Das Ergebnis landet entweder im Arbeitsregister W (d=0) oder wieder im Register f (d=1).
|
SLEEP
SLEEP
|
Sleep
|
Syntax:
|
SLEEP
|
Operanten:
|
/
|
Operation:
|
00h → WDT,
0 → WDT prescaler,
1 → TO,
0 → PD
|
Beeinflusste Statusbits:
|
TO, PD
|
Beschreibung:
|
Das Powerdownstatusbit (PD) wird gelöscht und das Timeoutstatusbit (TO) wird gesetzt. Der Watchdog wird samt seinem Prescaler Resetet. Danach wird der Prozessor "schlafen" geschickt und der Oszillator angehalten.
|
SUBLW
SUBLW
|
Subtract W from Literal
|
Syntax:
|
SUBLW k
|
Operanten:
|
0 ≤ k ≤ 255
|
Operation:
|
k – (W) → (W)
|
Beeinflusste Statusbits:
|
C, DC, Z
|
Beschreibung:
|
Das Arbeitsregister W wird von der Zahl k Subtrahiert und das Ergebnis wird in W gespeichert.
|
SUBWF
SUBWF
|
Subtract W from f
|
Syntax:
|
SUBWF f,d
|
Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
Operation:
|
(f) – (W) → (destination)
|
Beeinflusste Statusbits:
|
C, DC, Z
|
Beschreibung:
|
Das Arbeitsregister W wird vom Register f Subtrahiert und das Ergebnis wird entweder im Arbeitsregister W (d=0) oder dem Register f (d=1) gespeichert.
|
SWAP
SWAP
|
Swap Nibbles in f
|
Syntax:
|
SWAP f,d
|
Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
Operation:
|
(f<3:0>) → (destination<7:4>),
(f<7:4>) → (destination<3:0>)
|
Beeinflusste Statusbits:
|
/
|
Beschreibung:
|
Das obere und das untere Nibble des Registers f werden vertauscht. Das Ergebnis wird entweder im Arbeitsregister W (d=0) oder dem Register f (d=1) gespeichert.
|
XORLW
XORLW
|
Exclusive OR Literal with W
|
Syntax:
|
XORLW k
|
Operanten:
|
0 ≤ k ≤ 255
|
Operation:
|
(W) .XOR. k → (W)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k exklusiv verodert und das Ergebnis landet wieder im W Register
|
XORWF
XORWF
|
Exclusive OR W und f
|
Syntax:
|
XORWF f,d
|
Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
Operation:
|
(W) .OR. (f) → (destination)
|
Beeinflusste Statusbits:
|
Z
|
Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f exklusiv erodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
Pseudo Befehle
Pseudobefehle werden je nach Compiler unterstützt. (-oder eben auch nicht.) Sie geben dem Compiler Anweisungen, die z.b. das Ende des Programms angeben oder einfach nur die Position eines Befehls im Prgrammspeicher angeben.
#Define
#Define
|
Syntax:
|
#Define name string
|
Beschreibung:
|
Jedes mal wenn 'name' im Programm verwendet wird, ersetzt der Compiler den Ausdruck mit dem definierten String.
|
END
END
|
Syntax:
|
END
|
Beschreibung:
|
Sollte am Ende jedes Programmes stehen, um dem Compiler zu sagen, dass das Programm hier zu Ende ist. Ohne diesem Befehl (sollte) es auch keine Schwierigkeiten geben.
|
EQU
EQU
|
Syntax:
|
name EQU expr
|
Beschreibung:
|
Definiert eine Zahl unter einem Namen. Zum Beispiel können so Registeradressen leicht zu merkende Namen bekommen.
|
ORG
ORG
|
Syntax:
|
ORG expr
|
Beschreibung:
|
Positioniert Code im Programm an eine Bestimmte Adresse im Programmspeicher.
|