# Micro contrôleurs AVR/Annexe/Les instructions
## Les instructions

Il n'est absolument pas nécessaire de connaître la liste des instructions pour continuer ce projet. Mais n'ayant trouvé cette liste nulle part dans Wikipédia, je la donne ici sans plus d'explications.

### Instructions arithmétiques et logiques

| Mnemonics | Operands | Description | Opération | Flags | #Clocks |
| ADD | Rd, Rr | Additionne deux registres | Rd ←Rd+Rr | Z,C,N,V,H | 1 |
| ADC | Rd, Rr | Additionne deux registres avec la retenue | Rd← Rd+Rr+C | Z,C,N,V,H | 1 |
| ADIW | Rdl, K | Addition immédiate de mots | Rdh:Rdl←Rdh:Rdl + K | Z,C,N,V,S | 2 |
| SUB | Rd, Rr | Soustraire deux registres | Rd←Rd - Rr | Z,C,N,V,H | 1 |
| SUBI | Rd, K | Soustraire les constantes de deux registres | Rd←Rd - K | Z,C,N,V,H | 1 |
| SBC | Rd, Rr | Soustraire deux registres avec une retenue | Rd←Rd - Rr - C | Z,C,N,V,H | 1 |
| SBCI | Rd, K | Soustraire une constante du registre avec retenue | Rd←Rd - K - C | Z,C,N,V,H | 1 |
| SBIW | Rdl, K | Soustraction immédiate du mot | Rdh:Rdl←Rdh:Rdl - K | Z,C,N,V,S | 2 |
| AND | Rd, Rr | Registres du ET logique | Rd ← Rd * Rr | Z,N,V | 1 |
| ANDI | Rd, K | Registres du ET logique et constante | Rd ← Rd * K | Z,N,V | 1 |
| OR | Rd, Rr | OU logique entre registres | Rd ← Rd v Rr | Z,N,V | 1 |
| ORI | Rd, K | OU logique entre Registre et constante | Rd ← Rd v K | Z,N,V | 1 |
| EOR | Rd, Rr | OU exclusif entre registres | Rd ← Rd Rr | Z,N,V | 1 |
| COM | Rd | Complément à 1 | Rd ← 0xFF - Rd | Z,C,N,V | 1 |
| NEG | Rd | Complément à 2 | Rd ← 0x00 - Rd | Z,C,N,V,H | 1 |
| SBR | Rd, K | Mettre le(s) bit(s) dans un registre | Rd ← Rd v K | Z,N,V | 1 |
| CBR | Rd, K | Effacer le(s) bit(s) dans un registre | Rd ← Rd ET (0xFF-K) | Z,N,V | 1 |
| INC | Rd | Incremente | Rd ← Rd + 1 | Z,N,V | 1 |
| DEC | Rd | Decremente un registre | Rd ← Rd - 1 | Z,N,V | 1 |
| TST | Rd | Test si zero ou négatif | Rd ← Rd * Rd | Z,N,V | 1 |
| CLR | Rd | Effacer le registre | Rd ← Rd XOR Rd | Z,N,V | 1 |
| SER | Rd | Registre tout à 1 | Rd ← 0xFF | None | 1 |
| MUL | Rd, Rr | Multiplication (non signée) | R1:R0← Rd * Rr | Z,C | 2 |
| MULS | Rd, Rr | Multiplication (signée) | R1:R0← Rd * Rr | Z,C | 2 |
| MULSU | Rd, Rr | Multiplication signé par non signé | R1:R0← (Rd * Rr) <<1 | Z,C | 2 |
| FMUL | Rd, Rr | Multiplication fractionnaire non signée | R1:R0 ← (Rd * Rr) << 1 | Z,C | 2 |
| FMULS | Rd, Rr | Multiplication fractionnaire signée | R1:R0← (Rd * Rr) << 1 | Z,C | 2 |
| FMULSU | Rd, Rr | Multiplication fractionnaire non signée et non signée | R1:R0← (Rd * Rr) << 1 | Z,C | 2 |

### Instructions de sauts

