MPASM
Instructions
Liste alphabétique des instructions :
ADDLW k (Add literal to W) k + W->W
ADDWF f,d (Add W and f) W + f-> d
ANDLW k (AND literal and W) k .AND. W->W
ANDWF f,d (AND W and f) W .AND. f-> d
BCF f,b (Bit clear f) 0->f(b)
BSF f,b (Bit set f ) 1->f(b)
BTFSC f,b (Bit test, skip if clear) skip if f(b) = 0
BTFSS f,b (Bit test, skip if set) skip if f(b) = 1
CALL k (Call subroutine) PC + 1->TOS, k->PC
CLRF f (Clear f) 0->f
CLRW (Clear W) 0->W
CLRWDT (Clear watchdog timer) 0->WDT (and Prescaler if assigned)
COMF f,d (Complement f) .NOT. f->d
DECF f,d (Decrement f) f - 1->d
DECFSZ f,d (Decrement f, skip if zero) f - 1->d, skip if 0
GOTO k (Goto address) (k is nine bits) k->PC(9 bits)
INCF f,d (Increment f) f + 1->d
INCFSZ f,d (Increment f, skip if zero) f + 1->d, skip if 0
IORLW k (Incl. OR literal and W) k .OR. W->W
IORWF f,d (Inclusive OR W and f) W .OR. f->d
MOVF f,d (Move f) f->d
MOVLW k (Move Literal to W) k->W
MOVWF f (Move W to f) W->f
NOP (No operation)
RETFIE (Return from Interrupt) TOS->PC, 1->GIE
RETLW k (Return with literal in W) k->W, TOS->PC
RETURN (Return from subroutine) TOS->PC
RLF f,d (Rotate left f) f(n)->dest(n+1), f(7)->C, C->dest(0)
RRF f,d (Rotate right) f f(n)->dest(n-1), f(0)->C, C->dest(7)
SLEEP (Go into Standby Mode) 0->WDT, stop oscillator
SUBLW k (Subtract W from literal) k - W->W
SUBWF f,d (Subtract W from f) f - W->d
SWAPF f,d (Swap halves f) f(0:3)<->f(4:7)->d
XORLW k (Exclusive OR literal and W) k .XOR. W->W
XORWF f,d (Exclusive OR W and f) W .XOR. f->d
Instructions agissant sur un octet
Dans la mémoire programme, les instructions sont codées en suites de 0 et de 1, nous, nous préférons écrire des choses comme goto ou clrw, l'assembleur se charge de cette traduction.
Chaque ligne peut contenir jusquà 4 types dinformations :
Une ligne contient 255 caractères maximum
Létiquette permet de donner un nom à un nombre (adresse, variable), ou à une ligne du programme
Elle commence par un caractère alphanumérique (ou un sous ligné)
Dans ce cas, le sous ligné ne doit pas être suivi par un chiffre
Les caractères utilisables sont lettres, chiffres, sous ligné et point dinterrogation
Leur longueur maximale est de 32 caractères
Par défaut il y a une différence entre majuscules et minuscules, sauf option différente dans MPLAB.
Létiquette en début de ligne de programme commence en colonne 1; elle est suivie par un espace, une tabulation ou par deux points ( : ) ou par un retour chariot si elle est seule sur la ligne.
Derrière un call ou un goto elle est en colone 3.
Létiquette représentant un nombre est placée conformémént à la directive ou à l'instruction qui l'utilise.
Cest l'instruction elle même
L instruction doit commencer en colonne 2
Sil y a une étiquette en colonne 1, il doit y avoir séparation par un ou plusieurs espace, ou par deux points ( : ) ou par une tabulation.
Lopérande vient après linstruction, il la complête
Il doit être séparé de l'instruction par un ou plusieurs espace, ou par deux points ( : ) ou par une tabulation.
Sil y a plusieurs opérandes, ils sont séparés par des virgules
Tout texte commençant par un point virgule nest pas pris en compte par la compilation jusquà la fin de la ligne ; cest un commentaire.
Sauf si le point virgule fait partie dune chaîne de caractères
Conventions utilisées dans la description des instructions :
b Bit concerné par lopération (0 à 7)
f(b) est le bit b du registre f
d = 0 Résultat dans le registre de travail (W)
d = 1 Résultat dans le registre f (cas par défaut)
f Adresse dun registre ou dune case mémoire (h00 à hFF)
(f) Valeur contenue dans f
k Valeur numérique, ou étiquette
(k) Valeur de k
W Registre de travail (accumulateur)
(W) valeur contenue dans W
(Add literal to W)
k + (W) ->(W)
k: (0 à 255)
Ajoute la valeur k au contenu du registre de travail W et met le résultat dans W
Exemple: Avant l'instruction W contient d'05'
Nombre de cycles d'horloge:1
Registre affecté: STATUS C, DC, Z
(Add W and f)
(W) + (f) -> (d)
f: (00 à 4F); d: (0 ou 1)
Ajoute le contenu du registre de travail W à celui du registre f, et met le résultat
Exemple 1: Avant l'instruction W contient d'05' et Casemem contient d'06'
addwf Casemem,0 ; après l'instruction W contient d'12' , f contient toujours d'06'
Exemple 2: Avant l'instruction W contient d'05' et Casemem contient d'06'
addwf Casemem,1 ; après l'instruction W contient toujours d'05' , f contient d'12'
Nombre de cycles d'horloge:1
Registres affectés: STATUS C, DC, Z
(AND literal and W)
k AND (W)->(W)
k: (0 à 255)
Fait bit à bit l'opération AND entre le contenu de W et la valeur k, et met le résultat dans W
Exemple1: Avant l'instruction W contient b'01101101'
Cette instruction permet de forcer certains bits à 0 dans W; k devient un masque: les bits à 1 dans le masque ne changeront pas les bits correspondants dans W, les bits à 0 dans le masque forceront à 0 les bits correspondants de W
Nombre de cycles d'horloge:1
Registre affecté: STATUS, Z
(AND W and f)
(W) AND (f) -> (d)
f: (00 à 4F); d: (0 ou 1)
Fait bit à bit l'opération AND entre les contenus de W et de f, et met le résultat
Exemple 1: Avant l'instruction W contient b'01101101' et Casemem contient b'01001110'
andwf Casemem,0 ; après l'instruction W contient b'01001100' , Casemem contient toujours b'01001110'
Exemple 2: Avant l'instruction W contient b'01101101' et Casemem contient b'01001110'
andwf Casemem,1 ; après l'instruction W contient toujours b'01101101' , Casemem contient b'01001100'
Nombre de cycles d'horloge:1
Registre affecté: STATUS, Z
(Bit clear f)
0->f(b)
f: (00 à 4F); d: (0 à 7)
Met à zéro le bit b du registre f
Exemple:
Nombre de cycles d'horloge:1
Registres affectés: aucun
(Bit set f )
1->f(b)
f: (00 à 4F); d: (0 à 7)
Met à un le bit b du registre f
Exemple:
Nombre de cycles d'horloge:1
Registres affectés: aucun
(Bit test, skip if clear)
skip if f(b) = 0
f: (00 à 4F); d: (0 à 7)
Teste le bit b du registre f:
Exemple:
Nombre de cycles d'horloge:1 si b=1 ou 2 si b=0
Registres affectés: aucun
(Bit test, skip if set)
skip if f(b) = 1
f: (00 à 4F); d: (0 à 7)
Teste le bit b du registre f:
Exemple:
Nombre de cycles d'horloge:1 si b=0 ou 2 si b=1
Registres affectés: aucun
Call subroutine
PC + 1->pile, (k) ->PC
k: (étiquette)
Le programme saute à l'adresse k; il exécute les instructions qu'il y trouve jusqu'à une instruction RETURN ou RETLW qui le fera revenir à l'instruction qui suivait l'instruction CALL
La pile ne contenant que 8 mots, on ne peut imbriquer que 8 souroutines au maximum
Exemple:
Nombre de cycles d'horloge: 2
Registres affectés: aucun
(Clear f)
h'00' -> (f) ; 1 -> Z
f: (00 à 4F)
Met le contenu du registre f à zéro
Exemple:
Nombre de cycles d'horloge: 1
Registres affectés: STATUS , Z
(Clear W)
h'00' ->(W) ; 1 -> Z
Met le contenu du registre de travail W à zéro
Exemple : Avant l'instruction W contient h'3c'
Nombre de cycles d'horloge: 1
Registres affectés: STATUS Z
(Clear watchdog timer)
Met à zéro le compteur du Watchdog; en fait autant pour le compteur du prescaler s'il est assigné au Watchdog
On insére clrwdt dans le programme en un endroit exploré régulièrement, si par suite d'un plantage cette instruction n'est plus sollicitée, le watchdog va à son terme et produit un Reset
Ne pas utiliser dans une routine d'interruption
Nombre de cycles d'horloge: 1
Registre affecté: STATUS, NOT_TO, NOT_PD
(Complement f)
NOT( f) -> (d)
f: (00 à 4F); d: (0 ou 1)
met le résultat
Exemple 1: Avant l'instruction, peu importe le contenu de W et Casemem contient b'00110011'
comf Casemem,0 ; après l'instruction W contient b'11001100' , Casemem contient toujours b'00110011'
Exemple 2: Avant l'instruction peu importe le contenu de W et Casemem contient b'00110011'
comf Casemem,1 ; après l'instruction le contenu de W n'a pas changé et Casemem contient b'11001100'
Nombre de cycles d'horloge: 1
Registres affectés: STATUS , Z
(Decrement f)
(f) - 1 -> (d)
f: (00 à 4F); d: (0 ou 1)
Décrémente d'une unité le contenu de f et met le résultat
Si l'on décrémente d'000' on obtient d'255'
Exemple 1: Avant l'instruction, peu importe le contenu de W et Casemem contient d'123'
decf Casemem,0 ; après l'instruction W contient d'122' , Casemem contient toujours d'123'
Exemple 2: Avant l'instruction peu importe le contenu de W et Casemem contient d'123'
decf Casemem,1 ; après l'instruction le contenu de W n'a pas changé et Casemem contient d'122'
Nombre de cycles d'horloge: 1
Registre affecté: STATUS , Z
(Decrement f, skip if zero)
(f) - 1 -> (d), skip if 0
f: (00 à 4F); d: (0 ou 1)
Décrémente d'une unité le contenu de f et met le résultat
Si l'on décrémente d'000' on obtient d'255'
Exemple:
Nombre de cycles d'horloge:1 si b=1 ou 2 si b=0
Registre affecté: aucun
Goto address k (k sur 10 bits)
(k) ->PC (9 bits)
k: (étiquette)
Branchement inconditionnel, le programme saute à l'adresse donnée par la valeur de k (ou par une étiquette)
Nombre de cycles d'horloge: 2
Registre affecté: aucun
(Increment f)
(f) + 1 -> (d)
f: (00 à 4F); d: (0 ou 1)
Incrémente d'une unité le contenu de f et met le résultat
Si l'on incrémente d'255' on obtient d'000'
Exemple 1: Avant l'instruction, peu importe le contenu de W et Casemem contient d'123'
Exemple 2: Avant l'instruction peu importe le contenu de W et Casemem contient d'123'
incf Casemem,1 ; après l'instruction le contenu de W n'a pas changé et Casemem contient d'124'
Nombre de cycles d'horloge: 1
Registre affecté: STATUS , Z
(Increment f, skip if zero)
(f) + 1 -> (d) ; skip if 0
f: (00 à 4F); d: (0 ou 1)
Incrémente d'une unité le contenu de f et met le résultat
Si l'on incrémente d'255' on obtient d'000'
Exemple:
Nombre de cycles d'horloge:1 si b=1 ou 2 si b=0
Registre affecté: aucun
(Incl. OR literal and W)
k OR (W) -> (W)
k: (0 à 255)
Fait bit à bit l'opération OR entre le contenu de W et la valeur k, et met le résultat dans W
Exemple: Avant l'instruction W contient b'01101101'
Cette instruction permet de forcer certains bits à 1 dans W; (k) devient un masque: les bits à 0 dans le masque ne changeront pas les bits correspondants dans W, les bits à 1 dans le masque forceront à 1 les bits correspondants de W
Nombre de cycles d'horloge:1
Registre affecté: STATUS , Z
(Inclusive OR W and f)
(W) OR (f) -> (d)
f: (00 à 4F); d: (0 ou 1)
Fait bit à bit l'opération OR entre les contenus de W et de f, et met le résultat
Exemple 1: Avant l'instruction W contient b'01101101' et Casememcontient b'01001110'
iorwf Casemem,0 ; après l'instruction W contient b'01101111' , f contient toujours b'01001110'
Exemple 2: Avant l'instruction W contient b'01101101' et Casemem contient b'01001110'
iorwf Casemem,1 ; après l'instruction W contient toujours b'01101101' , f contient b'01101111'
Nombre de cycles d'horloge:1
Registre affecté: STATUS , Z mais Z passe à 1 si le résultat est différent de 0
(Move f)
(f) -> (d)
f: (00 à 4F); d: (0 ou 1)
Prend le contenu de f et le met
Exemple 1: Avant l'instruction, W contient d'50' et f contient d'100'
movf Casemem,0 ; après l'instruction W contient d'100' , Casemem contient toujours d'100'
Exemple 2: Avant l'instruction, W contient d'50' et f contient d'100'
movf Casemem,1 ; après l'instruction W contient toujours d'50' et Casemem contient toujours d'100' , mais le bit Z a été eventuellement modifié
Nombre de cycles d'horloge:1
Registre affecté: STATUS , Z
(Move Literal to W)
k -> (W)
k: (0 à 255)
Met la valeur k dans le registre de travail W
Exemple : Avant l'instruction, W contient d'50'
movlw,d'100' ; après l'instruction W contient d'100'
Nombre de cycles d'horloge:1
Registre affecté: STATUS , Z
(Move W to f)
(W) -> (f)
f: (00 à 4F)
Met le contenu du registre f dans le registre de travail W
Exemple 1: Avant l'instruction, W contient d'50' et peu importe le contenu de f
movwf,Casemem ; après l'instruction W contient toujours d'50' , Casemem contient d'50'
Nombre de cycles d'horloge:1
Registre affecté: aucun
(No operation)
Cette instruction ne fait aucune opération, elle utilise cependant un cycle d'horloge.
(Return from Interrupt)
Provoque le retour au programme d'origine à la fin d'une sous routine lancée par une 'interruption
Nombre de cycles d'horloge: 2
Registre affecté: INTCON, GIE
(Return with literal in W)
k: (0 à 255)
Provoque le retour au programme principal à la fin d'une sous routine lancée par une instruction CALL et met la valeur de k dans le registre de travail W
Nombre de cycles d'horloge: 2
Exemple:
Registre affecté: aucun
Cette instruction est utilisée pour lire des tableaux de grandes dimensions stockés en mémoire programme.
(Return from subroutine)
Provoque le retour au programme principal à la fin d'une sous routine lancée par une instruction CALL
Nombre de cycles d'horloge: 2
Registre affecté: aucun
(Rotate left f)
f(n)->dest(n+1), f(7)->C, C->dest(0)
f: (00 à 4F); d: (0 ou 1)
Le résultat est mis
Exemple 1: Avant l'instruction, peu importe le contenu de W , f contient b'00110011', et C contient 1
rlf Casemem,0; après l'instruction W contient b'01100111', Casemem est inchangé, C contient 0
Exemple 2: Avant l'instruction, peu importe le contenu de W , f contient b'00110011', et C contient 1
rlf Casemem,f ; après l'instruction W est inchangé, Casemem contient b'01100111' , C contient 0
On peut imposet la valeur de C par bcf ou STATUS,C
Avec C=0 au départ, un rlf revient à multiplier par deux
Nombre de cycles d'horloge: 1
Registre affecté: STATUS, C
(Rotate right)
f f(n)->dest(n-1), f(0)->C, C->dest(7)
f: (00 à 4F); d: (0 ou 1)
Le résultat est mis
Exemple 1: Avant l'instruction, peu importe le contenu de W , Casemem contient b'00110011', et C contient 1
rrf Casemem,0 ; après l'instruction W contient b'10011001', Casemem est inchangé, C contient 1
Exemple 2: Avant l'instruction, peu importe le contenu de W , f contient b'00110011', et C contient 1
rlf Casemem,1 ; après l'instruction W est inchangé, Casemem contient b'10011001' , C contient 1
Nombre de cycles d'horloge: 1
Registre affecté: STATUS, C
Avec C=0 au départ, un rrf revient à diviser par deux
(Go into Standby Mode)
Met le microcontrôleur en mode d'économie d'énergie
Une boucle contenant SLEEP tournera au rythme imposé par le Watchdog:
Debut
Nombre de cycles d'horloge: 1
Registre affecté: STATUS, NO_TO, NOT_PD
(Subtract W from literal)
k - (W) -> (W)
k: (0 à 255)
Retranche le contenu de W à la valeur k, et met le résultat dans W (méthode du complément à deux)
Exemple 1: Avant l'instruction W contient d'01'
sublw d'02' ; Aprè l'instruction, (W)= d'01', C=1 , Z=0
Exemple 2: Avant l'instruction W contient d'02'
sublw d'02' ; Aprè l'instruction, (W)= d'00', C=1 , Z=1 (résultat nul)
Exemple 3: Avant l'instruction W contient d'03'
sublw d'02' ; Aprè l'instruction, (W)= d'255', C=0 (résultat négatif), Z=0
Nombre de cycles d'horloge: 1
Registre affecté: STATUS, C, DC, Z
(Subtract W from f)
(f) - (W) -> (d)
f: (00 à 4F); d: (0 ou 1)
Retranche le contenu de W au contenu du registre f, (méthode du complément à deux), et met le résultat
Exemple 1: Avant l'instruction W contient d'02' , Casemem contient d'03'
subwf Casemem,1 ; Aprè l'instruction, W est inchangé, Casemem contient d'01' , C=1 , Z=0
Exemple 2: Avant l'instruction W contient d'02' , Casemem contient d'02'
subwf Casemem,1 ; Aprè l'instruction, W est inchangé, Casemem contient d'00' , C=1 , Z=1 (résultat =0)
Exemple 3: Avant l'instruction W contient d'02' , Casemem contient d'01'
subwf Casemem,1 ; Aprè l'instruction, W est inchangé, Casemem contient d'01' , C=0 (résultat négatif), Z=0
Nombre de cycles d'horloge: 1
Registre affecté: STATUS, C, DC, Z
(Swap halves f)
f(0:3)<->f(4:7)->d
f: (00 à 4F); d: (0 ou 1)
Prend les 4 bits de poids fort et les met à la place des 4 bits de poids faible
Prend les 4 bits de poids faible et les met à la place des 4 bits de poids fort
et met le résultat
Exemple 1: Avant l'instruction, peu importe le contenu de W et Casemem contient d'A5'
swapf Casemem,0 ; après l'instruction W contient d'5A' , Casemem contient toujours d'A5'
Exemple 2: Avant l'instruction peu importe le contenu de W et Casemem contient d'123'
swapf Casemem,1 ; après l'instruction le contenu de W n'a pas changé et Casemem contient d'5A'
Nombre de cycles d'horloge: 1
Registre affecté: aucun
(Exclusive OR literal and W)
k XOR (W) -> (W)
k: (0 à 255)
Fait bit à bit l'opération XOR entre le contenu de W et la valeur k, et met le résultat dans W
Exemple: Avant l'instruction W contient b'01101101'
Cette instruction permet d'inverser certains bits dans W; k devient un masque: les bits à 0 dans le masque ne changeront pas les bits correspondants dans W, les bits à 1 dans le masque iverseront les bits correspondants de W
Nombre de cycles d'horloge:1
Registre affecté: STATUS, Z
(Exclusive OR W and f)
(W) XOR (f) -> (d)
f: (00 à 4F); d: (0 ou 1)
Fait bit à bit l'opération XOR entre les contenus de W et de f, et met le résultat
Exemple1: Avant l'instruction W contient b'01001110' , Casemem contient b'01101101'
Exemple2: Avant l'instruction W contient b'01001110' , Casemem contient b'01101101'
Cette instruction permet d'inverser certains bits dans f; (W) devient un masque: les bits à 0 dans le masque ne changeront pas les bits correspondants dans f, les bits à 1 dans le masque iverseront les bits correspondants de f
Nombre de cycles d'horloge:1
Registre affecté: STATUS, Z
Retour au sommaire
© 1999-2009 A. Ducros F5AD