| Mnemonics | Operands | Description | Opération | Flags | #Clocks |
| RJMP | K | Saut relatif | PC ← PC + k + 1 | None | 2 |
| IJMP | | Saut indirect vers (Z) | PC ← Z | None | 2 |
| RCALL | K | Appel du sous-programme en relatif | PC ← PC + k + 1 | None | 3 |
| ICALL | | Appel indirect de (Z) | PC ← Z | None | 3 |
| RET | | Retour de sous-programme | PC ← STACK | None | 4 |
| RETI | | Retour d'interruption | PC ← STACK | I | 4 |
| CPSE | Rd,Rr | Compare et saute si égal | if(Rd=Rr) PC← PC + 2 or 3 | None | |
| CP | Rd, Rr | Compare | Rd - Rr | Z,N,V,C,H | 1 |
| CPC | Rd, Rr | Compare avec la retenue | Rd – Rr - C | Z,N,V,C,H | 1 |
| CPI | Rd, K | Comparaison en immédiat | Rd - K | Z,N,V,C,H | 1 |
| SBRC | Rr, b | Saut si le bit du registre est effacé | if(Rr(b)=0) PC← PC + 2 or 3 | None | 1/2/3 |
| SBRS | Rr, b | Saute si le bit du registre et positionné à 1 | if(Rr(b)=1) PC← PC + 2 or 3 | None | |
| SBIC | P, b | Saute si bit registre d'entrées/sorties est à 0 | if(P(b)=0) PC← PC + 2 or 3 | None | |
| SBIS | S, K | Saute si bit registre d'entrées/sorties est à 1 | if(P(b)=1) PC← PC + 2 or 3 | None | |
| BRBS | S, K | Brancher si le drapeau est mis | if(SREG(s)=1) then PC PC+K+1 | None | |
| BRBC | S,K | Brancher si le drapeau est effacé | if(SREG(s)=0) then PC PC+K+1 | None | |
| BREQ | k | Brancher si égalité | if(Z=1) then PC ← PC + k +1 | None | |
| BRNE | k | Brancher si non égal | if(Z=0) then PC← PC + k +1 | None | |
| BRCS | k | Brancher si la retenue est mise | if(C=1) then PC ← PC + k +1 | None | |
| BRCC | k | Brancher si la retenue est effacée | if(C=0) then PC ← PC + k +1 | None | |
| BRSH | k | Brancher si idem ou supérieur | if(C=0) then PC ← PC + k +1 | None | |
| BRLO | k | Brancher si inférieur | if(C=1) then PC ← PC + k +1 | None | |
| BRMI | k | Brancher si minimum | if(N=1) then PC ← PC + k +1 | None | |
| BRPL | k | Brancher si maxi | if(N=0) then PC ← PC + k +1 | None | |
| BRGE | k | Brancher si supérieur ou égale, signé | if(N V=0) then PC ← PC + k +1 | None | |
| BRLT | k | Brancher si inferieure a 0 (signé) | if(N V=1) then PC ← PC + k +1 | None | |
| BRHS | k | Brancher si toutes les retenues du drapeau sont mises | if(H=1) then PC ← PC + k +1 | None | |
| BRHC | k | Brancher si toutes les retenues du drapeau sont effacées | if(H=0) then PC ← PC + k +1 | None | |
| BRTS | k | Brancher si T flag est mis | if(T=1) then PC ← PC + k +1 | None | |
| BRTC | k | Brancher si T flag est | if(T=0) then PC ← PC + k +1 | None | |
| BRVS | k | Brancher si l'Overflow est à un | if(V=1) then PC ← PC + k +1 | None | |
| BRVC | k | Brancher si l'Overflow est effacé | if(T=0) then PC ← PC + k +1 | None | |
| BRIE | k | Brancher si l'interruption est permise | if(I=1) then PC ← PC + k +1 | None | |
| BRID | k | Brancher si l'interruption n’est pas permise | if(I=0) then PC ← PC + k +1 | None | |

### Instructions de transfert de données

| Mnemonics | Operands | Description | Opération | Flags | #Clocks |
| MOV | Rd, Rr | Copier un registre dans un autre | Rd← Rr | None | 1 |
| MOVW | Rd, Rr | Copier un mot dans un autre | Rd+1:Rd← Rr+1:Rr | None | 1 |
| LDI | Rd, K | Charger en immédiat | Rd← Knone1 | | |
| LD | Rd, X | Chargeer en indirect | Rd← (x) | None | 2 |
| LD | Rd, X+ | Chargement indirect et Post-inc. | Rd← (x), x← x+1 | None | 2 |
| LD | Rd, - X | Chargement indirect et Pre-Dec. | x← x-1, Rd← (x) | None | 2 |
| LD | Rd, Y | Chargement indirect | Rd← (y) | None | 2 |
| LD | Rd, Y+ | Chargement indirect et Post-inc | Rd← (y), y← y+1 | None | 2 |
| LD | Rd, - Y | Chargement indirect et Pre-Dec. | y← y-1, Rd← (y) | None | 2 |
| LDD | Rd, Y+q | Chargement indirect avec déplacement | Rd← (y +q ) | None | 2 |
| LD | Rd, Z | Chargement indirect | Rd← (z) | None | 2 |
| LD | Rd, Z+ | Chargement indirect et Post-inc | Rd← (z), z← z+1 | None | 2 |
| LD | Rd, -Z | Chargement indirect et Pre-Dec. | z← z-1, Rd← (z) | None | 2 |
| LDD | Rd, Z+q | Chargement indirect avec déplacement | Rd← (z +q ) | None | 2 |
| LDS | Rd, K | Chargement direct avec SRAM | Rd← (k) | None | 2 |
| ST | X, Rr | Stockage indirect | (x) ← Rr | None | 2 |
| ST | X+, Rr | Stockage indirect et Post-inc | (x) ← Rr, x← x+1 | None | 2 |
| ST | -X, Rr | Stockage indirect et Pre-Dec. | x← x-1, (x)← Rr | None | 2 |
| ST | Y, Rr | Stockage indirect | (y) ← Rr | None | 2 |
| ST | Y+, Rr | Stockage indirect et Post-inc. | (y) ← Rr, y← y+1 | None | 2 |
| ST | -Y, Rr | Stockage indirect et Pre-Dec. | y← y-1, (y)← Rr | None | 2 |
| STD | Y+q, Rr | Stockage indirect avec déplacement | (y + q) ← Rr | None | 2 |
| ST | Z, Rr | Stockage indirect | (z) ← Rr | None | 2 |
| ST | Z+, Rr | Stockage indirect et Post-inc | (z) ← Rr, z← z+1 | None | 2 |
| ST | -Z, Rr | Stockage indirect et Pre-dec. | z← z-1, (z)← Rr | None | 2 |
| STD | Z+q, Rr | Stockage indirect avec déplacement | (z + q) ← Rr | None | 2 |
| STS | K, Rr | Stockage direct de SRAM | (k) ← Rr | None | 2 |
| LPM | | Chargement du programme de la mémoire | R0← (z) | None | 3 |
| LPM | Rd, Z | Chargement du programme de la mémoire | Rd← (z) | None | 3 |
| LPM | Rd, Z+ | Chargement du programme de la mémoire et Post-inc | Rd← (z), z← z+1 | None | 3 |
| SPM | | Stockage du programme de la mémoire | (z)← R1:R0 | None | - |
| IN | Rd, P | In port | Rd← PNone1 | None | |
| OUT | P, Rr | OUT Port | P← Rr | None | 1 |
| PUSH | Rr | Pousse le registre dans la pile | STACK ← Rr | None | 2 |
| POP | Rd | Enlever le registre de la pile | Rd←STACK | None | 2 |

### Instructions sur bits et tests sur bit

| Mnemonics | Operands | Description | Opération | Flags | #Clocks |
| SBI | P,b | Positionne un bit à 1 | I/O(p,b)← 1 | None | 2 |
| CBI | P,b | Positionne un bit à 0 | I/O(p,b)← 0 | None | 2 |
| LSL | Rd | décalage vers la gauche | Rd(n+1)←Rd(n),Rd(0)← 0 | Z,C,N,V | 1 |
| LSR | Rd | décalage vers la droite | Rd(n)←Rd(n+1),Rd(7)← 0 | Z,C,N,V | 1 |
| ROL | Rd | décalage circulaire gauche | Rd(0)←C,Rd(n+1)←Rd(n),C← Rd(7) | Z,C,N,V | 1 |
| ROR | Rd | décalage circulaire droite | Rd(7)←C,Rd(n)←Rd(n+1),C← Rd(0) | Z,C,N,V | 1 |
| ASR | Rd | décalage arithmétique droit | Rd(n)←Rd(n+1), n=0..6 | Z,C,N,V | 1 |
| SWAP | Rd | échange poids/fort/faible | Rd(3..0)←Rd(7..4),Rd(7..4),← Rd(3..0) | None | 1 |
| BSET | s | | SREG(s)← 1 | SREG(s) | 1 |
| BCLR | s | | SREG(s)← 0 | SREG(s) | 1 |
| BST | Rr, b | | T← Rr(b) | T | 1 |
| BLD | Rd, b | | Rd(b)←T | None | 1 |
| SEC | | Mettre la retenue à 1 | C←1 | C | 1 |
| CLC | | Mettre la retenue à 0 | C←0 | C | 1 |
| SEN | | | N←1 | C | 1 |
| CLN | | | N←0 | N | 1 |
| SEZ | | mise à 1 de Z | Z←1 | C | 1 |
| CLZ | | mise à 0 de Z | Z←0 | Z | 1 |
| SEI | | Autorisation des interruptions globales | I←1 | I | 1 |
| CLI | | Désactivation des interruptions globales | I←0 | I | 1 |
| SES | | Positionnement à 1 le test de signe | S←1 | S | 1 |
| CLS | | Positionnement à 0 le test de signe | S←0 | S | 1 |
| SEV | | Positionne le dépassement en complément à deux | v←1 | V | 1 |
| CLV | | Annule le dépassement en complément à deux | V←0 | V | 1 |
| SET | | Set T in SREG | T←1 | T | 1 |

## Classement du jeu d'instructions par architectures

Toutes les instructions ne sont pas implantées dans les micro contrôleurs Atmel AVR. C'est le cas des instructions réalisant des multiplications, des loads/jumps/calls étendus, long jumps, et la gestion de l'énergie.
| Familles | Membres | Arithmétique | Branchements | Transferts | Opérations sur Bit |
| Cœur Minimal | AT90S1200 ATtiny11 ATtiny12 ATtiny15 ATtiny28 | ADD ADC SUB SUBI SBC SBCI AND ANDI OR ORI EOR COM NEG SBR CBR INC DEC TST CLR SER | RJMP RCALL RET RETI CPSE CP CPC CPI SBRC SBRS SBIC SBIS BRBS BRBC BREQ BRNE BRCS BRCC BRSH BRLO BRMI BRPL BRGE BRLT BRHS BRHC BRTS BRTC BRVS BRVC BRIE BRID | LD ST MOV LDI IN OUT LPM (not in AT90S1200) | SBI CBI LSL LSR ROL ROR ASR SWAP BSET BCLR BST BLD SEC CLC SEN CLN SEZ CLZ SEI CLI SES CLS SEV CLV SET CLT SEH CLH NOP SLEEP WDR |
| Cœur classique avec jusqu'à 8K de mémoire programme | AT90S2313 AT90S2323 ATtiny22 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90C8534 AT90S8535 ATtiny26 ATmega8515 | nouvelles instructions: ADIW SBIW | nouvelles instructions: IJMP ICALL | nouvelles instructions: LD (now 9 modes) LDD LDS ST (9 modes) STD STS PUSH POP | (rien de nouveau) |
| Cœur classique avec jusqu'à 128K de mémoire programme | ATmega103 ATmega603 AT43USB320 AT76C711 | (rien de nouveau) | nouvelles instructions: JMP CALL | nouvelles instructions: ELPM | (rien de nouveau) |
| Cœur étendu avec jusqu'à 8K de mémoire programme | ATmega8 ATmega83 ATmega85 | new instructions: MUL MULS MULSU FMUL FMULS FMULSU | (rien de nouveau) | nouvelles instructions: MOVW LPM (3 modes) SPM | (rien de nouveau) |
| Cœur étendu avec jusqu'à 128K de mémoire programme | ATmega16 ATmega161 ATmega163 ATmega32 ATmega323 ATmega64 ATmega128 AT43USB355 AT94 (FPSLIC) AT90CAN series AT90PWM series ATmega48 ATmega88 ATmega168 ATmega162 ATtiny13 ATtiny25 ATtiny45 ATtiny85 ATtiny2313 ATmega164 ATmega324 ATmega328 ATmega644 ATmega165 ATmega169 ATmega325 ATmega3250 ATmega645 ATmega6450 ATmega406 | (rien de nouveau) | (rien de nouveau) | (rien de nouveau) | nouvelles instructions: BREAK |
| Enhanced Core with up to 4M | ATmega640 ATmega1280 ATmega1281 ATmega2560 ATmega2561 | (rien de nouveau) | new instructions: EIJMP EICALL | (rien de nouveau) | (rien de nouveau) |
| XMEGA core | ATxmega series | new instructions: DES | (rien de nouveau) | new instructions: (from second revision silicon - AU,B,C parts) XCH LAS LAC LAT | (rien de nouveau) |
| Cœur réduit | ATtiny10 ATtiny9 ATtiny5 ATtiny4 | (Identique au cœur minimal, sauf pour l’ensemble des registres) | (Identique au cœur classique jusqu'à 8k, sauf pour l’ensemble des registres) | Identique au core classique jusqu'à 8k, avec les exceptions suivantes: LPM (retiré) LDD (retiré) STD (retiré) LD (aussi les acces à la mémoire programme) LDS (codé différemment) STS (codé différemment) ensemble de registres réduit | (Identique au cœur étendu jusqu'à 128K, sauf que l’ensemble de registres est réduit) |