Você está na página 1de 102

Assembleur Microcontrleur ATMEGA32

Les microcontrleurs de la famille ATMEGA en technologie CMOS sont des modles 8 bits AVR bass sur larchitecture RISC. En excutant des instructions dans un cycle d'horloge simple, l'ATMEGA ralise des oprations s'approchant de 1 MIPS par MHZ permettant de raliser des systmes faible consommation lectrique et simple au niveau lectronique.

Note : Une partie des figures de ce document provienne de la documentation officielle ATMEL et plus spcialement du modle ATMEGA32. Le reste est de ma conception personnel.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

Table des Matires


Assembleur Microcontrleur ATMEGA32 ___________________________________________________ 1 Introduction ____________________________________________________________________________ 7 La Syntaxe Utilise ______________________________________________________________________ 8 Le Plan Mmoire ________________________________________________________________________ 9 La mmoire programme ________________________________________________________________9 La mmoire de donne ________________________________________________________________10 La mmoire morte ___________________________________________________________________10 Base et Opration Logiques ______________________________________________________________ 11 Les Oprations Boolennes ____________________________________________________________ 11 Loprateur ET (&)___________________________________________________________________11 Loprateur OU (!) ___________________________________________________________________11 Loprateur OU Exclusif () ___________________________________________________________11 Loprateur NON () _________________________________________________________________11 Les Bases 16, 10 et 2 __________________________________________________________________ 12 Les Registres dEtat SREG _______________________________________________________________ 13 Registre SREG (Status Register) ________________________________________________________13 Mode dAdressage ______________________________________________________________________ 14 Les Oprateurs ______________________________________________________________________ 14 Accs Direct Simple (Rd) ______________________________________________________________ 14 Accs Direct deux oprateurs (Rr et Rd) _______________________________________________ 15 Adresse des Entre/Sorties (A) _________________________________________________________ 15 Adresse Direct des Donnes (k)_________________________________________________________ 15 Adressage Indirect (X, Y ou Z) _________________________________________________________ 16 Adressage Indirect avec Dplacement (q) ________________________________________________ 16 Adressage Indirect avec pr-dcrment (-X, -Y ou -Z)______________________________________ 16 Adressage Indirect avec post-incrment (-X, -Y ou -Z) _____________________________________ 17 Adressage des instructions LPM, ELPM et SPM __________________________________________ 17 Adressage des instructions post-incrmentes LPM Z+, ELPM Z+ ___________________________ 18 Adressage Direct pour les instructions JMP et CALL ______________________________________ 18 Adressage Indirect pour les instructions IJMP et ICALL ___________________________________ 18 Adressage Relatif pour les instructions RJMP et RCALL___________________________________ 19 Les instructions de branchement _______________________________________________________ 19 Jeu dInstruction _______________________________________________________________________ 20 Lgende du jeu dinstruction___________________________________________________________ 24 Registres et Oprateurs________________________________________________________________24 RAMPX, RAMPY, RAMPZ, RAMPD ___________________________________________________24 EIND _____________________________________________________________________________24 STACK ____________________________________________________________________________24 DRAPEAU _________________________________________________________________________24 Les Instructions ________________________________________________________________________ 25

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

Mode de Lecture _____________________________________________________________________ 25 ADC Add with Carry Addition avec Retenue __________________________________________ 25 ADD Add without Carry Addition sans Retenue _______________________________________ 26 ADIW Add Immediat Word Addition Immdiate sur 16 bits _____________________________ 26 AND Logical AND ET Logique______________________________________________________ 27 ANDI Logical AND with Immediate ET Logique Immdiat ______________________________ 27 ASR Arithmetic Shift Right Dcalage Arithmtique Droite _____________________________ 28 BCLR Bit Clear in SREG Efface le Bit s Correspondant dans SREG _____________________ 28 BLD Bit Load from the T Flag in SREG to a bit b Charge Registre avec T __________________ 29 BRBC Branch if Bit in SREG is Cleared Branche Conditionnelle Relatif si SREG(s)=0 _______ 29 BRBS Branch if Bit in SREG is Set - Branche Conditionnelle Relatif si SREG(s) = 1___________ 30 BRCC Branch if Carry Cleared Branchement si Pas de Retenue C = 0_____________________ 30 BRCS Branch if Carry Set - Branchement si Retenue C = 1 _______________________________ 31 BREAK Break Pause du MCU ______________________________________________________ 31 BREQ Branch if Equal Branchement si Egal Z = 1 _____________________________________ 32 BRGE Branch if Greater or Equal (Signed) Branchement si Suprieur ou Egal S=0 _________ 32 BRHC Branch if Half Carry Flag is Cleared Branchement si Demi Retenue H = 0 ___________ 33 BRHS Branch if Half Carry Flag is Set Branchement si Demie Retenue H = 1 ______________ 33 BRID Branch if Global Interrupt is Disabled Branchement si Interruption Arrt ___________ 34 BRIE Branch if Global Interrupt is Enabled Branchement si Interruption Active ___________ 34 BRLO Branch if Lower (Unsigned) Branchement si Infrieur C = 1 _______________________ 35 BRLT Branch if Less Than (Signed) Branchement si Inferieur Sign S = 1 _________________ 35 BRMI Branch if Minus Branchement si Ngatif N = 1___________________________________ 36 BRNE Branch if Not Equal Branchement si non Egale Z = 0 _____________________________ 36 BRPL Branch if Plus Branchement si Positif N = 0 _____________________________________ 37 BRSH Branch if Same or Higher (Unsigned) Branchement si = ou Plus Grand C=0 __________ 37 BRTC Branch if the T Flag is Cleared Branchement si Test T = 0_________________________ 38 BRTS Branch if the T Flag is Set Branchement si Test T = 1 _____________________________ 38 BRVC Branch if Overflow Cleared Branchement si non Dpassement V = 0 ________________ 39 BRVS Branch if Overflow Set Branchement si Dpassement V = 1 ________________________ 39 BSET Bit Set in SREG Mise 1 du Bit s de SREG ____________________________________ 40 BST Bit Store fromBit in Register to T Flag in SREG Stock Registre dans T ________________ 40 CALL Long Call to a Subroutine Appel Long de Sous-programme________________________ 41 CBI Clear Bit in I/O Register Mise 0 dun Registre dEntre/Sortie ______________________ 41 CBR Clear Bits in Register Efface les Bits dun Registre en Complment 1________________ 42 CLC Clear Carry Flag Efface la Retenue C = 0 ________________________________________ 42 CLH Clear Half Carry Flag Efface la Demi Retenue H = 0_______________________________ 43 CLI Clear Global Interrupt Flag Dsactive les Interruptions I = 0 ________________________ 43 CLN Clear Negative Flag Efface Ngative N = 0________________________________________ 44 CLR Clear Register Effacement du Registre___________________________________________ 44 CLS Clear Signed Flag Efface le Signe S = 0 ___________________________________________ 45 CLT Clear T Flag Efface le Test T = 0________________________________________________ 45 CLV Clear Overflow Flag Efface le Dbordement V = 0 _________________________________ 45 CLZ Clear Zero Flag Efface le Zro Z = 0_____________________________________________ 46 Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 3

COM Ones Complement Complment 1 ____________________________________________ 46 CP Compare Comparaison de Registre _______________________________________________ 47 CPC Compare with Carry Comparaison avec Retenue 16 bits ____________________________ 47 CPI Compare with Immediate Comparaison avec Valeur Immdiate ______________________ 48 CPSE Compare Skip if Equal Comparaison et Saut si Egale _____________________________ 48 DEC Decrement - Dcrmentation ____________________________________________________ 49 EICALL Extended Indirect Call to Subroutine Appel Indirect au Sous-Programme _________ 50 EIJMP Extended Indirect Jump Saut Indirect avec Z & EIND ___________________________ 50 ELPM Extended Load Program Memory Chargement Programme Mmoire Etendue _______ 51 EOR Exclusive OR OU exclusif _____________________________________________________ 52 FMUL Fractional Multiply Unsigned Multiplication Fractionnaire non Sign _______________ 52 FMULS Fractional Multiply Signed Multiplication Fractionnaire Sign ___________________ 53 FMULSU Fractional Multiply Signed with Unsigned Multipication Sign-non Sign _________ 54 ICALL Indirect Call to Subroutine Appel de Sous-programme Indirect ___________________ 55 IJMP Indirect Jump Saut Indirect ___________________________________________________ 55 IN - Load an I/O Location to Register Lecture dune Entre/Sortie _________________________ 56 INC Increment - Incrment __________________________________________________________ 56 JMP Jump - Saut ___________________________________________________________________ 57 LD Load Indirect from Data Space to Register using Index X Charge Indirect X ____________ 58 LD (LDD) Load Indirect from Data Space to Register using Index Y Charge Indirect Y ______ 59 LD (LDD) Load Indirect From Data Space to Register using Index Z Charge Indirect Z______ 60 LDI Load Immediate Charge Valeur Immdiate _______________________________________ 61 LDS Load Direct from Data Space Charge Direct ______________________________________ 61 LPM Load Program Memory Charge un Programme en Mmoire ________________________ 62 LSL Logical Shift Left Dcalage Logique Gauche _____________________________________ 63 LSR Logical Shift Right Dcalage Logique Droite_____________________________________ 63 MOV Copy Register Copie de Registre _______________________________________________ 64 MOVW Copy Register Word Copie dun Registre sur 16 bits _____________________________ 64 MUL Multiply Unsigned Multiplication non Sign______________________________________ 65 MULS Multiply Signed Multiplication Sign __________________________________________ 65 MULSU Multiply Signed with Unsigned Multiplication Sign et non Sign _________________ 66 NEG Twos Complement Complment Deux _________________________________________ 67 NOP No Operation Pas dOpration _________________________________________________ 67 OR Logical OR OU Logique ________________________________________________________ 68 ORI Logical OR with Immediate OU Logique Immdiat ________________________________ 68 OUT Store Register to I/O Location Ecriture dune Entre/Sortie_________________________ 69 POP Pop Register from Stack Restaure la Donne de la Pile _____________________________ 69 PUSH Push Register on Stack Stock un Registre sur la Pile ______________________________ 70 RCALL Relative Call to Subroutine Appel Relatif dun Sous-programme __________________ 70 RET Return from Subroutine Retour de Sous-programme ______________________________ 71 RETI Return from Interrupt Retour dInterruption ____________________________________ 71 RJMP Relative Jump Saut Relatif ___________________________________________________ 72 ROL Rotate Left trough Carry Rotation Gauche avec Retenue _________________________ 72 ROR Rotate Right through Carry Rotation Droite avec Retenue ________________________ 73 Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 4

SBC Subtract with Carry Soustraction avec Retenue ___________________________________ 74 SBCI Subtract Immediate with Carry Soustraction Immdiate avec Retenue _______________ 74 SBI Set Bit in I/O Register Active le Bit des Entre/Sortie _______________________________ 75 SBIC Skip if Bit in I/O Register is Cleared Saute si Bit I/O est 0_________________________ 75 SBIS Skip if Bit in I/O Register is Set Saute si Bit I/O est 1 _____________________________ 76 SBIW Subtract Immediate from Word Soustraction Immdiate 16 bits ____________________ 76 SBR Set Bits in Register Active le Bit du Registre ______________________________________ 77 SBRC Skip if Bit in Register is Cleared Saute si le Bit du Registre est 0___________________ 77 SBRS Skip if Bit in Register is Set Saute si le Bit du Registre est 1 _______________________ 78 SEC Set Carry Flag Active la Retenue C = 1___________________________________________ 78 SEH Set Half Carry Flag Active la Demi Retenue H = 1 _________________________________ 79 SEI Set Global Interrupt Flag Active les Interruptions I = 1______________________________ 79 SEN Set Negative Flag Active le Signe S = 1 ___________________________________________ 79 SER Set all Bits in Register Active Tous les Bits du Registre _____________________________ 80 SES Set Signed Flag Active les Nombres Signs S = 1 ___________________________________ 80 SET Set T Flag Active le Test T = 1 __________________________________________________ 81 SEV Set Overflow Flag Active le dbordement V = 1____________________________________ 81 SEZ Set Zero Flag Active le Zro Z = 1 _______________________________________________ 81 SLEEP Mode Sommeil ______________________________________________________________ 82 SPM Store Program Memory Stock le Programme en Mmoire __________________________ 82 ST Store Indirect From Register to Data Space using Index X Stock Indirect X _____________ 84 ST (STD) Store Indirect From Register to Data Space using Index Y Stock Indirect Y _______ 85 ST (STD) Store Indirect From Register to Data Space using Index Z Stock Indirect Z________ 86 STS Store Direct to Data Space Stock Direct dans lEspace Donne _______________________ 87 SUB Subtract without Carry Soustraction sans Retenue _________________________________ 87 SUBI Subtract Immediate Soustraction Immediate _____________________________________ 88 SWAP Swap Nibbles Echange Rciproque de Demi Octet _______________________________ 88 TST Test for Zero or Minus Test Zro ou Ngatif ______________________________________ 89 WDR Watchdog Reset Remise Zro du Chien de Garde _______________________________ 89 Lassembleur __________________________________________________________________________ 90 Dbut Rapide _______________________________________________________________________ 90 Dmarrage _________________________________________________________________________90 Assemblage de Votre Premier Fichier ____________________________________________________90 Dcouverte et Correction d'Erreurs ______________________________________________________91 Rassemblage _______________________________________________________________________91 Assembler un programme source _______________________________________________________ 92 Example ___________________________________________________________________________92 Directives dAssemblage ______________________________________________________________ 93 BYTE Reserve bytes to a variable - Rserve d'octet pour une variable _________________________93 CSEG Code Segment - Segment de Code________________________________________________94 DB-Define constant byte(s) in program memory or EEPROM memory - Dfinit le(s) octet(s) constant_94 DEF - Set a symbolic name on a register - Dfinit un nom symbolique pour un registre _____________94 DEVICE Define which device to assemble for - Dfinit le modle pour lassemblage _____________95 DSEG Data Segment - Segment de Donnes _____________________________________________95 Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 5

DW - Define constant word(s) in program memory or EEPROM memory - Dfinit le(s) mot(s) constant __________________________________________________________________________________95 ENDMACRO End macro - Fin macro __________________________________________________96 EQU - Set a symbol equal to an expression - Attribut un symbole une expression ________________96 ESEG EEPROM Segment - Segment EEPROM __________________________________________96 EXIT - Exit this file - Sortie du fichier ___________________________________________________96 INCLUDE Include another file - Importe la source d'un autre fichier __________________________97 LIST - Turn the listfile generation on - Met en route la gnration de listfile ______________________97 LISTMAC Turn macro expansion on - Met en route l'extension macro_________________________97 MACRO Begin macro - Commence une macro ___________________________________________98 NOLIST - Turn listfile generation off - Arrt de la gnration de listfile _________________________98 ORG - Set program origin - Origine du programme en mmoire _______________________________98 SET - Set a symbol equal to an expression - Dclare un symbole pour une expression ______________99 Les Expressions de lAssembleur ______________________________________________________ 100 Operandes _________________________________________________________________________100 Fonctions _________________________________________________________________________100 Oprateurs ________________________________________________________________________100 Unaire Symbole : ! __________________________________________________________________100 Ngation Symbole : ~ ________________________________________________________________100 Moins Symbole : - __________________________________________________________________100 Multiplication Symbole : *____________________________________________________________100 Division Symbole : /_________________________________________________________________101 Addition Symbole : + ________________________________________________________________101 Soustraction Symbole : - _____________________________________________________________101 Dcalage Gauche Symbole : << ________________________________________________________101 Dcalage Droit Symbol: >> ___________________________________________________________101 Plus Petit Que Symbole : <____________________________________________________________101 Plus Petit ou Equale Symbole : <=______________________________________________________101 Plus Grand Que Symbole : > __________________________________________________________101 Plus Grand ou Equale Symbole : >= ____________________________________________________101 Equale Symbole : == ________________________________________________________________101 Non Equale Symbole : != _____________________________________________________________101 ET entre valeur Symbol : & ___________________________________________________________102 OU Exclusif Logique Symbol : ^ _______________________________________________________102 OU entre deux valeur Symbol : | _______________________________________________________102 ET Logique Symbol : && ____________________________________________________________102 OU Logique Symbol : || ______________________________________________________________102

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

Introduction
Ce document est la suite du document Microcontrleur ATMEL ATMEGA que jai ralis en novembre 2003. Vous trouverez dans ce document plusieurs chapitres sur linitiation au microcontrleur ATMEGA et son assembleur avec le descriptif complet des 131 instructions. Tout dabord, une prsentation des lments du microcontrleur est ncessaire pour comprendre le fonctionnement du MCU et de laction des instructions sur les lments tel que la mmoire, lunit arithmtique et logique, lEEPROM et les interfaces diverses. Un rappel sommaire des oprations logiques (ET, OU, NON, OU Exclusif) et la conversion dcimale hexadcimale et binaire sera aborder. Le fonctionnement des indicateurs du registre de statut SREG avec le positionnement en fonction des oprations arithmtiques et logiques. Le mode dadressage et les oprations de saut et sous-programme et enfin le dtaille de chaque instruction est prvue suivie par la programmation en assembleur avec quelques exemples plus ou moins complexe. Puis le desciptif des 131 instructions suivie dune entre en matire de lassembleur dATMEL clotura ce document. Bien entendu, vous pouvez me signaler les erreurs ventuelles qui se seraient glisses dans ce document lissus de mon plein gr ! Mon mail est maintenant : Balade.nono@voila.fr.

Trs bonne lecture vous !

Jean-Nol, en Janvier 2005 en Gambie.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

La Syntaxe Utilise
Pour que ce document ne soit pas trop indigeste, je lai organis en chapitre et dcoup en module simple ou chaque instruction est dtaill et en prenant des exemples simple puis complexe pour entre en douceur, si cest rellement possible, dans lunivers du microcontrleur. Les fonctions des registres sont marques en GRAS et les instructions sont en GRAS ITALIQUE. Pour les chiffres : Les donnes en dcimales sont critent sans signe spcifique, Les donnes en Hexadcimales sont prcd du signe $, exemple : $10 vaut 16 en dcimal, Les donnes en binaire sont prcd dun b et suivie de 8 0/1, exemple : b00010001 soit 17 en dcimal.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

Le Plan Mmoire
Le curs AVR combine 32 registres spciaux travaillants directement avec l'Unit Arithmtique de Logique ALU, qui reprsente le registre daccumulateur A (B ou D) dans les microcontrleurs classiques. Ces registres spciaux permettent deux registres indpendants d'tre en accs directe par lintermdiaire dune simple instruction et excute sur un seul cycle d'horloge. Cela signifie que pendant un cycle d'horloge simple lUnit Arithmtique et Logique ALU excute l'opration et le rsultat est stock en arrire dans le registre de sortie, le tout dans un cycle d'horloge. L'architecture rsultante est plus efficace en ralisant des oprations jusqu' dix fois plus rapidement quavec des microcontrleurs conventionnels CISC. Les registres spciaux sont dit aussi registre d'accs rapide et 6 des 32 registres peuvent tre employs comme trois registre d'adresse 16 bits pour l'adressage indirects d'espace de donnes (X, Y & Z). Le troisime Z est aussi employ comme indicateur d'adresse pour la fonction de consultation de table des constantes. Les 32 registres sont dtalls dans le tableau qui suit avec ladresse effective dans la mmoire SRAM : Bit 7 0 Adresse Registre Spciaux R0 $00 R1 $01 Rn $xx R26 $1A Registre X Partie Basse R27 $1B Registre X Partie Haute R28 $1C Registre Y Partie Basse R29 $1D Registre Y Partie Haute R30 $1E Registre Z Partie Basse R31 $1F Registre Z Partie Haute Comme vous lavez compris, trois types de mmoire sont utilises dans la srie ATMEGA, la mmoire programme FLASH, la mmoire de donne SRAM et la mmoire morte de type EEPROM. La mmoire programme La mmoire programme permet de stoker et de faire fonctionner le microcontrleur, il contient de 4 256 Ko de programme selon le modle du microcontrleur. Le nombre dcriture sur cette mmoire est limit 10.000, largement suffisant pour la majorit des applications. La figure 1 donne un exemple de ladressage de la mmoire FLASH du modle ATMEGA 32.

Figure 1, Adressage de la mmoire FLASH.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

La mmoire de donne La mmoire de donne contient les 32 registres de travail, les 64 registres de commande et la mmoire SRAM pour les variables du programme de 2048 octets pour le modle ATMEGA 32. La figure 2 prsente les relations entre espace physique et registre.

Figure 2, la mmoire de donne avec la SRAM. La mmoire morte La mmoire morte est de type EEPROM daccs plus complexe contiendra la configuration du programme et les donnes importantes qui seront sauves pendant labsence de courant lectrique. On peut crire jusqu 100.000 fois dans lEEPROM. La taille de lEEPROM est fonction du modle de microcontrleur ATMEGA (de 256 bits 8 Ko).

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

10

Base et Opration Logiques


Voici un petit rappel sur les bases hexadcimale, binaire et les oprations logiques pour en comprendre le fonctionnement. Attention : les oprateurs logiques ici employs sont des rfrences internationnales, mais ne sont maleureusement pas les mmes que ceux utiliss par lassembleur pour des raisons de droit principalement.

Les Oprations Boolennes


Loprateur ET (&) Loprateur ET est une multiplication boolenne qui si les deux valeurs sont 1 donnera un rsultat 1 : Oprateur 1 Oprateur 2 ET Logique 0 0 0 0 1 0 1 0 0 1 1 1

Loprateur OU (!) Loprateur OU est une addition boolenne qui si lune des deux valeurs est 1 donnera un rsultat 1 : Oprateur 1 Oprateur 2 OU Logique 0 0 0 0 1 1 1 0 1 1 1 1

Loprateur OU Exclusif () Loprateur OU Exclusif est une addition boolenne exclusive qui si lune des deux valeurs seulement est 1 donnera un rsultat 1 : Oprateur 1 Oprateur 2 OU Exc. Logique 0 0 0 0 1 1 1 0 1 1 1 0

Loprateur NON () Loprateur NON est une ngation boolenne qui inverse la valeur, un 1 donnera un rsultat 0 et vis versa : Oprateur NON Logique 0 1 1 0 La combinaison des oprations est possible et par exemple un ET et un NON donnera un NONET qui inversera le rsultat tout simplement. Dans le document qui suit, les valeurs NON seront misent en rouge.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

11

Les Bases 16, 10 et 2


Les chiffres et les nombres ne sont pas reprsents tel quel dans la mmoire du microcontrleur, ils sont converties en information binaire (en base 2) sur 8 bits (Bit = lment binaire valant 0 ou 1), qui donne un octet (octet ensemble de 8 bits) et sont reprsentes de la manire suivant : b00000000. On peut avoir jusqu' 256 valeurs diffrente avec se systme, de 0 255 avec 8 bits dinformations. Inconvnient majeur, ce nest pas trs pratique daligner des lignes de 0 et de 1 pour criture un programme. La conversion en hexadcimale (base 16) donc t prise comme rfrence pour les systmes microcontrleur et microprocesseur 8 bits et plus. Il reste que le binaire est pratique pour le contrle des Port dentre/sortie ou pour localiser rapidement une information dans un registre. La table qui suit donne un exemple de conversion simple et rapide : Dcimale Binaire Hexadcimale 0 b0000 $0 1 b0001 $1 2 b0010 $2 3 b0011 $3 4 b0100 $4 5 b0101 $5 6 b0110 $6 7 b0111 $7 8 b1000 $8 9 b1001 $9 10 b1010 $A 11 b1011 $B 12 b1100 $C 13 b1101 $D 14 b1110 $E 15 b1111 $F Comme on peut le voir, lhexadcimal ou encore lhexa est constitu de chiffre et de lettre, avec un chiffre en hexa on reprsente 4 bits, il faut donc 2 chiffres hexa pour faire un octet, celui de gauche sera le poids fort du nombre et celui de droite sera le poids faible : Dcimal Poids Fort Poids Faible Hexa 165 $A $5 $A5 37 $2 $5 $25 Le signe de lhexa est le dollar $ et le signe du binaire est le b, il ny a pas de signe pour le dcimal. Pour convertir un chiffre de lhexa en dcimale, il suffit de multiplier par 16 le poids fort et dajouter le poids faible : $A = 10, et 10 x 16 = 160 + $5 = 165, vraiment simple non. Pour faire linverse cest un peu plus dur, il faut diviser le nombre dcimal par 16 qui donnera le poids fort et le reste de la division donnera le poids faible. 165 16 10 5 Ceci reste valable pour les valeurs infrieures 255 bien sr. Pour les valeurs suprieures, il faut au pralable diviser le nombre par 256 et reprendre le mme principe pour les deux parties, dautre mthode existe, mais je me limiterais ce rappel qui est suffisant dans la majorit des cas.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

12

Les Registres dEtat SREG


Le registre indispensable au systme pour fonctionner est le registre dtat SREG. En effet, ce registre permet de raliser les oprations de branchements qui autorisent des applications complexes. Registre SREG (Status Register) Le registre SREG ou registre dtat sert principalement avec les fonctions arithmtiques et logiques pour les oprations de branchements. Il indique et autorise aussi le fonctionnement des interruptions. Il est modifi par le rsultat des manipulations mathmatiques et logiques. Cest le principal registre qui sert effectuer les branchements conditionnels aprs une opration arithmtique ou logique. Il peut tre lu et crit tout moment sans aucune restriction. Adresse 7 6 5 4 3 2 1 0 $3F I T H S V N Z C L/E L/E L/E L/E L/E L/E L/E L/E L/E I Global Interrupt Enable sert activer (1) ou interdire (0) toutes les sources dinterruptions. Si ce bit nest pas activ alors que vous avez programm des interruptions, elles ne seront pas prises en compte. T Copy Storage joue un rle de tampon lors de manipulation de bits avec les instructions BLD et BST. H Half Cary signale qu'une demie-retenue a t ralis lors de lemploi dune instruction arithmtique. S Sign bit bit de signe rsultant dun OU exclusif avec le bit N et V. V Overflow bit indique un dpassement de capacit lors des oprations arithmtique et logique. N Negative bit signale que le rsultat de la dernire manipulation arithmtique est ngatif. Z Zro bit le rsultat de la dernire manipulation arithmtique est gal zro. C Cary bit l'opration arithmtique donn lieu une retenue. Et bien maintenant, voici comment cela marche avec quelques exemples simples.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

13

Mode dAdressage
Le microcontrleur ATMEGA soutient des modes d'adressage puissants et efficaces pour l'accs la mmoire programme FLASH et la mmoire de donnes SRAM, les registres et les Entre/Sorties. Cette section dcrit les modes d'adressage soutenus par l'ATMEGA. OP signifie la partie de code d'OPration du mot d'instruction. Pour simplifier, toutes les figures montrent l'emplacement exact des bits d'adressage. Pour gnraliser, les termes RAMEND et FLASHEND ont t employs pour reprsenter l'emplacement le plus haut dans l'espace des donnes et de programme, respectivement. Note : Tous les modes d'adressage ne sont pas prsents dans tous les modles. Vrifiez que le modle que vous voulez utiliser possde linstruction dans le tableau rsum de la documentation Anglaise, le programme de compilation vous indiquera une erreur sur linstruction est manquante dans le modle grace la directive DEVICE (voir en fin de document).

Les Oprateurs
Les oprateurs permettent de choisir la source et la destination de lopration qui sera ralis par le microcontrleur dans le code instruction. Ces oprations peuvent travailler sur le registre daccs rapide (ALU), les registres dEntre/Sortie, la RAM (SRAM) pour les donnes, ou la mmoire FLASH pour les constantes. Voici un rcapitulatif des diffrents oprateurs utiliss dans la documentation qui suit : Rd : Registre Rapide de Destination (ou source) crit, Rr : Registre Rapide Source lu, A : Adresse Registre d'Entre/Sortie, k : Adresse des Donnes en SRAM, b : Bit de slection dans un octet, X, Y, Z : Registre d'Adresse Indirect ( X=R27:R26, Y=R29:R28 et Z=R31:R30), Nous allons maintenant expliquer le fonctionnement interne du microcontrleur avec ces oprateurs.

Accs Direct Simple (Rd)


LOprateur Rd permet de choisir lun des 32 registres daccs rapides celui que lon utilisera dans la mmoire. 15 OP 4 Rd 0 Registre Rapide 0

31 Loprateur est donc contenu dans la valeur Rd qui est cod sur 5 bits (32 solutions).

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

14

Accs Direct deux oprateurs (Rr et Rd)


Laccs direct avec les deux oprateurs Rr et Rd permet de travailler avec deux registres daccs rapides en mme temps, le rsultat sera plac dans le registre Rd (Destination). 15 OP 9 Rr 5 4 Rd 0 Registre Rapide 0

r 31 Le rsultat sera dans Rd. Loprateur Rr comme loprateur Rd est cod sur 5 bits (32 solutions).

Adresse des Entre/Sorties (A)


Ladressage des 64 registres dEntre/Sortie est ralis par loprateur A comme suit : 15 OP Rr/Rd 6 A 0 Registre Entre/Sortie 0

63 Ladresse du registre dEntre/Sortie est code sur 6 bits, soit 64 positions possibles.

Adresse Direct des Donnes (k)


Ladressage direct des donnes est ralis par lutilisation de deux mots 16 bits comme le montre la figure suivante : 31 OP k 15 0 19 Rr/Rd 16 Espace Donne $0000

k RamEnd Ladresse k sur 16 bits est place sur deux octets successifs. Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 15

Adressage Indirect (X, Y ou Z)


Ladressage indirect permet de charger loprateur avec le contenue de ladresse point par les registres X, Y ou Z 16 bits.
15 X, Y ou Z 0 Espace Donne $0000

adresse

RamEnd

Ladresse de la SRAM est totalement accessible.

Adressage Indirect avec Dplacement (q)


Ladressage indirect permet dutiliser le registre X ou Y comme rfrence dadresse et q comme valeur ajout pour le dplacement, ladresse sera donc la somme de X ou Y et q : 15 X ou Y 0 Espace Donne $0000

+
15 OP La valeur de q est code sur 6 bits. 10 Rr/Rd 6 5 q 0

q+X ou Y

RamEnd

Adressage Indirect avec pr-dcrment (-X, -Y ou -Z)


Ladressage indirect avec pr-dcrmentation permet de lire une suite de donne dans une table en partant du haut de la mmoire : 15 X, Y ou Z 0 Espace Donne $0000

+
-1

adresse

RamEnd Le registre X, Y ou Z est diminu de 1 chaque utilisation, donc ladresse finale sera diminue de 1. Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 16

Adressage Indirect avec post-incrment (-X, -Y ou -Z)


Ladressage indirect avec post-incrmentation permet de lire une suite de donne dans une table en partant du bas de la mmoire : 15 X, Y ou Z 0 Espace Donne $0000

+
+1

adresse

RamEnd Le registre X, Y ou Z est augment de 1 chaque utilisation, donc ladresse finale sera augmente de 1 chaque fois.

Adressage des instructions LPM, ELPM et SPM


L'adressage de la mmoire programme est spcifi par le contenu du registre Z. Les 15 bits de poids fort choisissent l'adresse du mot. Pour LPM, le LSB (poids faible) choisit l'octet bas si 0 ou loctet haut si 1. Pour SPM, le LSB doit tre 0. Si ELPM est employ, le Registre de RAMPZ est employ pour tendre le registre Z 21 bits. Espace FLASH Programme $0000

15 -Z

1 0 adresse LSB

FlashEnd

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

17

Adressage des instructions post-incrmentes LPM Z+, ELPM Z+


L'adressage de la mmoire programme est spcifi par le contenu du registre Z. Les 15 bits de poids fort choisissent l'adresse du mot. Pour LPM Z+, le LSB (poids faible) choisit l'octet bas si 0 ou loctet haut si 1. Si ELPM Z+ est employ, le Registre de RAMPZ est employ pour tendre le registre Z 21 bits. 15 -Z 1 0 Espace FLASH Programme $0000

adresse LSB +1

+
FlashEnd

Adressage Direct pour les instructions JMP et CALL


Ladressage direct va modifier le PC (Pointeur Programme) pour les sauts et lappel des sous-programmes : 31 OP LSB 15 21 PC 0 0 adresse 22 21 16 Espace FLASH Programme $0000

MSB

FlashEnd Le PC est constitu des 16 bits LSB et des 6 bits MSB pour crer les 22 bits du pointeur, lespace est au maximum de 4 096 Ko pour le futur ! La suite de lexcution du programme sera faite sur ladresse du PC.

Adressage Indirect pour les instructions IJMP et ICALL


Ladressage indirect avec le registre Z comme rfrence pour modifier le PC : Espace FLASH Programme $0000 Z 15 15 PC 0 0 adresse

FlashEnd Lexcution de la prochaine instruction sera effectue ladresse du registre Z qui est transfr dans le PC.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

18

Adressage Relatif pour les instructions RJMP et RCALL


Ladressage relatif permet de continuer un programme aprs un saut relatif la valeur de k qui sera cumul au PC. La valeur de k est comprise entre -2048 et +2047 et le PC sera gale : PC = k + 1: 15 OP 12 11 k 0 Espace FLASH Programme $0000

+1 15 PC 0

adresse

FlashEnd Il est important de bien utiliser les tiquettes dadressage pour cette instruction. (Voir les branchements dans le chapitre de lassembleur).

Les instructions de branchement


Les instructions de branchements permettent de tester des grandeurs entre elle : valuez Boolen Instruction Remarque Rd > Rr BRLT Sign Z & (N V) = 0 Rd >= Rr BRGE Sign (N V) = 0 Rd = Rr Z=1 BREQ Sign Rd <= Rr BRGE Sign Z ! (N V) = 1 Rd < Rr BRLT Sign (N V) = 1 Rd > Rr C !Z= 0 BRLO Non sign Rd >= Rr C=0 BRCC Non sign Rd = Rr Z=1 BREQ Non sign Rd <= Rr C !Z= 1 BRSH Non sign Rd < Rr C=1 BRLO Non sign Retenu C=1 BRCS Simple Ngatif N=1 BRMI Simple Dborde V=1 BRVS Simple Zro Z=1 BREQ Simple Nous verrons dans le dtail de chaque instruction des exemples concrets.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

19

Jeu dInstruction
LATMEGA un jeu de 131 instructions qui seront dtailles dans la suite de ce document. Le code instruction est utiliser dans les programmes crit en assembleur, loprant spcifi les variables ou constantes utiliss par linstruction, le registre SREG est modifier par linstruction en fonction du rsultat de celle-ci, et le nombre de cycle CPU est donne en dernier. Les instructions sont prsentes dans les tableaux qui suivent par type : Code Oprant Description Opration Registre Cycle Instructions Arithmtiques et Logique ADD Rd, Rr Addition sans Retenue Rd = Rd + Rr ZCNVSH 1 ADC Rd, Rr Addition avec Retenue Rd = Rd + Rr + C ZCNVSH 1 ADIW Rd, k Addition Immdiat 16 bits Rd+1:Rd = Rd+1:Rd + k Z C N V S 2 (1) SUB Rd, Rr Soustraction sans Retenue Rd = Rd Rr ZCNVSH 1 SUBI Rd, k Soustraction Immdiat sans Rd = Rd k ZCNVSH 1 Retenue SBC Rd, Rr Soustraction avec Retenue Rd = Rd Rr C ZCNVSH 1 SBCI Rd, K Soustraction Immdiat avec Rd = Rd k C ZCNVSH 1 Retenue SBIW Rd, K Soustraction Immdiat 16 bits Rd+1:Rd = Rd+1:Rd k Z C N V S 2 (1) AND Rd, Rr ET Logique Rd = Rd & Rr ZNVS 1 ANDI Rd, k ET Logique Immdiat Rd = Rd & k ZNVS 1 OR Rd, Rr OU Logique Rd = Rd ! Rr ZNVS 1 ORI Rd, k OU Logique Immdiat Rd = Rd ! k ZNVS 1 EOR Rd, Rr OU Exclusif ZNVS 1 Rd = Rd Rr COM Rd Complment 1 Rd = $FF Rd ZCNVS 1 NEG Rd Ngation (Complment 2) Rd = $00 Rd ZCNVS 1 SBR Rd, k Mise 1 dans Registre (OU) Rd = Rd ! k ZNVS 1 CBR Rd, k Mise 0 dans Registre (ET) Rd = Rd & ($FF - k) ZNVS 1 INC Rd Incrment Rd = Rd + 1 ZNVS 1 DEC Rd Dcrment Rd = Rd 1 ZNVS 1 TST Rd Test Zro ou Ngatif Rd = Rd ! Rd ZNVS 1 CLR Rd Effacement du Registre Rd = $00 ZNVS 1 SER Rd Mis 1 du Registre Rd = $FF 1 MUL Rd, Rr Multiplication non Sign R1:R0 = Rd x Rr (UU) ZC 2 (1) MULS Rd, Rr Multiplication Sign R1:R0 = Rd x Rr (SS) ZC 2 (1) MULSU Rd, Rr Multiplication Sign avec non R1:R0 = Rd x Rr (SU) ZC 2 (1) Sign FMUL Rd, Rr Multiplication Fractionnaire non R1:R0=(Rd x Rr)<<1 ZC 2 (1) Sign (UU) FMULS Rd, Rr Multiplication Fractionnaire R1:R0=(Rd x Rr)<<1(SS) ZC 2 (1) Sign FMULSU Rd, Rr Multiplication Fractionnaire R1:R0=(Rd x Rr)<<1(SU) ZC 2 (1) Sign avec non Sign

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

20

Code RJMP IJMP EIJMP JMP RCALL ICALL EICAL L CALL 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

Oprant k

k k

Rd, Rr Rd, Rr Rd, Rr Rd, k Rr, b Rr, b A, b A, b s, k s, k k k k k k k k k k k k k k k k k k k

Description Opration Registre Instructions de Branchement et Saut Saut Relatif PC = PC + k + 1 Saut Indirect Z PC(15:0)=Z, PC(21:16)=0 Saut Etendu Indirect Z PC(15:0)=Z, PC(21:16)=EIND Saut PC = k Sous-Programme Relatif PC = PC + k + 1 Sous-Programme Indirect Z PC(15:0)=Z, PC(21:16)=0 Sous-Programme Etendu Indirect Z PC(15:0)=Z, PC(21:16)=EIND Sous-Programme PC = k Retour de Sous-Programme PC = STACK Retour dInterruption PC = STACK I Compare et Saute si gal Si Rd=Rr PC=PC+2 ou 3 Comparer Rd Rr ZCNVSH Comparez avec Retenue Rd - Rr - C ZCNVSH Comparez Immdiat Rd K ZCNVSH Sautez si le bit du Registre 0 Si Rr(b)=0 PC=PC+2 ou 3 Sautez si le bit du Registre 1 Si Rr(b)=1 PC=PC+2 ou 3 Sautez si le bit du Registre I/O 0 Si A, b=0 PC=PC+2 ou 3 Sautez si le bit du Registre I/O 1 Si A, b =1 PC=PC+2 ou 3 Branche si SREG(s) 1 Si SREG(s)=1 PC=PC+k+1 Branche si SREG(s) 0 Si SREG(s)=0 PC=PC+k+1 Branche si gal Z 1 Si Z=1 PC=PC+k+1 Branche si Non gal Z 0 Si Z=0 PC=PC+k+1 Branche si Retenue C 1 Si C=1 PC=PC+k+1 Branche si Retenue C 0 Si C = 0 PC=PC+k+1 Branche si Egal ou Plus Haut Si C=0 PC=PC+k+1 Branche si Plus bas si C = 1 PC=PC+k+1 Branche si Ngatif Si N=0 PC=PC+k+1 Branche si Positif Si N = 0 PC=PC+k+1 Branche si Plus Grand ou gal Si NV=0 PC=PC+k+1 Sign Branche si Moins Que Sign Si NV=1 PC=PC+k+1 Branche si Drapeau Moiti H 1 Si H=1 PC=PC+k+1 Branche si Drapeau Moiti H 0 Si H=0 PC=PC+k+1 Branche si Drapeau T=1 Si T=1 PC=PC+k+1 Branche si Drapeau T=0 Si T=0 PC=PC+k+1 Branche si Dbordement V=1 Si V=1 PC=PC+k+1 Branche si Dbordement v=0 Si V=0 PC=PC+k+1 Branche si Interruption active I=1 Si I=1 PC=PC+k+1 Branche si Interruption inactive I=0 Si I=0 PC=PC+k+1 -

Cycle 2 2 (1) 2 (1) 3 (1) 3/4 (4) 3/4(1,4) 4 (4) 4/5(1,4) 4/5 (4) 4/5 (4) 1/2/3 1 1 1 1/2/3 1/2/3 1/2/3 1/2/3 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

21

Code

Oprant

MOV Rd, Rr MOVW Rd, Rr LDI Rd, k LDS Rd, k LD Rd, X LD Rd, X+ LD Rd, -X LD Rd, Y LD Rd, Y+ LD Rd, -Y LDD Rd, Y+q LD Rd, Z LD Rd, Z+ LD Rd, -Z LDD Rd, Z+q STS k, Rr ST X, Rr ST X+, Rr ST -X, Rr ST Y, Rr ST Y+, Rr ST -Y, Rr STD Y+q,Rr ST Z, Rr ST Z+, Rr ST -Z, Rr STD Z+q,Rr LPM LPM Rd, Z LPM Rd, Z+ ELPM ELPM ELPM SPM IN OUT PUSH POP Extended Rd, Z Rd, Z+

Rd, A A, Rr Rr Rd

Description Opration Registre Cycle Instructions de Transfert de Donne Dplacement Rd = Rr 1 Dplacement 16 bits Rd+1:Rd = Rr+1:Rr 1 (1) Charge Immdiat Rd = k 1 Charge Directe en Mmoire Rd = (k) 2 (1,4) Charge Indirect Rd = (X) 2 (1,4) Charge Indirect Post Incrment Rd = (X) et X = X + 1 2 (1,4) Charge Indirect Pr Dcrment X = X 1 et Rd = (X) 2 (1,4) Charge Indirect Rd = (Y) 2 (1,4) Charge Indirect Post Incrment Rd = (Y) et Y = Y + 1 2 (1,4) Charge Indirect Pr Dcrment Y = Y 1 et Rd = (Y) 2 (1,4) Charge Indirect avec Dplacement Rd = (Y + q) 2 (1,4) Charge Indirect Rd = (Z) 2 (2,4) Charge Indirect Post Incrment Rd = (Z) et Z = Z+1 2 (2,4) Charge Indirect Pr Dcrment Z = Z 1 et Rd = (Z) 2 (2,4) Charge Indirect avec Dplacement Rd = (Z + q) 2 (1,4) Stock Direct en Mmoire (k) = Rd 2 (1,4) Stock Indirect (X) = Rr 2 (2,4) Stock Indirect Post Incrment (X) = Rr et X = X + 1 2 (2,4) Stock Indirect Pr Dcrment X = X 1 et (X) = Rr 2 (2,4) Stock Indirect (Y) = Rr 2 (2,4) Stock Indirect Post Incrment (Y) = Rr et Y = Y + 1 2 (2,4) Stock Indirect Pr Dcrment Y = Y 1 et (Y) = Rr 2 (2,4) Stock Indirect avec Dplacement (Y + q) = Rr 2 (1,4) Stock Indirect (Z) = Rr 2 (2,4) Stock Indirect et Incrment postal (Z) = Rr et Z = Z + 1 2 (2,4) Stock Indirect et Pr dcroissance Z = Z 1 et (Z) = Rr 2 (2,4) Stock Indirect avec Dplacement (Z + q) = Rr 2 (1,4) Mmoire Programme de Charge R0 = (Z) 3 (3) Mmoire Programme de Charge Rd = (Z) 3 (3) Mmoire Programme de Charge Rd = (Z) et Z = Z + 1 3 (3) Post Incrment Mmoire Programme de Charge R0 = (RAMPZ:Z) 3 (1) Mmoire Programme de Charge Rd = (RAMPZ:Z) 3 (1) Etendue Mmoire Programme de Charge Rd=(RAMPZ:Z) et Z=Z + 1 3 (1) Etendue Post Incrment Stock Mmoire Programme (Z) = R1:R0 - (1) Entre dun Port Rd = I/O(A) 1 Sortie sur Port I/O(A) = Rr 1 Entre du Registre de Pile STACK = Rr 2 (1) Sortie du Registre de Pile Rd = STACK 2 (1)

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

22

Code LSL LSR ROL ROR ASR SWAP BSET BCLR SBI CBI BST BLD SEC CLC SEN CLN SEZ CLZ SEI CLI SES CLS SEV CLV SET CLT SEH CLH

Description Opration Instructions de Bit et Bit test Rd Dcalage Logique Gauche C=Rd(7), Rd(n+1)=Rd(n), Rd(0)=0 Rd Dcalage Logique Droite C=Rd(0), Rd(n)=Rd(n+1), Rd(7)=0 Rd Rotation Gauche Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) Rd Rotation Droite Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) Rd Dcalage Arithmtique Droite Rd(n) = Rd(n+1), n=0:6 Rd change demi-parti Rciproque Rd(3:0)=Rd(7:4) et Rd(7:4)=Rd(0:3) s Drapeau SREG(s) 1 SREG(s) = 1 s Drapeau SREG(s) 0 SREG(s) = 0 A, b Registre d'entre-sortie 1 I/O(A, b) = 1 A, b Registre d'entre-sortie 0 I/O(A, b) = 0 Rr, b Drapeau T = position b du Registre T = Rr(b) Rd, b Registre position b = Drapeau T Rd(b) = T Drapeau Retenue 1 C=1 Drapeau Retenue 0 C=0 Drapeau Ngatif 1 N=1 Drapeau Ngatif 0 N=0 Drapeau Zro 1 Z=1 Drapeau Zro 0 Z=0 Drapeau dInterruption Permit I=1 Drapeau dInterruption Arrt I=0 Drapeau Sign 1 S=1 Drapeau Sign 0 S=0 Drapeau Dbordement 1 V=1 Drapeau Dbordement 0 V=0 Drapeau Transfert 1 T=1 Purifiez Transfert 0 T=0 Drapeau Moiti de Retenue H 1 H=1 Drapeau Moiti de Retenue H 0 H=0 Code Oprant

Opr..

Registre ZCNVH ZCNV ZCNVH ZCNV ZCNV SREG(s) SREG(s) T C C N N Z Z I I S S V V T T H H

Cycle 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Description Registre Cycle Instruction de Contrle MCU BREAK Voir la description de linstruction de BREAK 1 (1) NOP Pas dOpration (Attente dun cycle) 1 SLEEP Voir la description de linstruction de SLEEP 1 WDR Voir le chapitre sur le Watchdog ou linstruction WDR 1 Notes : 1. Cette instruction n'est pas disponible dans tous les modles. 2. Lensemble des variantes des instructions n'est pas disponible dans tous les modles. 3. Lensemble des variantes de l'instruction LPM n'est pas disponible dans tous les modles. 4. Le cycle dhorloge pour les accs mmoire de Donnes n'est pas valable pour des accs via linterface externe de RAM. Pour LD, ST, LDS, STS, PUSH, POP, ajouter un cycle de plus pour chaque tat dattend. Pour CALL, ICALL, EICALL, RCALL, RET, RETI avec PC 16 bits, lajoutent de trois cycles plus deux

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

23

cycles pour chaque tat dattente. Pour CALL, ICALL, EICALL, RCALL, RET, RETI avec le PC 22 bits, lajoute de cinq cycles plus trois cycles pour chaque tat dattend.

Lgende du jeu dinstruction


Registres et Oprateurs Rd : Registre de Destination (ou de source) Ecrit, Rr : Registre Source Lu, k: Adresse en mmoire, b: Bit du Registre ou Registre d'Entre/Sortie (3 bits), s: Bit du Registre de Statut (3 bits), X, Y, Z : Registre d'Adresse Indirect (X=R27:R26, Y=R29:R28 et Z=R31:R30), A: Adresse d'Entre/Sortie, q: Adressage Indirect (6 bits). RAMPX, RAMPY, RAMPZ, RAMPD Les registres sont enchans avec X-, Y- et Z- permettant l'adressage indirect de l'espace de donnes du MCU en dbordant l'espace de donnes de 64 Ko. Registre enchan Z- permettant ladressage direct de l'espace de donnes entier du MCU en dbordant l'espace de donnes de 64 Ko. EIND Registre enchan avec le mot d'instruction permettant un appel indirect sur l'espace programme entier du MCU en dbordant lespace programme de 64 Ko. STACK La pile pour le retour dadresse des registres pousss dans SP, Indicateur de Pile pour empiler-dpiler. DRAPEAU = : Drapeau affect par instruction 0 : Drapeau purifi par instruction 1 : Drapeau mis par instruction - : Drapeau non affect par instruction

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

24

Les Instructions
Voici le dtail de chaque instruction.

Mode de Lecture
Pour lire rapidement ces fiches, il faut localiser en marron linstruction suivie par la correspondance des lettres avec le mnmonique, suivie par un descriptif de linstruction et une formule simple reprsentant le fonctionnement de linstruction. Ensuite, on prcise la porte des variables, leurs champs dapplication et les ventuelles limites. Le code de linstruction sur 16 bits ou plus si ncessaire. Un tableau regroupant les informations importantes de linstruction, le mnmonique, les oprateurs, le rsultat, le PC, le nombre doctet occup, et le nombre de cycle MCU. Les modification ventuelle du registre de statut SREG et les oprations logiques de chaque indicateur avec en rouge la ngation de la valeur : R1 = Non R1. Les signes ! = OU, & = ET, = OU Exclusif. Pour finir des exemples simples.

ADC Add with Carry Addition avec Retenue


Ajout deux registres Rd & Rr avec le contenu de la retenue C et place le rsultat dans Rd, soit : Rd = Rd + Rr + C Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet ADC Rd, Rr Rd PC + 1 2 Code : 0001 11rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7 & Rr7 & R7 ! Rd7 & Rr7 & R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : ; Addition sur 16 bits Add r2, r0 ; Addition bit de poids faible Adc r3, r1 ; Addition avec retenue bit de poids fort

Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

25

ADD Add without Carry Addition sans Retenue


Ajout deux registres Rd & Rr sans la retenue C et place le rsultat dans Rd : Rd = Rd + Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle ADD Rd, Rr Rd PC + 1 2 1 Code : 0000 11rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7 & Rr7 & R7 ! Rd7 & Rr7 & R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : ; Addition sur 8 bit Add r1,r2 ; Addition de r2 avec r1 (r1=r1+r2) Add r28,r28 ; Addition de r28 avec lui mme (r28=r28+r28)

ADIW Add Immediat Word Addition Immdiate sur 16 bits


Ajoute une valeur immdiate k (0 - 63) une paire de registre et place le rsultat de la paire de registre. Cette instruction fonctionne sur 4 paires de registre uniquement et est adapter aux oprations sur les registres d'indicateur. Cette instruction n'est pas disponible dans tous les modles. Rd+1:Rd = Rd+1:Rd + k Avec : Rd = {24, 26, 28 ou 30} et k = 0 63. Instruction : Code Oprateurs Rsultat PC Octet Cycle ADIW Rd+1:Rd, k Rd+1 :Rd PC + 1 2 2 Code : 1001 0110 kkdd kkkk Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X S=NV V = Rdh7 & R15 N = R15 Z = R15&R14&R13&R12&R11&R10&R9 & R8 & R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = R15 & Rdh7 Exemple : ; Addition Immdiate Adiw r25:24,1 ; Addition de 1 r25:r24 Adiw ZH:ZL,63 ; Addition de 63 au registre Z (r31:r30)

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

26

AND Logical AND ET Logique


Excute un ET logique entre le contenu de Rd et Rr et place le rsultat dans Rd : Rd = Rd & Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet AND Rd, Rr Rd PC + 1 2 Code : 0010 00rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Et logique and r2, r3 ; Et entre r2 et r3, rsultat dans r2 ldi r16,1 ; Charge r16 avec b00000001 and r2, r16 ; Isole le bit 0 dans r2

Cycle 1

ANDI Logical AND with Immediate ET Logique Immdiat


Et logique entre le contenu de Rd et une constante k et place le rsultat dans Rd. Rd = Rd & k Avec : Rd = 16 31 et k = 0 255. Instruction : Code Oprateurs Rsultat PC Octet ANDI Rd, k Rd PC + 1 2 Code : 0111 kkkk dddd kkkk Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Et logique Immdiat andi r17, $0F ; Efface les 4 bits de poids fort de r17 andi r18, $10 ; Isole le bit 4 de r18 andi r19, $AA ; Efface un bit sur deux de r19

Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

27

ASR Arithmetic Shift Right Dcalage Arithmtique Droite


Dcale tous les bits dans Rd dune place droit, le bit 7 est replac dans le nouveau bit 7, le bit 0 est charg dans lindicateur C de SREG. Cette opration divise efficacement une valeur signe par deux sans changer son signe. Le registre SREG est modifi aprs le dcalage.

Avec : Rd = 0 31. Instruction : Code ASR Code : Registre Statut :

Oprateurs Rd Code Instruction

Rsultat Rd 1001 010d

PC PC + 1 dddd

Octet 2 0101

Cycle 1

SREG I T H S V N Z C Action X X X X X S = N V (avec N et V aprs le dcalage) V = N C (avec N et C aprs le dcalage) N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd0 Exemple : ; Dcalage Arithmtique Droite ldi r16, $10 ; Charge la valeur dcimale 16 dans r16 asr r16 ; r16 = r16 / 2 ldi r17, $FC ; Charge -4 dans r17 asr r17 ; r17 = r17 / 2

BCLR Bit Clear in SREG Efface le Bit s Correspondant dans SREG


Efface la valeur de la position du bit s correspondant dans le registre de statut SREG, la valeur de s est donc la position du bit dans le sens poids fort poids faible. Les autres bits ne sont pas modifis. SREG(s) = 0 Avec : s = 0 7. Instruction : Code BCLR Code : Registre Statut : SREG Action I T X X T = 0 si s = 6 Z =0 si s = 1 H X S V X X H = 0 si s = 5 C =0 si s = 0 N X Z C X X S = 0 si s = 4

Oprateurs s Code Instruction

Rsultat SREG 1001 0100

PC PC + 1 1sss

Octet 2 1000

Cycle 1

I = 0 si s = 7 N =0 si s = 2 Exemple : ; Efface le bit s dans SREG bclr 0 bclr 7

V =0 si s = 3

; Efface la retenue ; Dsactive les interruptions

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

28

BLD Bit Load from the T Flag in SREG to a bit b Charge Registre avec T
Copie le drapeau T de SREG dans le registre Rd la position du bit b. Rd(b) = T Avec : Rd = 0 31 et b = 0 7. Instruction : Code Oprateurs Rsultat PC Octet BLD Rd, b Rd PC + 1 2 Code : 1111 100d dddd 0bbb Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Copie le T dans Rd la position b et la fonction complmentaire bld r0, 4 ; Charge T dans le bit 4 de r0 bst r1, 2 ; Stock le bit 2 de r1 dans T

Cycle 1

BRBC Branch if Bit in SREG is Cleared Branche Conditionnelle Relatif si SREG(s)=0


Evalue le bit s dans SREG et branchement relatif au PC si le bit est 0. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si SREG(s) = 0 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : s = 0 7 et k = -64 +63. Instruction : Code Oprateurs Rsultat PC Octet PC + k + 1 BRBC s, k 2 ou PC + 1 Code : 1111 01kk kkkk ksss Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Branchement si SREG(s) = 0 cpi r20, 5 ; Comparer r20 avec la valeur 5 brbc 1, bitzero ; Branche si Zro = 0 ... bitzero: nop ; Destination du branchement

Cycle 2 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

29

BRBS Branch if Bit in SREG is Set - Branche Conditionnelle Relatif si SREG(s) = 1


Evalue le bit s dans SREG et branchement relatif au PC si le bit est 1. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si SREG(s) = 1 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : s = 0 7 et k = -64 +63. Instruction : Code Oprateurs Rsultat PC Octet PC + k + 1 BRBS s, k 2 ou PC + 1 Code : 1111 00kk kkkk ksss Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Branchement si SREG(s) = 1 bst r0, 3 ; Charge r0 avec la valeur 3 brbs 6, bitset ; Branche si T = 1 ... bitset: nop ; Destination du branchement

Cycle 2 1

BRCC Branch if Carry Cleared Branchement si Pas de Retenue C = 0


Branchement conditionnel relatif si la retenue C est 0. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si C = 0 alors PC . PC + k + 1, sinon PC . PC + 1 Avec : k = -64 +63. Instruction : Code BRCC Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 01kk kkkk K000

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si C = 0 Add r22, r23 Brcc nocarry ... nocarry: nop

; Addition r23 avec r22 ; Branchement si la retenue C = 0 ; Destination du branchement

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

30

BRCS Branch if Carry Set - Branchement si Retenue C = 1


Branchement conditionnel relatif si la retenue C est 1. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si C = 1 alors PC . PC + k + 1, sinon PC . PC + 1 Avec : k = -64 +63. Instruction : Code BRCS Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk K000

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si C = 1 cpi r26, $56 brcs carry ... carry: nop

; Compare r26 avec $56 ; Branchement si retenue 1 ; Destination du branchement

BREAK Break Pause du MCU


L'instruction BREAK est employe par le systme de mise au point et n'est pas normalement employe dans le logiciel d'application. Quand l'instruction BREAK est excute le MCU est arrt. Cela donne accs au programme de mise au point et aux ressources internes. Si un bit de blocage est mis, ou JTAGEN ou OCDEN ne sont pas programms, le MCU traitera l'instruction BREAK comme un NOP et n'entrera pas au mode Arrt. Cette instruction n'est pas disponible sur tous les modles. Instruction : Code Oprateurs Rsultat PC Octet Cycle BREAK PC + 1 2 1 Code : 1001 0101 1001 1000 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Non utilis dans vos programmes

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

31

BREQ Branch if Equal Branchement si Egal Z = 1


Branchement conditionnel relatif si le drapeau Zro Z est 1. Si l'instruction est excute immdiatement aprs les instructions CP, CCPP, SUB ou SUBI, le branchement arrive si et seulement si Rd est gale Rr bit bit. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si Rd = Rr (Z = 1) alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BREQ Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk k001

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si Egale (Z = 1) cp r1, r0 breq equal ... equal: nop

; Compare r1 avec r0 ; Branchement si gale ; Branchement de destination

BRGE Branch if Greater or Equal (Signed) Branchement si Suprieur ou Egal S=0


Branchement conditionnel relatif si le drapeau Sign S est 0. Si l'instruction est excute immdiatement aprs les instructions CP, CCPP, SUB ou SUBI, le branchement arrive si et seulement si Rd sign est plus grand ou gal Rr sign. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si Rd = Rr (N V = 0) alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code Oprateurs Rsultat PC Octet PC + k + 1 BRGE k 2 ou PC + 1 Code : 1111 01kk Kkkk k100 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Branchement si >= (S = 0) cp r11, r12 ; Compare r11 et r12 brge greateq ; Branche si r11 >= r12 (sign) ... greateq: nop ; Branchement de destination

Cycle 2 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

32

BRHC Branch if Half Carry Flag is Cleared Branchement si Demi Retenue H = 0


Branchement conditionnel relatif si le drapeau H est 0. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si H = 0 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRHC Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 01kk kkkk k101

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si (H = 0) brhc hclear ... hclear: nop

; Branche si demi retenue est 0 ; Branchement de destination

BRHS Branch if Half Carry Flag is Set Branchement si Demie Retenue H = 1


Branchement conditionnel relatif si le drapeau H est 1. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si H = 1 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRHC Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk k101

Oprateurs K

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si (H = 1) brhs hset ... hset: nop

; Branche si demie retenue = 1 ; Branchement de destination

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

33

BRID Branch if Global Interrupt is Disabled Branchement si Interruption Arrt


Branchement conditionnel relatif si le drapeau I est 0. Donc si les Interruptions sont dsactivs le branchement lieu. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si I = 0 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRID Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 01kk kkkk k111

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si Interruption dsactiv (I = 1) brid Intdis ; Branche si Interruption dsactiv = 0 ... Intdis: nop ; Branchement de destination

BRIE Branch if Global Interrupt is Enabled Branchement si Interruption Active


Branchement conditionnel relatif si le drapeau I est 1. Donc si les Interruptions sont activs le branchement lieu. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si I = 1 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRIE Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk k111

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si Interruption dsactiv (I = 1) brie Inten ; Branche si Interruption activ = 1 ... Inten: nop ; Branchement de destination

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

34

BRLO Branch if Lower (Unsigned) Branchement si Infrieur C = 1


Branchement conditionnel relatif si la retenue C non sign est 1. Si l'instruction est excute immdiatement aprs les instructions CP, CCPP, SUB ou SUBI, le branchement arrive si et seulement si Rd non sign est plus petit que Rr non sign. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si Rd < Rr (C = 1) alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRLO Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk k000

Oprateurs K

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si < (C = 1) cp r11, r12 brlo inf ... Inf: nop

; Compare r11 et r12 ; Branche si r11 < r12 (non sign) ; Branchement de destination

BRLT Branch if Less Than (Signed) Branchement si Inferieur Sign S = 1


Branchement conditionnel relatif si le drapeau Sign S est 1. Si l'instruction est excute immdiatement aprs les instructions CP, CCPP, SUB ou SUBI, le branchement arrive si et seulement si Rd sign est plus grand ou gal Rr sign. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si Rd < Rr (N V = 1) alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code Oprateurs Rsultat PC Octet PC + k + 1 BRLT k 2 ou PC + 1 Code : 1111 00kk kkkk k100 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Branchement si < (S = 1) cp r11, r12 ; Compare r11 et r12 brlt lees ; Branche si r11 < r12 (sign) ... lees: nop ; Branchement de destination

Cycle 2 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

35

BRMI Branch if Minus Branchement si Ngatif N = 1


Branchement conditionnel relatif si la valeur est ngative N 1. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si N = 1 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRMI Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk k010

Oprateurs K

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si N = 1 cp r11, r12 brmi minus ... minus: nop

; Compare r11 et r12 ; Branche si N = 1 ; Branchement de destination

BRNE Branch if Not Equal Branchement si non Egale Z = 0


Branchement conditionnel relatif si non gale Z 0. Si l'instruction est excute immdiatement aprs les instructions CP, CCPP, SUB ou SUBI, le branchement arrive si et seulement si Rd nest pas gale Rr. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si Rd Rr (Z = 0) alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRNE Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 01kk kkkk k001

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si (Z = 0) cp r11, r12 brne negal ... negal: nop

; Compare r11 et r12 ; Branche si r11 r12 (non sign) ; Branchement de destination

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

36

BRPL Branch if Plus Branchement si Positif N = 0


Branchement conditionnel relatif si la valeur est positive N 0. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si N = 0 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRPL Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 01kk kkkk k010

Oprateurs K

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si N = 0 cp r11, r12 brpl plus ... plus: nop

; Compare r11 et r12 ; Branche si N = 0 ; Branchement de destination

BRSH Branch if Same or Higher (Unsigned) Branchement si = ou Plus Grand C=0


Branchement conditionnel relatif si gal ou suprieur C est 0. Si l'instruction est excute immdiatement aprs les instructions CP, CCPP, SUB ou SUBI, le branchement arrive si et seulement si Rd non sign est plus grand ou gal Rr non sign. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si Rd >= Rr (C = 0) alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRSH Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk K000

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si >= (C = 0) cp r11, r12 brsh higtam ... higtam: nop

; Compare r11 et r12 ; Branche si r11 >= r12 (non sign) ; Branchement de destination

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

37

BRTC Branch if the T Flag is Cleared Branchement si Test T = 0


Branchement conditionnel relatif si test T est 0. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si T = 0 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRTC Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 01kk kkkk k110

Oprateurs K

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si T = 0 cp r11, r12 brtc test ... test: nop

; Compare r11 et r12 ; Branche si T = 0 ; Branchement de destination

BRTS Branch if the T Flag is Set Branchement si Test T = 1


Branchement conditionnel relatif si test T est 1. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si T = 1 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRTS Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk k110

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si T = 1 cp r11, r12 brts testset ... testset: nop

; Compare r11 et r12 ; Branche si T = 1 ; Branchement de destination

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

38

BRVC Branch if Overflow Cleared Branchement si non Dpassement V = 0


Branchement conditionnel relatif si non dpassement V est 0. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si V = 0 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRVC Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 01kk kkkk k011

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si V = 0 cp r11, r12 brvc noover ... noover: nop

; Compare r11 et r12 ; Branche si V = 0 ; Branchement de destination

BRVS Branch if Overflow Set Branchement si Dpassement V = 1


Branchement conditionnel relatif si dpassement V est 1. Le branchement est relatif au PC dans l'une ou l'autre direction (PC -63 PC +64). Le paramtre k est la compensation du PC reprsent en complment 2. Si V = 1 alors PC = PC + k + 1, sinon PC = PC + 1 Avec : k = -64 +63. Instruction : Code BRVS Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1111 00kk kkkk k011

Oprateurs k

Rsultat -

PC PC + k + 1 ou PC + 1

Octet 2

Cycle 2 1

Exemple : ; Branchement si V = 1 add r11, r12 brvs over ... over: nop

; Addition de r11 et r12 ; Branche si V = 1 ; Branchement de destination

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

39

BSET Bit Set in SREG Mise 1 du Bit s de SREG


Active la valeur de la position du bit s correspondant dans le registre de statut SREG, la valeur de s est donc la position du bit dans le sens poids fort poids faible. Les autres bits ne sont pas modifis. SREG(s) = 1 Avec : s = 0 7. Instruction : Code BSET Code : Registre Statut : SREG Action I X T X H X S X V X N X Z X C X

Oprateurs s Code Instruction

Rsultat SREG 1001 0100

PC PC + 1 0sss

Octet 2 1000

Cycle 1

I = 1 si s = 7 T = 1 si s = 6 H = 1 si s = 5 S = 1 si s = 4 V =1 si s = 3 N =1 si s = 2 Z =1 si s = 1 C =1 si s = 0 Exemple : ; Active le bit s dans SREG bset 0 bset 7

; Active la retenue ; Active les interruptions

BST Bit Store fromBit in Register to T Flag in SREG Stock Registre dans T
Stock le bit b de Rd dans le registre T de SREG : T = Rd(b) Avec : b = 0 7 et Rd = 0 31. Instruction : Code Oprateurs BST Rd, b Code : Code Instruction Registre Statut : SREG I T Action X T = Rd(b) Exemple : ; Copie le bit Rd(b) dans T bst r1, 2 bld r0, 4

Rsultat T 1111 H S 1010d V -

PC PC + 1 dddd N Z -

Octet 2 0bbb C -

Cycle 1

; Stock le bit 2 de r1 dans T ; Charge T avec le bit 4 de r0

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

40

CALL Long Call to a Subroutine Appel Long de Sous-programme


Appel dun sous-programme dans la mmoire programme entire. L'adresse de retour (l'instruction aprs CALL) sera stocke sur la pile et linstruction RET rechargera cette dernire pour continuer le programme. : PC = k avec modle PC de 16 bits soit 128Ko de mmoire programme maximum. PC = k avec modle PC de 22 bits soit 8Mo de mmoire programme maximum. Avec : k = 0 65 535 (16 bits) ou k = 0 8 388 607 (22 bits). Instruction : Code Oprateurs Pointeur Pile Pile PC Octet Cycle k 16 bits PS = PS 2 2 4 CALL PC + 2 k k 22 bits PS = PS 3 3 5 Code : 1001 010k kkkk 111k Code Instruction kkkk kkkk kkkk kkkk Sur deux mots Registre Statut : SREG I T H S V N Z C Action Exemple : ; Appel de sous-programme mov r16, r0 ; Copie r0 dans r16 call check ; Appel sous-programme nop ; Continue ... ... check: cpi r16, $42 ; Test si r16 est une valeur spciale breq error ; Branche si gale ret ; Retour du sous-programme ... error: rjmp error ; Boucle infini ( ne pas faire)

CBI Clear Bit in I/O Register Mise 0 dun Registre dEntre/Sortie


Mise 0 dun bit indiqu dans un registre d'Entre/Sortie. Cette instruction fonctionne sur les 32 registres infrieurs d'Entre/Sortie dadresse 0 31. I/O(A, b) = 0 Avec : A = 0 31 et b = 0 7. Instruction : Code Oprateurs CBI A, b Code : Code Instruction Registre Statut : SREG I T Action Exemple : ; Mise 0 du bit I/O(A,b) cbi $12, 7

Rsultat 1001 H S 1000 V -

PC PC + 1 AAAA N Z -

Octet 2 Abbb C -

Cycle 1

; Efface le bit 7 du Port D

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

41

CBR Clear Bits in Register Efface les Bits dun Registre en Complment 1
Mise 0 des bits indiqus dans le registre Rd. Excute un ET logique entre le contenu du registre Rd et le complment 1 du masque k. Le rsultat sera plac dans le registre Rd. Cest lopration inverse de ANDI. Rd = Rd & ($FF - k) Avec : Rd = 16 31 et k = 0 255. Instruction : Code Oprateurs Rsultat PC Octet CBR Rd, k Rd PC + 1 2 Code : 0111 kkkk dddd kkkk Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Effacement logique Immdiat cbr r16, $F0 ; Efface les bits de poids fort de r16 cbr r18, 1 ; Efface le bit 0 de r18

Cycle 1

CLC Clear Carry Flag Efface la Retenue C = 0


Effacement de la Retenue C = 0 : C=0 Instruction : Code CLC Code : Registre Statut : SREG Action C=0 Exemple : ; Effacement C = 0 add clc I T H S V N Z C 0 Oprateurs Code Instruction Rsultat C=0 1001 0100 PC PC + 1 1000 Octet 2 1000 Cycle 1

r0, r0

; Addition de r0 lui mme ; Efface le drapeau C = 0

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

42

CLH Clear Half Carry Flag Efface la Demi Retenue H = 0


Effacement de la demi Retenue H = 0 : H=0 Instruction : Code CLH Code : Registre Statut : SREG Action H=0 Exemple : ; Effacement H = 0 clh I T H 0 S V N Z C Oprateurs Code Instruction Rsultat H=0 1001 0100 PC PC + 1 1101 Octet 2 1000 Cycle 1

; Efface le drapeau H = 0

CLI Clear Global Interrupt Flag Dsactive les Interruptions I = 0


Dsactive les interruptions avec le drapeau I = 0 dans SREG. Les interruptions seront immdiatement mises hors de service et les interruptions ne seront pas excutes mme si elle arrive simultanment avec l'instruction CLI. I=0 Instruction : Code CLI Code : Registre Statut : SREG Action I=0 Exemple : ; Effacement I = 0 in cli Sbi Sbi Out I 0 T H S V N Z C Oprateurs Code Instruction Rsultat I=0 1001 0100 PC PC + 1 1111 Octet 2 1000 Cycle 1

temp, SREG EECR, EEMWE EECR, EEWE SREG, temp

; Stock SREG ; Arrt des interruptions. ; Dbut dcriture EEPROM ; Restore SREG (I=1)

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

43

CLN Clear Negative Flag Efface Ngative N = 0


Effacement du Ngatif N = 0 : N=0 Instruction : Code CLN Code : Registre Statut : SREG Action C=0 Exemple : ; Effacement N = 0 cln I T H S V N 0 Z C Oprateurs Code Instruction Rsultat N=0 1001 0100 PC PC + 1 1010 Octet 2 1000 Cycle 1

; Efface le drapeau N = 0

CLR Clear Register Effacement du Registre


Mise 0 du registre. Cette instruction excute un OU Exclusif entre un registre et lui-mme. Cela mettra tous les bits 0 dans le registre. Rd = Rd Rd Avec : Rd = 0 31. Instruction : Code CLR Code : Registre Statut : SREG Action I T H S 0 V 0 N 0 Z 1 C -

Oprateurs Rd Code Instruction

Rsultat Rd 0010 01dd

PC PC + 1 dddd

Octet 2 dddd

Cycle 1

S=0 V=0 N=0 Z=1 Exemple : ; Effacement dun registre clr r18 loop: inc r18 ... cpi r18, $50 brne loop

; Effacement de r18 ; Incrment de r18 ; Compare r18 avec $50

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

44

CLS Clear Signed Flag Efface le Signe S = 0


Effacement du Signe S = 0 : S=0 Instruction : Code CLS Code : Registre Statut : SREG Action S=0 Exemple : cls ; Efface le drapeau S = 0 I T H S 0 V N Z C Oprateurs Code Instruction Rsultat S=0 1001 0100 PC PC + 1 1100 Octet 2 1000 Cycle 1

CLT Clear T Flag Efface le Test T = 0


Effacement du Test T = 0 : T=0 Instruction : Code CLT Code : Registre Statut : SREG Action T=0 Exemple : clt ; Efface le drapeau T = 0 I T 0 H S V N Z C Oprateurs Code Instruction Rsultat T=0 1001 0100 PC PC + 1 1110 Octet 2 1000 Cycle 1

CLV Clear Overflow Flag Efface le Dbordement V = 0


Effacement du Dbordement V = 0 : V=0 Instruction : Code CLV Code : Registre Statut : SREG Action V=0 Exemple : clv ; Efface le drapeau V = 0 I T H S V 0 N Z C Oprateurs Code Instruction Rsultat V=0 1001 0100 PC PC + 1 1011 Octet 2 1000 Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

45

CLZ Clear Zero Flag Efface le Zro Z = 0


Effacement du Dbordement Z = 0 : Z=0 Instruction : Code CLZ Code : Registre Statut : SREG Action Z=0 Exemple : clz ; Efface le drapeau Z = 0 I T H S V N Z 0 C Oprateurs Code Instruction Rsultat Z=0 1001 0100 PC PC + 1 1001 Octet 2 1000 Cycle 1

COM Ones Complement Complment 1


Cette instruction effectue le complment 1 de loprateur, cest en fait linverse de la valeur : Rd = $FF - Rd Si vous avez Rd = $40, COM Rd sera gale $BF, si lon additionne ces deux valeur on retrouve $FF (256) ou encore en binaire : $FF = b11111111 $ 40 = b00110000 --------------------$B0 = b11001111 Avec : Rd = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle COM Rd Rd PC + 1 2 1 Code : 0010 010d dddd 0000 Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X 1 S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C=1 Exemple : ; Complment 1 com r4 ; Complment 1 de r4 breq zero ; Branche si zro ... zero: nop ; Branchement de destination

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

46

CP Compare Comparaison de Registre


Cette instruction excute une comparaison entre deux registres Rd et Rr. Aucun des registres n'est chang. Tous les branchements conditionnels peuvent tre employs aprs cette instruction. Rd - Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet CP Rd, Rr PC + 1 2 Code : 0001 01rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7Rr7R7+Rd7Rr7R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : cp r4, r19 ; Compare r4 avec r19 brne noteq ; Branche si r4 <> r19 ... noteq: nop ; Branchement de destination

Cycle 1

CPC Compare with Carry Comparaison avec Retenue 16 bits


Cette instruction excute une comparaison entre deux registres Rd et Rr et soustrait la retenue au rsultat. Tous les branchements conditionnels peuvent tre employs aprs cette instruction. Rd Rr - C Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC CP Rd, Rr PC + 1 Code : 0000 01rd dddd Code Instruction Registre Statut : SREG I T H S V N Action X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7Rr7R7+Rd7Rr7R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 & Z C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : ; Comparaison r3:r2 avec r1:r0 sur 16 bits cp r2, r0 ; Compare octet bas

Octet 2 rrrr Z X C X

Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

47

noteq:

cpc brne ... nop

r3, r1 noteq

; Compare octet haut avec Retenue ; Branche si non gale ; Branchement de destination

CPI Compare with Immediate Comparaison avec Valeur Immdiate


Cette instruction excute une comparaison entre un registre Rd et une constante k. Aucun des registres n'est chang. Tous les branchements conditionnels peuvent tre employs aprs cette instruction. Rd k Avec : Rd = 16 31 et k = 0 255. Instruction : Code Oprateurs Rsultat PC Octet CPI Rd, k PC + 1 2 Code : 0011 kkkk dddd kkkk Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7Rr7R7+Rd7Rr7R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : cpi r16, $F0 ; Comparaison de r16 $F0 brne error ; Branche si r16 <> $F0 ... error: nop ; Branchement de destination

Cycle 1

CPSE Compare Skip if Equal Comparaison et Saut si Egale


Comparaison entre Rd et Rr et saute linstruction suivante si galit sinon on passe linstruction suivante : Si Rd = Rr alors PC . PC + 2 (ou 3) sinon PC . PC + 1 Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle PC + 1 si faut 2 1 CPSE Rd, Rr PC + 2 si vrai 2 2 PC + 3 (1) 2 3 Note 1 : Si le rsultat est vrais et que linstruction suivante 3 octets, lopration de saut sautera PC + 3. Code : 0001 00rd dddd Rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : inc r4 ; Incrment r4 Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 48

cpse neg nop

r4, r0 r4

; Compare r4 avec r0 ; Seulement si r4 <> r0 ; On saute ici si r4 = r0

DEC Decrement - Dcrmentation


Soustrait 1 du contenu du registre Rd et place le rsultat dans Rd. Le drapeau C dans SREG n'est pas affect par l'opration, permettant ainsi l'instruction DEC d'tre employ comme un compteur de boucle dans des calculs de prcision multiple. On peut raliser des boucles dattente en faisant fonctionner DEC sur des valeurs non signes avec BREQ et BRNE. En utilisant des valeurs en complment 2, tous les branchements signs sont disponibles. Rd = Rd - 1 Avec : Rd = 0 31. Instruction : Code DEC Code : Registre Statut : SREG Action I T H S X V X N X Z X C -

Oprateurs Rd Code Instruction

Rsultat Rd 1001 010d

PC PC + 1 dddd

Octet 2 1010

Cycle 1

S=NV V = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ldi r17, $10 ; Charge $10 dans r17 loop: add r1, r2 ; Addition de r2 r1 dec r17 ; Dcrment de r17 brne loop ; Branche si r17 <> 0 nop ; Continue

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

49

EICALL Extended Indirect Call to Subroutine Appel Indirect au Sous-Programme


Appel indirect d'un sous-programme indiqu par le registre Z et le registre EIND dans l'espace d'Entre/Sortie. Cette instruction tient compte d'appel indirect sur l'espace mmoire programme entier. L'indicateur de pile est dcrment pendant EICALL. Cette instruction n'est pas mise en oeuvre pour les modles avec un PC sur 2 octets, voir ICALL. PC(15:0) = Z et PC(21:16) = EIND (modle PC de 22 bits) Avec : Z = 0 65 535 et EIND = 0 256 (22 bits au total). Instruction : Code Oprateurs Pointeur Pile Pile PC Octet EICALL Z, EIND PS = PS 3 PC + 1 Z + EIND 2 Code : 1001 0101 0001 1001 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Appel de sous-programme ldi r16, $05 ; Charge EIND et Z out EIND, r16 ; Adresse de poids fort ldi r30, $00 ; Adresse de poids faible ldi r31, $10 ; Adresse de poids moyen eicall ; Call ladresse $051000

Cycle 4

EIJMP Extended Indirect Jump Saut Indirect avec Z & EIND


Saut indirect l'adresse indique par Z et le registre EIND dans l'espace d'Entre/Sortie. Cette instruction tient compte des sauts indirects dans l'espace mmoire programme entier. Cette instruction n'est pas disponible dans tous les modles. PC(15:0) = Z et PC(21:16) = EIND (modle PC de 22 bits) Avec : Z = 0 65 535 et EIND = 0 256 (22 bits au total). Instruction : Code Oprateurs Rsultat PC Octet Cycle EIJMP Z, EIND Z + EIND 2 2 Code : 1001 0100 0001 1001 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Saut Indirect ldi r16, $05 ; Charge EIND et Z out EIND, r16 ; Adresse de poids fort ldi r30, $00 ; Adresse de poids faible ldi r31, $10 ; Adresse de poids moyen eijmp ; Saute ladresse $051000

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

50

ELPM Extended Load Program Memory Chargement Programme Mmoire Etendue


Charge un octet indiqu par le registre Z et le registre RAMPZ dans l'espace d'Entre/Sortie et place cet octet dans Rd. La mmoire programme est organise en mot de 16 bits tandis que Z pointe une adresse 8 dun octet. Ainsi, le bit le moins significatif de Z choisit loctet bas (ZLSB = 0) ou loctet haut (ZLSB = 1). Cette instruction peut adresser l'espace mmoire programme entier. Le registre Z peut tre laiss inchang par l'opration, ou il peut tre incrment. L'augmentation s'applique la concatnation entire sur 24 bits de Z et RAMPZ. La programmation systme peut employer l'instruction ELPM pour lire les fusibles et la valeur des bits de blocage. Rfrez-vous la documentation Anglaise pour une description dtaille. Le rsultat de ces combinaisons est non dfini (ne pas utiliser) : ELPM r30, Z+ et ELPM r31, Z+. Rd = RAMPZ:Z Avec : Rd = 0 29 et Z = 0 65 535 et RAMPZ = 0 256. Instruction : Code Oprateurs Rsultat PC Octet Cycle ELPM Z, RAMPZ Rd PC + 1 2 3 Code : ELPM (r0 implicite) 1001 0101 1101 1001 Code Instruction ELPM Z (ou Z+) 1001 010d dddd 0111 Suite Registre Statut : SREG I T H S V N Z C Action Exemple : ; Programmation Mmoire FLASH ldi ZL, byte3(Table_1<<1) ; Initialise Z avec la table octet 3 out RAMPZ, ZL ; Sauve la RampZ ldi ZH, byte2(Table_1<<1) ; Charge Z avec octet 2 ldi ZL, byte1(Table_1<<1) ; Charge Z avec octet 1 elpm r16, Z+ ; Charge la constante du Programme ... Table_1: ; Mmoire point par RAMPZ:Z dw $3738 ; $38 est ladress quant ZLSB = 0 ; $37 est ladress quant ZLSB = 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

51

EOR Exclusive OR OU exclusif


Excute un OU logique exclusif entre le contenu Rd et Rr et place le rsultat dans Rd : Rd = Rd Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet EOR Rd, Rr Rd PC + 1 2 Code : 0010 01rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; OU logique exclusif eor r4, r4 ; Efface r4 eor r0, r22 ; OU Exclusif sur les Bits r0 et r22

Cycle 1

FMUL Fractional Multiply Unsigned Multiplication Fractionnaire non Sign


Cette instruction excute une multiplication avec deux registres 8 bits et un rsultat sur 16 bits non sign. MUL est plus gnralement employ avec des nombres signs, tandis que FMUL est utilis avec des nombres non signs. Cette instruction est donc la plus utile pour le calcul d'un produit partiel en excutant une multiplication signe avec des entres 16 bits. Le rsultat de l'opration FMUL peut souffrir d'un complment 2 sur dbordement. Le multiplicande Rd et le multiplicateur Rr sont deux registres contenant les nombres non signs fractionnaires. Le produit fractionnaire 16 bits non sign est plac dans R1 (poids fort) et R0 (poids faible). Cette instruction n'est pas disponible dans tous les modles. R1:R0 (non sign) = Rd (non sign) x Rr (non sign) Avec : Rd = 16 23 et Rr = 16 23. Instruction : Code Oprateurs Rsultat PC Octet Cycle FMUL Rd, Rr R1:R0 PC + 1 2 2 Code : 0000 0011 0ddd 1rrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X Z = R15&R14&R13&R12&R11&R10 & R9 & R8 & R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = R16 (R15 -> C) Exemple : ; Multiplication deux fois 16 bits, rsultat sur 32 bits signs fmuls16x16_32: ; r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) clrr2 fmuls r23, r21 ; ((sign)ah * (sign)bh) << 1 Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 52

movw r19:r18, r1:r0 fmul r22, r20 adc r18, r2 movw r17:r16, r1:r0 fmulsu r23, r20 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 fmulsu r21, r22 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2

; (al * bl) << 1

; ((sign)ah * bl) << 1

; ((sign)bh * al) << 1

FMULS Fractional Multiply Signed Multiplication Fractionnaire Sign


Cette instruction excute une multiplication avec deux registres 8 bits et un rsultat sur 16 bits sign. Le multiplicande Rd et le multiplicateur Rr sont deux registres contenant les nombres signs fractionnaires. Le produit fractionnaire 16 bits sign est plac dans R1 (poids fort) et R0 (poids faible). Cette instruction n'est pas disponible dans tous les modles. R1:R0 (sing)= Rd (sing) x Rr (sing) Avec : Rd = 16 23 et Rr = 16 23. Instruction : Code Oprateurs Rsultat PC Octet Cycle FMULS Rd, Rr R1:R0 PC + 1 2 2 Code : 0000 0011 1ddd 0rrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X Z = R15&R14&R13&R12&R11&R10 & R9 & R8 & R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = R16 (R15 -> C) Exemple : ; Multiplication deux fois 8 bits, rsultat sur 16 bits signs fmuls r23, r22 ; Multiplication sign entre r23 et r22 movw r23:r22, r1:r0 ; Copie le rsultat dans r23:r22

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

53

FMULSU Fractional Multiply Signed with Unsigned Multipication Sign-non Sign


Cette instruction excute une multiplication avec deux registres 8 bits sign et non sign et un rsultat sur 16 bits sign. Le multiplicande Rd contient un nombre sign fractionnaire et le multiplicateur Rr contient un nombre non sign fractionnaire. Le produit fractionnaire 16 bits sign est plac dans R1 (poids fort) et R0 (poids faible). Cette instruction n'est pas disponible dans tous les modles. R1:R0 (sing) = Rd (sign) x Rr (non sign) Avec : Rd = 16 23 et Rr = 16 23. Instruction : Code Oprateurs Rsultat PC Octet Cycle FMULSU Rd, Rr R1:R0 PC + 1 2 2 Code : 0000 0011 1ddd 1rrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X Z = R15&R14&R13&R12&R11&R10 & R9 & R8 & R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = R16 (R15 -> C) Exemple : ; Multiplication deux fois 8 bits, rsultat sur 16 bits signs fmuls16x16_32: ; r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) clrr2 fmuls r23, r21 ; ((sign)ah * (sign)bh) << 1 movw r19:r18, r1:r0 fmul r22, r20 ; (al * bl) << 1 adc r18, r2 movw r17:r16, r1:r0 fmulsu r23, r20 ; ((sign)ah * bl) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 fmulsu r21, r22 ; ((sign)bh * al) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

54

ICALL Indirect Call to Subroutine Appel de Sous-programme Indirect


Appel indirect d'un sous-programme indiqu par le registre Z sur une plage large de 64 Ko dans l'espace de mmoire programme. L'indicateur de pile est dcrment pendant ICALL. PC = Z avec modle PC de 16 bits soit 128Ko de mmoire programme maximum. PC(15:0) = Z, PC(21:16)=0, avec modle PC de 22 bits. Avec : Z = 0 65 535 (16 bits ou 22 bits). Instruction : Code Oprateurs Pointeur Pile Pile PC Octet Cycle PS = PS 2 3 ICALL Z PC + 1 Z 2 PS = PS 3 4 Code : 1001 0101 0000 1001 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Appel de sous-programme indirect mov r30, r0 ; Copie r0 dans r30 icall check ; Appel sous-programme point par r31:r30 nop ; Continue ... ...

IJMP Indirect Jump Saut Indirect


Saut indirect l'adresse indique par Z sur une plage large de 64 Ko dans l'espace mmoire programme. Cette instruction n'est pas disponible dans tous les modles. PC = Z avec modle PC de 16 bits soit 128Ko de mmoire programme maximum. PC(15:0) = Z, PC(21:16)=0, avec modle PC de 22 bits. Avec : Z = 0 65 535 (16 bits ou 22 bits). Instruction : Code Oprateurs Rsultat PC Octet Cycle IJMP Z Z 2 2 Code : 1001 0100 0000 1001 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Saut Indirect mov r30, r0 ; Copie de r0 dans Z (r30) ijmp ; Saut au programme point par r31:r30

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

55

IN - Load an I/O Location to Register Lecture dune Entre/Sortie


Lecture dune donne de l'espace d'Entre/Sortie (Ports, Timer, Configuration, ) et la placer dans le registre Rd : Rd = I/O(A) Avec : Rd = 0 31 et A = 0 63. Instruction : Code Oprateurs IN Rd, A Code : Code Instruction Registre Statut : SREG I T Action Exemple : ; Lecture dun port in r25, $16 cpi r25, 4 breq exit ... exit: nop

Rsultat Rd 1011 H S 0AAd V -

PC PC + 1 dddd N Z -

Octet 2 AAAA C -

Cycle 1

; Lecture Port B ; Compare avec une constante 4 ; Branche si r25=4 ; Branchement destination

INC Increment - Incrment


Ajoute 1 au contenu du registre Rd et place le rsultat dans Rd. Le drapeau C dans SREG n'est pas affect par l'opration, permettant ainsi l'instruction INC d'tre employ comme un compteur de boucle dans des calculs de prcision multiple. On peut raliser des boucles dattente en faisant fonctionner INC sur des valeurs non signes avec BREQ et BRNE. En utilisant des valeurs en complment 2, tous les branchements signes sont disponibles. Rd = Rd + 1 Avec : Rd = 0 31. Instruction : Code INC Code : Registre Statut : SREG Action I T H S X V X N X Z X C -

Oprateurs Rd Code Instruction

Rsultat Rd 1001 010d

PC PC + 1 dddd

Octet 2 0011

Cycle 1

S=NV V = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Incrmentation ldi r17, $10 ; Charge $10 dans r17 loop: add r1, r2 ; Addition de r2 r1 inc r17 ; Incrment de r17 cpi r17, $4F ; Compare r22 $4f Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 56

brne nop

loop

; Branche si r17 <> $4f ; Continue

JMP Jump - Saut


Saut l'adresse indique par k sur une plage large de 4 Mo dans l'espace mmoire programme. Cette instruction n'est pas disponible dans tous les modles. PC = k Avec : k = 0 4 194 303 (22 bits). Instruction : Code Oprateurs JMP k Code : Code Instruction Suite du code Registre Statut : SREG I T Action Exemple : ; Saut inconditionnel mov r1,r0 jmp farplc ... farplc: nop

Rsultat 1001 kkkk H S 010k kkkk

PC k kkkk kkkk N -

Octet 4 110k kkkk Z C -

Cycle 3

V -

; Copie r0 dans r1 ; Saut inconditionnel ; Destination du saut

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

57

LD Load Indirect from Data Space to Register using Index X Charge Indirect X
Charge un octet indirectement via X de l'espace de donnes sur un registre daccs rapide. L'espace de donnes est soit les registres daccs rapide, soit la mmoire d'Entre/Sortie, soit la SRAM interne. L'EEPROM a un espace d'adresse spar non accessible. L'emplacement de la donnes est indiqu par le registre X (16 bits). L'accs de la mmoire est limit au segment de donnes sur 64Ko. Pour avoir accs un autre segment de donnes dans les modles avec plus d'espace, la RAMPX dans le secteur d'Entre/Sortie doit tre chang. Le Registre X peut tre laiss inchang par l'opration, ou il peut tre post-incrment ou pr-dcrment. Ces particularits sont utiles pour l'accs aux tableaux, tables et empilement, avec une restriction seulement 256 octets, car seul l'octet bas de X est mis jour. Loctet haut de X n'est pas employ par cette instruction et peut tre employ pour d'autres buts. Attention, le rsultat de ces combinaisons utilisant le registre X est non dfini : LD r26, X+ ; LD r27, X+ ; LD r26, -X ; LD r27, -X. Rd = (X) [1] ou Rd = (X), X = X + 1 [2], ou X = X 1, Rd = (X) [3] Avec : Rd = 0 31 (sauf 26 et 27). Instruction : Code Oprateurs Rsultat PC Octet Cycle LD (X) Rd PC + 1 2 2 Code : 1001 010d dddd 1100 Code Instruction 1 1001 010d dddd 1101 Code Instruction 2 1001 010d dddd 1110 Code Instruction 3 En fonction de lopration simple [1], de la post-incrmentation [2] ou de la pr-incrmentation [3], le code instruction change. Registre Statut : SREG I T H S V N Z C Action Exemple : ; Charge indirect X clr r27 ; Efface X bits haut ldi r26, $60 ; X bas $60 ld r0, X+ ; Charge r0 avec la donne ladresse $60(X post inc) ld r1, X ; Charge r1 avec la donne ladresse $61 ldi r26, $63 ; X bas $63 ld r2, X ; Charge r2 avec la donne ladresse $63 ld r3, X ; Charge r3 avec la donne ladresse $62(X pre dec)

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

58

LD (LDD) Load Indirect from Data Space to Register using Index Y Charge Indirect Y
Charge un octet indirectement via Y de l'espace de donnes sur un registre daccs rapide. L'espace de donnes est soit les registres daccs rapide, soit la mmoire d'Entre/Sortie, soit la SRAM interne. L'EEPROM a un espace d'adresse spar non accessible. L'emplacement de la donnes est indiqu par le registre Y (16 bits). L'accs de la mmoire est limit au segment de donnes sur 64Ko. Pour avoir accs un autre segment de donnes dans les modles avec plus d'espace, la RAMPY dans le secteur d'Entre/Sortie doit tre chang. Le Registre Y peut tre laiss inchang par l'opration, ou il peut tre post-incrment ou pr-dcrment. Ces particularits sont utiles pour l'accs aux tableaux, tables et empilement, avec une restriction seulement 256 octets, car seul l'octet bas de Y est mis jour. Loctet haut de Y n'est pas employ par cette instruction et peut tre employ pour d'autres buts. Attention, le rsultat de ces combinaisons utilisant le registre Y est non dfini : LD r28, Y+ ; LD r29, Y+ ; LD r28, -Y ; LD r29, -Y. Rd = (Y) [1] ou Rd = (Y), Y = Y + 1 [2], ou Y = Y 1, Rd = (Y) [3], ou Rd = (Y + q) [4] Avec : Rd = 0 31 (sauf 28 et 29), q = 0 63. Instruction : Code Oprateurs Rsultat PC Octet Cycle LD & LDD (Y), q Rd PC + 1 2 2 Code : 1000 000d dddd 1100 Code Instruction 1 1001 000d dddd 1101 Code Instruction 2 1001 000d dddd 1110 Code Instruction 3 10q0 qq0d dddd 1qqq Code Instruction 4 En fonction de lopration simple [1], de la post-incrmentation [2] ; de la pr-incrmentation [3] ou du dcalage dans lespace dEntre/Sortie [4], le code instruction change. Registre Statut : SREG I T H S V N Z C Action Exemple : ; Charge indirect Y clr r29 ; Efface Y bit haut ldi r28, $60 ; Y bas $60 ld r0, Y+ ; Charge r0 avec la donne ladresse $60(Y post inc) ld r1, Y ; Charge r1 avec la donne ladresse $61 ldi r28, $63 ; Y bas $63 ld r2, Y ; Charge r2 avec la donne ladresse $63 ld r3, -Y ; Charge r3 avec la donne ladresse $62(Y pre dec) ldd r4, Y+2 ; Charge r4 avec la donne ladresse $64

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

59

LD (LDD) Load Indirect From Data Space to Register using Index Z Charge Indirect Z
Charge un octet indirectement via Z de l'espace de donnes sur un registre daccs rapide. L'espace de donnes est soit les registres daccs rapide, soit la mmoire d'Entre/Sortie, soit la SRAM interne. L'EEPROM a un espace d'adresse spar non accessible. L'emplacement de la donnes est indiqu par le registre Z (16 bits). L'accs de la mmoire est limit au segment de donnes sur 64Ko. Pour avoir accs un autre segment de donnes dans les modles avec plus d'espace, la RAMPY dans le secteur d'Entre/Sortie doit tre chang. Le Registre Z peut tre laiss inchang par l'opration, ou il peut tre post-incrment ou pr-dcrment. Ces particularits sont utiles pour l'accs aux tableaux, tables et empilement, avec une restriction seulement 256 octets, car seul l'octet bas de Z est mis jour. Loctet haut de Z n'est pas employ par cette instruction et peut tre employ pour d'autres buts. Attention, le rsultat de ces combinaisons utilisant le registre Z est non dfini : LD r30, Z+ ; LD r31, Z+ ; LD r30, -Z ; LD r31, -Z. Rd = (Z) [1] ou Rd = (Z), Z = Z + 1 [2], ou Z = Z 1, Rd = (Z) [3], Rd = (Z + q) [4] Avec : Rd = 0 29 (sauf 30 et 31), q = 0 63. Instruction : Code Oprateurs Rsultat PC Octet Cycle LD & LDD (Z), q Rd PC + 1 2 2 Code : 1000 000d dddd 0000 Code Instruction 1 1001 000d dddd 0001 Code Instruction 2 1001 000d dddd 0010 Code Instruction 3 10q0 qq0d dddd 0qqq Code Instruction 4 En fonction de lopration simple [1], de la post-incrmentation [2] ; de la pr-incrmentation [3] ou du dcalage dans lespace dEntre/Sortie [4], le code instruction change. Registre Statut : SREG I T H S V N Z C Action Exemple : ; Charge indirect Z clr r31 ; Efface Z haut ldi r30,$60 ; Z bas $60 ld r0,Z+ ; Charge r0 avec la donne ladresse $60(Z post inc) ld r1,Z ; Charge r1 avec la donne ladresse $61 ldi r30,$63 ; Z bas $63 ld r2,Z ; Charge r2 avec la donne ladresse $63 ld r3,-Z ; Charge r3 avec la donne ladresse $62(Z pre dec) ldd r4,Z+2 ; Charge r4 avec la donne ladresse $64

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

60

LDI Load Immediate Charge Valeur Immdiate


Charge la valeur immdiate dun octet sur un registre daccs rapide. Rd = K Avec : Rd = 16 31, K = 0 255. Instruction : Code Oprateurs LDI Rd, K Code : Code Instruction Registre Statut : SREG I T Action Exemple : ; Charge immdiat clr r31 ldi r30, $F0 lpm ; Mmoire pointe par Z

Rsultat Rd 1110 H S -

PC PC + 1 KKKK V dddd N -

Octet 2

Cycle 1

KKKK Z C -

; Efface Z haut ; Z bas $F0 ; Charge les constantes du programme

LDS Load Direct from Data Space Charge Direct


Charge un octet directement de l'espace de donnes sur un registre daccs rapide. L'espace de donnes est soit les registres daccs rapide, soit la mmoire d'Entre/Sortie, soit la SRAM interne. L'EEPROM a un espace d'adresse spar non accessible. Une adresse 16 bits doit tre fournie. L'accs de la mmoire est limit au segment de donnes de 64Ko. L'instruction LDS emploie le registre de RAMPD pour avoir accs la mmoire suprieur 64Ko. Rd = (k) Avec : Rd = 16 31, k = 0 65535. Instruction : Code Oprateurs LDS Rd, k Code : Code Instruction Suite instruction Registre Statut : SREG I T Action Exemple : ; Charge direct mmoire lds r2, $FF00 add r2, r1 sts $FF00, r2

Rsultat Rd 1001 kkkk H S -

PC PC + 1 000d kkkk V dddd kkkk N -

Octet 4 0000 Kkkk Z C -

Cycle 2

; Charge r2 avec le contenu de ladresse $FF00 ; Ajout r1 r2 ; Ecrire en retour

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

61

LPM Load Program Memory Charge un Programme en Mmoire


Charge un octet indiqu par le registre Z dans la destination Rd. La mmoire programme est organise en mots de 16 bits alors que Z est une adresse en octet. Ainsi, le bit le moins significatif de Z choisit loctet bas (ZLSB = 0) ou loctet haut (ZLSB = 1). Cette instruction adresse les 64Ko (par mots de 32Ko) de mmoire programme. Le registre Z peut tre laiss inchang par l'opration, ou il peut tre incrment. L'augmentation ne s'applique pas au registre de RAMPZ. Les modles avec programmation interne peuvent employer l'instruction LPM pour lire les fusibles et les valeurs des bits de blocages. Rfrez-vous la documentation sur la programmation du microcontrleur. Le rsultat de ces combinaisons est non dfini : LPM r30, Z+, LPM r31, Z+. R0 = (Z) [1] ou Rd = (Z) [2], ou Rd = (Z), Z = Z + 1 [3] Avec : Rd = 0 29 (sauf 30 et 31). Instruction : Code Oprateurs Rsultat PC Octet Cycle LPM (Z) Rd PC + 1 2 3 Code : 1001 1010 1100 1000 Code Instruction 1 1001 000d dddd 0100 Code Instruction 2 1001 000d dddd 0101 Code Instruction 3 En fonction de lopration directe sur R0 [1], avec tous les registres daccs rapide [2], ou de la postincrmentation [3], le code instruction change. Registre Statut : SREG I T H S V N Z C Action Exemple : ; Charge programme en mmoire ldi ZH, high(Table_1<<1) ; Initialise Z avec ladresse de la table ldi ZL, low(Table_1<<1) lpm r16, Z ; Charge la constante du Programme ; Mmoire pointe par Z (r31:r30) ... Table_1: ; Adresse de la zone programmer Dw $5876 ; $76 est ladresse avec ZLSB = 0 ; $58 est ladresse avec ZLSB = 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

62

LSL Logical Shift Left Dcalage Logique Gauche


Dcalage de tous les bits dans Rd dune place gauche, le bit 0 est effac, le bit 7 est plac dans C. Cette opration multiplie efficacement les valeurs signes et non signes par deux.

Avec : Rd = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle LSL Rd Rd PC + 1 2 1 Code : 0000 11dd dddd Dddd Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 S=NV V=NC N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 Exemple : add r0, r4 ; Ajout de r4 r0 lsl r0 ; Multiplie r0 par 2

LSR Logical Shift Right Dcalage Logique Droite


Dcalage de tous les bits dans Rd dune place droite, le bit 7 est effac, le bit 0 est plac dans C. Cette opration divise efficacement les valeurs non signes par deux.

Avec : Rd = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle LSR Rd Rd PC + 1 2 1 Code : 1001 010d dddd 0110 Code Instruction Registre Statut : SREG I T H S V N Z C Action X X 0 X X S=NV V=NC Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd0 Exemple : add r0, r4 ; Addition r4 r0 lsr r0 ; Divise r0 par 2 Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 63

MOV Copy Register Copie de Registre


Cette instruction fait une copie d'un registre dans un autre. Le registre source Rr est laiss inchang, tandis que la destination se fait dans Rd. Rd = Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs MOV Rd, Rr Code : Code Instruction Registre Statut : SREG I T Action Exemple : ; Copie de registre mov r16, r0 call check ... check: cpi r16, $11 ... ret

Rsultat Rd 0010 H S -

PC PC + 1 11rd V dddd N -

Octet 2 rrrr Z C -

Cycle 1

; Copie r0 dans r16 ; Appel sous-programme ; Compare r16 et $11 ; Retour de sous-programme

MOVW Copy Register Word Copie dun Registre sur 16 bits


Cette instruction fait une copie d'une paire de registre dans un autre. Le registre source Rr1:0 est laiss inchang, tandis que la destination se fait dans Rd1:0. Rd1:0 = Rr1:0 Avec : Rd = 0 30 de 2 en 2 et Rr = 0 30 de 2 en 2. Instruction : Code Oprateurs Rsultat PC Octet Cycle MOVW Rd, Rr Rd PC + 1 2 1 Code : 0000 0001 dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Copie de Registre 16 bits movw r17:16, r1:r0 ; Copie r1:r0 avec r17:r16 call check ; Appel sous-programme ... check: cpi r16, $11 ; Compare r16 avec $11 ... cpi r17, $32 ; Compare r17 avec $32 ... ret ; Retour de sous-programme

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

64

MUL Multiply Unsigned Multiplication non Sign


Linstruction multiplie deux registres 8 bits, le rsultat est plac dans le registre 16 bits R1 et R0. Le multipliant Rd et le multiplicateur Rr sont deux registres contenant des nombres non signs. Le produit 16 bits non sign est plac dans R1 (loctet haut) et R0 (l'octet bas). Si le multipliant ou le multiplicateur sont R0 ou R1 le rsultat recopiera ceux-l aprs la multiplication. R1:R0 = Rd x Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle MUL Rd, Rr R1:R0 PC + 1 2 2 Code : 1001 11rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X Z = R15&R14&R13&R12&R11&R10&R9&R8&R7&R6& R5 & R4 & R3 & R2 & R1 & R0 C = R15 Exemple : ; Multiplication 2 x 8 bits = 16 bits mul r5, r4 ; Multiplie non sign r5 et r4 movw r4, r0 ; Copie le rsultat aprs dans r5:r4

MULS Multiply Signed Multiplication Sign


Linstruction multiplie deux registres 8 bits signs, le rsultat sign est plac dans le registre 16 bits R1 et R0. Le multipliant Rd et le multiplicateur Rr sont deux registres contenant des nombres signs. Le produit 16 bits sign est plac dans R1 (loctet haut) et R0 (l'octet bas). R1:R0 (sign) = Rd (sign) x Rr (sign) Avec : Rd = 16 31 et Rr = 16 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle MULS Rd, Rr R1:R0 PC + 1 2 2 Code : 0000 0010 dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X Z = R15&R14&R13&R12&R11&R10&R9&R8&R7&R6& R5 & R4 & R3 & R2 & R1 & R0 C = R15 Exemple : ; Multiplication 2 x 8 bits = 16 bits muls r21, r20 ; Multiplication sign r21 et r20 movw r20, r0 ; Copie la rsultat dans r21:r20

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

65

MULSU Multiply Signed with Unsigned Multiplication Sign et non Sign


Linstruction multiplie deux registres 8 bits, un sign lautre non sign, le rsultat sign est plac dans le registre 16 bits R1 et R0. Le multipliant Rd est un nombre sign et le multiplicateur Rr est un nombre non sign. Le produit 16 bits sign est plac dans R1 (loctet haut) et R0 (l'octet bas). R1:R0 (sign) = Rd (sign) x Rr (non sign) Avec : Rd = 16 23 et Rr = 16 23. Instruction : Code Oprateurs Rsultat PC Octet Cycle MULSU Rd, Rr R1:R0 PC + 1 2 2 Code : 0000 0011 0ddd 0rrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X Z = R15&R14&R13&R12&R11&R10&R9&R8&R7&R6& R5 & R4 & R3 & R2 & R1 & R0 C = R15 Exemple : ; Multiplication 2 x 16 bits = 32 bits (r19:r18:r17:r16 = r23:r22 * r21:r20) muls16x16_32: Multiplication 16 * 16 clr r2 ; Efface r2 muls r23, r21 ; (sign) ah * (sign) bh movw r19:r18, r1:r0 ; Copie le rsultat mul r22, r20 ; al * bl movw r17:r16, r1:r0 ; Copie le rsultat mulsu r23, r20 ; (signed)ah * bl sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 mulsu r21, r22 ; (sign) bh * al sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 ret ; Retour du sous-programme

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

66

NEG Twos Complement Complment Deux


Remplace le contenu de registre Rd avec le complment deux; le cas particulier de la valeur $80 est laiss inchang : Rd = $00 - Rd Avec : Rd = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle NEG Rd Rd PC + 1 2 1 Code : 1001 010d dddd 0001 Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = R3 + Rd3 S=NV V = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = R7 + R6 + R5 + R4 + R3 + R2 + R1 + R0 Exemple : ; Complment deux sub r11, r0 ; Soustrait r0 de r11 brpl positive ; Branche si rsultat positif neg r11 ; Complment deux de r11 positive: nop ; Destination du branchement

NOP No Operation Pas dOpration


Cette instruction consomme 1 cycle dhorloge ne rien faire (attente). Instruction : Code Oprateurs Rsultat PC Octet Cycle NOP PC + 1 2 1 Code : 0000 0000 0000 0000 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Attente dun cycle clr r16 ; Efface r16 ser r17 ; Active r17 out $18, r16 ; Ecrire sur le port B nop ; Attendre la synchronisation out $18, r17 ; Ecrire sur le port B

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

67

OR Logical OR OU Logique
Excute un OU logique entre le contenu de Rd et Rr et place le rsultat dans Rd : Rd = Rd ! Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet OR Rd, Rr Rd PC + 1 2 Code : 0010 10rd Dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Ou logique or r15, r16 ; Test les deux registres bst r15, 6 ; Stock le bit 6 de r15 dans T brts ok ; Branche si T est 1 ... ok: nop ; Destination du branchement

Cycle 1

ORI Logical OR with Immediate OU Logique Immdiat


Excute un OU logique entre le contenu de Rd et une valeur immdiate et place le rsultat dans Rd : Rd = Rd ! K Avec : Rd = 16 31 et K = 0 255. Instruction : Code Oprateurs Rsultat PC Octet ORI Rd, K Rd PC + 1 2 Code : 0110 KKKK dddd KKKK Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Ou logique ori r16, $F0 ; Met les 4 bits de poids fort de r16 1 ori r17, 1 ; Met le bit 0 de r17 1

Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

68

OUT Store Register to I/O Location Ecriture dune Entre/Sortie


Ecriture dune donne prsente sur le registre Rr dans l'espace d'Entre/Sortie (Ports, Timer, Configuration, ) : I/O(A) = Rr Avec : Rr = 0 31 et A = 0 63. Instruction : Code Oprateurs OUT Rr, A Code : Code Instruction Registre Statut : SREG I T Action Exemple : ; Ecriture dun port clr r16 ser r17 out $18, r16 nop out $18, r17

Rsultat 1011 H S 1AAr V -

PC PC + 1 rrrr N Z -

Octet 2 AAAA C -

Cycle 1

; Efface r16 ; r17 = 1 ; Ecrire 0 sur le Port B ; Attendre la synchronisation ; Ecrire 1 sur le Port B

POP Pop Register from Stack Restaure la Donne de la Pile


Restauration de la donne de la pile sur un registre daccs rapide. L'instruction lie la valeur de la pile et le stock dans le registre Rd. L'indicateur de pile est pr incrment de 1 avant dexcuter linstruction POP. Rd = PILE Avec : Rd = 0 31. Instruction : Code Oprateurs Rsultat Pointeur Pile PC Octet POP Rd Rd PS = PS + 1 PC + 1 2 Code : 1001 000d Dddd 1111 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Restaure de la pile sur un registre call routine ; Appel de sous-programme ... routine: push r14 ; Stock r14 sur la pile push r13 ; Stock r13 sur la pile ... pop r13 ; Restaure r13 pop r14 ; Restaure r14 ret ; Retour de sous-programme

Cycle 2

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

69

PUSH Push Register on Stack Stock un Registre sur la Pile


Stock la donne dun registre daccs rapide sur la pile sur. L'instruction lie la valeur du registre Rr et le stock sur la pile. L'indicateur de pile est post dcrment de 1 avant dexcuter linstruction PUSH. PILE = Rr Avec : Rr = 0 31. Instruction : Code PUSH Code : Registre Statut : SREG Action Exemple : call ... push push ... pop pop ret routine r14 r13 r13 r14 ; Appel de sous-programme ; Stock r14 sur la pile ; Stock r13 sur la pile ; Restaure r13 ; Restaure r14 ; Retour de sous-programme I T H S V N Z C -

Oprateurs Rr

Rsultat -

Pointeur Pile PS = PS - 1 001r

PC PC + 1 rrrr

Octet 2 1111

Cycle 2

Code Instruction

1001

routine:

RCALL Relative Call to Subroutine Appel Relatif dun Sous-programme


Appel dun sous-programme relatif ladresse du PC avec une plage de -2Ko+1 +2Ko. L'adresse de retour (l'instruction aprs RCALL) est stocke sur la Pile. Dans l'assembleur, des tiquettes sont employes au lieu des oprandes relatifs pour simplifier lcriture. Cette instruction peut adresser la totalit de la mmoire programme. Le pointeur de pile est dcrment par linstruction RCALL. Cette instruction doit tre utilise pour faire des appels court de sous-programme. PC = PC + k + 1 Avec : k = -2048 2047 (16 bits ou 22 bits). Instruction : Code Oprateurs Pointeur Pile Pile PC Octet k (16 bits) PS = PS 2 RCALL PC + 1 PC + k + 1 2 k (22Bits) PS = PS 3 Code : 1101 kkkk kkkk kkkk Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : rcall routine ; Appel de sous-programme relatif ... routine: push r14 ; Sauve r14 sur la pile ... pop r14 ; Restaure r14 ret ; Retour de sous-programme Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

Cycle 3 4

70

RET Return from Subroutine Retour de Sous-programme


Retour de sous-programme. L'adresse de retour est charge de la PILE. Le pointeur de pile est pr incrment pendant lexcution de linstruction RET. PC = PILE (16 bits ou 22 bits) Instruction : Code RET Code : Code Instruction Registre Statut : SREG Action I T H S V N Z C 1001 0101 0000 1000 Oprateurs (16 bits) (22Bits) Pointeur Pile PS = PS + 2 PS = PS + 3 PC PILE Octet 2 Cycle 4 5

Exemple : ; Appel de sous-programme call routine ... routine: push r14 ... pop r14 ret

; Appel de sous-programme ; Sauve r14 sur la pile ; Restaure r14 ; Retour de sous-programme

RETI Return from Interrupt Retour dInterruption


Retour dinterruption. L'adresse de retour est charge de la PILE. Le pointeur de pile est pr incrment pendant lexcution de linstruction RET. Note : le registre de statut n'est pas automatiquement stock lors dune routine dinterruption, il n'est donc pas rtabli au retour dune interruption, cela doit tre trait par votre application. PC = PILE (16 bits ou 22 bits) Instruction : Code RETI Code : Code Instruction Registre Statut : SREG Action Exemple : ; Retour dinterruption routine: push r0 ... pop r0 reti I T H S V N Z C 1001 0101 0001 1000 Oprateurs (16 bits) (22Bits) Pointeur Pile PS = PS + 2 PS = PS + 3 PC PILE Octet 2 Cycle 4 5

; Sauve r0 sur la pile ; Restaure r0 ; Retour dinterruption

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

71

RJMP Relative Jump Saut Relatif


Saut relatif ladresse du PC avec une plage de -2Ko+1 +2Ko. Dans l'assembleur, des tiquettes sont employes au lieu des oprandes relatifs pour simplifier lcriture. Cette instruction peut adresser la totalit de la mmoire programme. Cette instruction doit tre utilise pour faire des sauts courts. PC = PC + k + 1 Avec : k = -2048 2047. Instruction : Code RJMP Code : Code Instruction Registre Statut : SREG Action Exemple : ; Saut relatif cpi brne rjmp add inc nop r16, $42 error ok r16, r17 r16 ; Compare r16 avec $42 ; Branche si r16 <> $42 ; Branchement inconditionnelle ; Addition r17 r16 ; Incrment de r16 ; Destination du saut I T H S V N Z C 1100 kkkk kkkk kkkk Oprateurs k PC PC + k + 1 Octet 2 Cycle 2

error: ok:

ROL Rotate Left trough Carry Rotation Gauche avec Retenue


Dcale tous les bits de Rd dune place gauche, le drapeau C est charg avec le bit 0 de Rd et le bit 7 est charg avec le drapeau C. Cette instruction, combine avec LSL, multiplie efficacement les octets des valeurs signes et non signes par deux.

Avec : Rd = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle ROL Rd Rd PC + 1 2 1 Code : 0001 11dd dddd dddd Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 S=NV V=NC N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 Exemple : ; Rotation gauche Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 72

oneenc:

lsl rol brcs ... nop

r18 r19 oneenc

; Multiplie r19:r18 par 2 ; r19:r18 est sign ou non sign sur 2 bits ; Branche si C est 1 ; Destination du branchement

ROR Rotate Right through Carry Rotation Droite avec Retenue


Dcale tous les bits de Rd dune place droite, le drapeau C est charg avec le bit 7 de Rd et le bit 0 est charg avec le drapeau C. Cette instruction, combine avec ASR, divise efficacement les octets des valeurs signes par deux et combine avec LSR, divise efficacement les octets des valeurs non signes par deux.

Avec : Rd = 0 31. Instruction : Code Oprateurs Rsultat PC Octet Cycle ROR Rd Rd PC + 1 2 1 Code : 1001 010d dddd 0111 Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X S=NV V=NC N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 Exemple : ; Rotation Droite lsr r19 ; Divise r19:r18 par 2 ror r18 ; r19:r18 est non sign brcc zeroenc1 ; Branche si C est 0 asr r17 ; Divise r17:r16 par 2 ror r16 ; r17:r16 est sign brcc zeroenc2 ; Branche si C est 0 ... zeroenc1: nop ; Destination du branchement ... zeroenc2: nop ; Destination du branchement ...

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

73

SBC Subtract with Carry Soustraction avec Retenue


Soustrait deux registres Rd et Rr avec la retenue C et place le rsultat dans le registre Rd. Rd = Rd - Rr - C Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet SBC Rd, Rr Rd PC + 1 2 Code : 0000 10rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7 & Rr7 & R7 ! Rd7 & Rr7 & R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 & Z C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : ; Soustraction sur 16 bits r1:r0 par r3:r2 sub r2, r0 ; Soustraction bas sbc r3, r1 ; Soustraction haut avec retenue

Cycle 1

SBCI Subtract Immediate with Carry Soustraction Immdiate avec Retenue


Soustraction dune valeur immdiate K au registre Rd avec la retenue C et place le rsultat dans le registre Rd. Rd = Rd K - C Avec : Rd = 16 31 et K = 0 255. Instruction : Code Oprateurs Rsultat PC Octet Cycle SBCI Rd, K Rd PC + 1 2 1 Code : 0100 KKKK dddd KKKK Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7 & Rr7 & R7 ! Rd7 & Rr7 & R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 & Z C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : ; Soustraction Immdiate $4F23 r17:r16 subi r16, $23 ; Soustraction bas sbci r17, $4F ; Soustraction haut avec retenue

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

74

SBI Set Bit in I/O Register Active le Bit des Entre/Sortie


Met le bit b indiqu dans le registre d'Entre/Sortie A. Cette instruction fonctionne sur la partie infrieure des registres d'Entre/Sortie - adresse 0 31 : I/O(A, b) = 1 Avec : A = 0 31 et b = 0 7. Instruction : Code Oprateurs SBI A, b Code : Code Instruction Registre Statut : SREG I T Action Exemple : ; Active une Entre/Sortie out $1E, r0 sbi $1C, 0 in r1, $1D

Rsultat 1001 H S 1010 V -

PC PC + 1 AAAA N Z -

Octet 2 Abbb C -

Cycle 1

; Ecrire ladresse de lEEPROM ; Active le bit dcriture EECR ; Lire la donne de lEEPROM

SBIC Skip if Bit in I/O Register is Cleared Saute si Bit I/O est 0
Cette instruction value un bit b simple dans une Entre/Sortie A et saute l'instruction suivante si le bit est 0. Cette instruction fonctionne sur la partie infrieure des Entre/Sorties - adresse 0 31 : Si I/O(A,b) = 0 alors PC = PC + 2 (ou 3) sinon PC = PC + 1 Avec : A = 0 31 et b = 0 7. Instruction : Code Oprateurs Rsultat PC Octet Cycle PC + 1 1 SBIC A, b PC + 2 2 2 PC + 3 3 Code : 1001 1001 AAAA Abbb Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Test les bits dEntre/Sortie e2wait: sbic $1C,1 ; Saute linstruction suivante si EEWE = 0 rjmp e2wait ; EEPROM Ecriture non finie nop ; Continue

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

75

SBIS Skip if Bit in I/O Register is Set Saute si Bit I/O est 1
Cette instruction value un bit b simple dans une Entre/Sortie A et saute l'instruction suivante si le bit est 1. Cette instruction fonctionne sur la partie infrieur des Entre/Sorties - adresse 0 31 : Si I/O(A,b) = 1 alors PC = PC + 2 (ou 3) sinon PC = PC + 1 Avec : A = 0 31 et b = 0 7. Instruction : Code Oprateurs Rsultat PC Octet Cycle PC + 1 1 SBIS A, b PC + 2 2 2 PC + 3 3 Code : 1001 1011 AAAA Abbb Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Test les bits dEntre/Sortie waitset: sbis $10,0 ; Saut linstruction suivante si bit 0 du Port D = 1 rjmp waitset ; Bit = 0 nop ; Continue

SBIW Subtract Immediate from Word Soustraction Immdiate 16 bits


Soustraction dune valeur immdiate k (0 - 63) une paire de registre et place le rsultat de la paire de registre dans Rd1:0. Cette instruction fonctionne sur 4 paires de registre uniquement et est adapter aux oprations sur les registres d'indicateur. Cette instruction n'est pas disponible dans tous les modles. Rd+1:Rd = Rd+1:Rd - k Avec : Rd = {24, 26, 28 ou 30} et k = 0 63. Instruction : Code Oprateurs Rsultat PC Octet Cycle SBIW Rd+1:Rd, k Rd+1 :Rd PC + 1 2 2 Code : 1001 0111 kkdd kkkk Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X S=NV V = Rdh7 & R15 N = R15 Z = R15&R14&R13&R12&R11&R10&R9 & R8 & R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = R15 & Rdh7 Exemple : ; Soustraction Immdiate sbiw r25:r24, 1 ; Soustraction de 1 r25:r24 sbiw YH:YL, 63 ; Soustraction 63 Y (pointeur r29:r28)

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

76

SBR Set Bits in Register Active le Bit du Registre


Active les bits dans le registre Rd par lexcution dun OU logique entre le contenu du registre Rd et un masque k et place le rsultat dans Rd. Rd = Rd ! k Avec : Rd = 16 31 et k = 0 255. Instruction : Code Oprateurs Rsultat PC Octet SBR Rd, k Rd PC + 1 2 Code : 0110 kkkk dddd kkkk Code Instruction Registre Statut : SREG I T H S V N Z C Action X 0 X X S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Active des bits sbr r16, 3 ; Active le bit 0 et 1 dans r16 sbr r17, $F0 ; Active les 4 MSB dans r17

Cycle 1

SBRC Skip if Bit in Register is Cleared Saute si le Bit du Registre est 0


Cette instruction value un bit simple b dans un registre et saute l'instruction suivante si le bit est 0. Si Rr(b) = 0 alors PC = PC + 2 (or 3) sinon PC = PC + 1 Avec : Rr = 0 31 et b = 0 7. Instruction : Code Oprateurs Rsultat PC Octet Cycle PC + 1 1 SBRC Rr, b PC + 2 2 2 PC + 3 3 Code : 1111 110r rrrr 0bbb Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Test les bits du Registre sub r0, r1 ; Soustraction r1 r0 sbrc r0, 7 ; Saute si le bit 7 dans r0 est 0 sub r0, r1 ; Excut seulement si le bit 7 dans r0 <> 0 nop ; Continue

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

77

SBRS Skip if Bit in Register is Set Saute si le Bit du Registre est 1


Cette instruction value un bit simple b dans un registre et saute l'instruction suivante si le bit est 1. Si Rr(b) = 1 alors PC = PC + 2 (or 3) sinon PC = PC + 1 Avec : Rr = 0 31 et b = 0 7. Instruction : Code Oprateurs Rsultat PC Octet Cycle PC + 1 1 SBRS Rr, b PC + 2 2 2 PC + 3 3 Code : 1111 111r rrrr 0bbb Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Test les bits du Registre sub r0, r1 ; Soustraction r1 r0 sbrs r0, 7 ; Saute si le bit 7 dans r0 est 1 sub r0, r1 ; Excut seulement si le bit 7 dans r0 <> 1 nop ; Continue

SEC Set Carry Flag Active la Retenue C = 1


Active la retenue dans le registre SREG : C=1 Instruction : Code SEC Code : Registre Statut : SREG Action Exemple : ; Active la Retenue sec adc I T H S V N Z C 1 Oprateurs Code Instruction Rsultat 1001 0100 PC PC + 1 0000 Octet 2 1000 Cycle 1

r0, r1

; Active la retenue ; r0 = r0 + r1 + 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

78

SEH Set Half Carry Flag Active la Demi Retenue H = 1


Active la demi-retenue dans le registre SREG : H=1 Instruction : Code SEH Code : Registre Statut : SREG Action Exemple : ; Active la demi-retenue sec I T H 1 S V N Z C Oprateurs Code Instruction Rsultat 1001 0100 PC PC + 1 0101 Octet 2 1000 Cycle 1

; Active la demi-retenue

SEI Set Global Interrupt Flag Active les Interruptions I = 1


Active les interruptions dans le registre SREG : I=1 Instruction : Code SEI Code : Registre Statut : SREG Action Exemple : ; Active les interruptions sei sleep I 1 T H S V N Z C Oprateurs Code Instruction Rsultat 1001 0111 PC PC + 1 0000 Octet 2 1000 Cycle 1

; Active les interruptions ; Entrer en mode sleep, attente une interruption

SEN Set Negative Flag Active le Signe S = 1


Active le signe dans le registre SREG : S=1 Instruction : Code SEN Code : Registre Statut : SREG Action Exemple : add sen r2, r19 ; Addition de r19 r2 ; Active le signe Ngatif 79 I T H S V N 1 Z C Oprateurs Code Instruction Rsultat 1001 0100 PC PC + 1 0010 Octet 2 1000 Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

SER Set all Bits in Register Active Tous les Bits du Registre
Active tout les bits du registre Rd : Rd = $FF Avec : Rd = 16 31 Instruction : Code SER Code : Registre Statut : SREG Action Exemple : ; Active tout les bit clr ser out nop out I T H S V N Z C -

Oprateurs Rd Code Instruction

Rsultat Rd 1110 1111

PC PC + 1 dddd

Octet 2 1111

Cycle 1

r16 r17 $18, r16 $18, r17

; Efface r16 ; Active r17 ; Ecrit 0 dans le Port B ; Attente synchronisation ; Ecrit 1 dans le Port B

SES Set Signed Flag Active les Nombres Signs S = 1


Active les nombres signs dans le registre SREG : S=1 Instruction : Code SES Code : Registre Statut : SREG Action I T H S 1 V N Z C Oprateurs Code Instruction Rsultat 1001 0100 PC PC + 1 0100 Octet 2 1000 Cycle 1

Exemple : ; Active les nombres signs add r2, r19 ses

; Addition de r19 r2 ; Active les nombres signs

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

80

SET Set T Flag Active le Test T = 1


Active le test dans le registre SREG : T=1 Instruction : Code SET Code : Registre Statut : SREG Action Exemple : ; Active le Test set I T 1 H S V N Z C Oprateurs Code Instruction Rsultat 1001 0100 PC PC + 1 0110 Octet 2 1000 Cycle 1

; Active le bit de Test

SEV Set Overflow Flag Active le dbordement V = 1


Active le dbordement dans le registre SREG : V=1 Instruction : Code SEV Code : Registre Statut : SREG Action I T H S V 1 N Z C Oprateurs Code Instruction Rsultat 1001 0100 PC PC + 1 0011 Octet 2 1000 Cycle 1

Exemple : ; Active le dbordement add r2, r19 sev

; Addition de r19 r2 ; Active le dbordement

SEZ Set Zero Flag Active le Zro Z = 1


Active le zro dans le registre SREG : Z=1 Instruction : Code SEZ Code : Registre Statut : SREG Action Exemple : add sez r2, r19 ; Addition de r19 r2 ; Active le Zro 81 I T H S V N Z 1 C Oprateurs Code Instruction Rsultat 1001 0100 PC PC + 1 0001 Octet 2 1000 Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

SLEEP Mode Sommeil


Cette instruction met le circuit dans le mode de sommeil dfini par le registre de contrle du MCU. Instruction : Code Oprateurs Rsultat PC Octet Cycle SLEEP PC + 1 2 1 Code : 1001 0101 1000 1000 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Active le mode sommeil mov r0,r11 ; Copie r11 dans r0 ldi r16,(1<<SE) ; Active le mode sommeil out MCUCR, r16 sleep ; Met le MCU en mode sommeil

SPM Store Program Memory Stock le Programme en Mmoire


SPM peut tre employ pour effacer une page dans la mmoire programme, crire une page dans la mmoire programme (qui est dj effac) et mettre des bits de blocage en mode boot. Dans certains modles, la mmoire programme peut tre crite un mot la fois, dans d'autres une page entire peut tre programme simultanment aprs le remplissage d'une zone de page provisoire. Dans tous les cas, la mmoire programme doit tre efface une page la fois. En effaant la mmoire programme, la RAMPZ et le registre Z est employ comme l'adresse de page et la paire de registre de R1:R0 est employe comme des donnes. En mettant les bits de blocage (boot), la paire de registre de R1:R0 est aussi employe comme des donnes. Rfrez-vous la documentation du modle pour la description dtaille d'utilisation de SPM. (RAMPZ:Z) = $FFFF Efface la page de la mmoire programme (RAMPZ:Z) = R1:R0 Ecrit un mot dans la page de la mmoire programme (RAMPZ:Z) = R1:R0 Ecrit dans la page buffer provisoire (RAMPZ:Z) = TEMP Ecrit la page buffer dans la page de la mmoire programme BLBITS = R1:R0 Active le Boot Loader Lock bits Instruction : Code SPM Code : Registre Statut : SREG Action I T H S V N Z C Oprateurs Code Instruction Rsultat 1001 0101 PC PC + 1 1110 Octet 2 1000 Cycle Variable

Exemple : ; Programme la mmoire programme, cet exemple montre que SPM crit une page de donnes dans la RAM, le premier emplacement de donn dans la RAM est indique par Y, le premier emplacement de donn dans la Flash est indiqu par le traitement d'erreur de Z. ; Registres utiliss: r0, r1, temp1, temp2, looplo, loophi, spmcrval, (temp1, temp2, looplo, loophi, spmcrval) EcriPage: Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 82

.equ PAGESIZEB = PAGESIZE*2 ; PAGESIZEB est la taille de la page en octet .org SMALLBOOTSTART ; Effacement de la page ldi spmcrval, (1<<PGERS) + (1<<SPMEN) call do_spm ; Transfert donnes de la RAM vers la Flash page provisoire ldi looplo, low(PAGESIZEB) ; Init boucle variable ldi loophi, high(PAGESIZEB) ; Non requis pour PAGESIZEB<=256 wrloop: ldr 0, Y+ ldr 1, Y+ ldi spmcrval, (1<<SPMEN) call do_spm adiw ZH:ZL, 2 sbiw loophi:looplo, 2 ; Utilise subi pour PAGESIZEB<=256 brne wrloop ; Execute lcriture de page subi ZL, low(PAGESIZEB) ; Restaure pointeur sbci ZH, high(PAGESIZEB) ; Non requis pour PAGESIZEB<=256 ldi spmcrval, (1<<PGWRT) + (1<<SPMEN) call do_spm ; Lecture arrire et test, optionel ldi looplo, low(PAGESIZEB) ; Init boucle variable ldi loophi, high(PAGESIZEB) ; Non requis pour PAGESIZEB<=256 subi YL, low(PAGESIZEB) ; Restaure pointeur sbci YH, high(PAGESIZEB) rdloop: lpm r0, Z+ ldr 1, Y+ cpse r0, r1 jmp error sbiw loophi:looplo, 2 ; Utilise subi pour PAGESIZEB<=256 brne rdloop ; Retour ret do_spm: ; Entre: spmcrval dtermine SPM action, dsactive les interruptions si active, stock stratus intemp2, SREG cli ; Test pour premire SPM complte wait: in temp1, SPMCR sbrc temp1, SPMEN rjmp wait ; SPM temps squence out SPMCR, spmcrval spm ; Restore SREG (et active les interruptions si originellement activ) out SREG, temp2 ret

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

83

ST Store Indirect From Register to Data Space using Index X Stock Indirect X
Stock un octet indirect d'un registre dans l'espace de donnes. L'espace de donne est constitu des registres daccs rapide, des registres d'Entre/Sortie et de la SRAM. L'EEPROM a un espace d'adresse spar inaccessible directement. L'emplacement de la donne est indiqu par le registre X (16 bits). L'accs de la mmoire est limit au segment de donnes actuel de 64Ko. Pour avoir accs un autre segment de donnes dans des modles avec plus d'espace de donnes, le RAMPX dans le registre d'Entre/Sortie doit tre chang. Le Registre X peut tre laiss inchang par l'opration, ou il peut tre incrment en post ou en pr dcrmentation. Ces particularits sont intressantes pour l'accs aux tableaux, aux tables et empilement avec l'utilisation du registre X comme index. Seule l'octet bas de X est mis jour avec un maximum de 256 octets. Loctet haut de X nest pas modifi par la dcrmentation et peut tre employ pour d'autres buts. Le rsultat des combinaisons suivantes est non dfini : ST X+, r26 ; ST X+, r27 ; ST -X, r26 ; ST -X, r27. (X) = Rr [1] ou (X) = Rr, X = X + 1 [2], ou X = X 1, (X) = Rr [3] Avec : Rr = 0 31 (sauf 26 et 27). Instruction : Code Oprateurs Rsultat PC Octet Cycle ST (X) PC + 1 2 2 Code : 1001 001r rrrr 1100 Code Instruction 1 1001 001r rrrr 1101 Code Instruction 2 1001 001r rrrr 1110 Code Instruction 3 En fonction de lopration simple [1], de la post-incrmentation [2] ou de la pr-incrmentation [3], le code instruction change. Registre Statut : SREG I T H S V N Z C Action Exemple : ; Stock indirect X clr r27 ; Efface X bits haut ldi r26, $60 ; X bas $60 st X+, r0 ; Stock r0 dans ladresse $60 (X post inc) st X, r1 ; Stock r1 dans ladresse $61 ldi r26, $63 ; X bas $63 st X, r2 ; Stock r2 dans ladresse $63 st -X, r3 ; Stock r3 dans ladresse $62 (X pre dec)

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

84

ST (STD) Store Indirect From Register to Data Space using Index Y Stock Indirect Y
Stock un octet indirectement via Y dun registre daccs rapide dans l'espace de donnes. L'espace de donnes est soit les registres daccs rapide, soit la mmoire d'Entre/Sortie, soit la SRAM interne. L'EEPROM a un espace d'adresse spar non accessible. L'emplacement de la donne est indiqu par le registre Y (16 bits). L'accs de la mmoire est limit au segment de donnes sur 64Ko. Pour avoir accs un autre segment de donnes dans les modles avec plus d'espace, la RAMPY dans le secteur d'Entre/Sortie doit tre chang. Le Registre Y peut tre laiss inchang par l'opration, ou il peut tre post-incrment ou pr-dcrment. Ces particularits sont utiles pour l'accs aux tableaux, tables et empilement, avec une restriction seulement 256 octets, car seul l'octet bas de Y est mis jour. Loctet haut de Y n'est pas employ par cette instruction et peut tre employ pour d'autres buts. Attention, le rsultat de ces combinaisons utilisant le registre Y est non dfini : ST Y+, r28 ; ST Y+, r29 ; ST Y, r28 ; ST Y, r29. (Y) = Rr [1] ou (Y) = Rr, Y = Y + 1 [2], ou Y = Y 1, (Y) = Rr [3], (Y + q) = Rr [4] Avec : Rr = 0 31 (sauf 28 et 29), q = 0 63. Instruction : Code Oprateurs Rsultat PC Octet Cycle ST & STD (Y), q PC + 1 2 2 Code : 1000 001r rrrr 1000 Code Instruction 1 1001 001r rrrr 1001 Code Instruction 2 1001 001r rrrr 1010 Code Instruction 3 10q0 qq1r rrrr 1qqq Code Instruction 4 En fonction de lopration simple [1], de la post-incrmentation [2] ; de la pr-incrmentation [3] ou du dcalage dans lespace dEntre/Sortie [4], le code instruction change. Registre Statut : SREG I T H S V N Z C Action Exemple : ; Stock indirect Y clr r29 ; Efface Y bit haut ldi r28, $60 ; Y bas $60 st Y+, r0 ; Stock r0 dans ladresse $60(Y post inc) st Y, r1 ; Stock r1 dans ladresse $61 ldi r28, $63 ; Y bas $63 st Y, r2 ; Stock r2 dans ladresse $63 st -Y, r3 ; Stock r3 dans ladresse $62(Y pre dec) std Y+2, r4 ; Stock r4 dans ladresse $64

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

85

ST (STD) Store Indirect From Register to Data Space using Index Z Stock Indirect Z
Stock un octet indirectement via Z dun registre daccs rapide dans l'espace de donnes. L'espace de donnes est soit les registres daccs rapide, soit la mmoire d'Entre/Sortie, soit la SRAM interne. L'EEPROM a un espace d'adresse spar non accessible. L'emplacement de la donne est indiqu par le registre Z (16 bits). L'accs de la mmoire est limit au segment de donnes sur 64Ko. Pour avoir accs un autre segment de donnes dans les modles avec plus d'espace, la RAMPY dans le secteur d'Entre/Sortie doit tre chang. Le Registre Z peut tre laiss inchang par l'opration, ou il peut tre post-incrment ou pr-dcrment. Ces particularits sont utiles pour l'accs aux tableaux, tables et empilement, avec une restriction seulement 256 octets, car seul l'octet bas de Z est mis jour. Loctet haut de Z n'est pas employ par cette instruction et peut tre employ pour d'autres buts. Attention, le rsultat de ces combinaisons utilisant le registre Z est non dfini : ST +Z, r30 ; ST Z+, r31 ; ST Z, r30 ; ST z, r31. (Z) = Rr [1] ou (Z) = Rr, Z = Z + 1 [2], ou Z = Z 1, (Z) = Rr [3], (Z + q) = Rr [4] Avec : Rd = 0 29 (sauf 30 et 31), q = 0 63. Instruction : Code Oprateurs Rsultat PC Octet Cycle ST & STD (Z), q PC + 1 2 2 Code : 1000 001r rrrr 0000 Code Instruction 1 1001 001d rrrr 0001 Code Instruction 2 1001 001d rrrr 0010 Code Instruction 3 10q0 qq1d rrrr 0qqq Code Instruction 4 En fonction de lopration simple [1], de la post-incrmentation [2] ; de la pr-incrmentation [3] ou du dcalage dans lespace dEntre/Sortie [4], le code instruction change. Registre Statut : SREG I T H S V N Z C Action Exemple : ; Stock indirect Z clr r29 ; Efface Y bit haut ldi r28, $60 ; Y bas $60 st Z+, r0 ; Stock r0 dans ladresse $60(Z post inc) st Z, r1 ; Stock r1 dans ladresse $61 ldi r28, $63 ; Y bas $63 st Z, r2 ; Stock r2 dans ladresse $63 st -Z, r3 ; Stock r3 dans ladresse $62(Z pre dec) std Z+2, r4 ; Stock r4 dans ladresse $64

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

86

STS Store Direct to Data Space Stock Direct dans lEspace Donne
Stock un octet directement dun registre daccs rapide dans l'espace de donnes. L'espace de donnes est soit les registres daccs rapide, soit la mmoire d'Entre/Sortie, soit la SRAM interne. L'EEPROM a un espace d'adresse spar non accessible. Une adresse 16 bits doit tre fournie. L'accs de la mmoire est limit au segment de donnes de 64Ko. L'instruction STS emploie le registre de RAMPD pour avoir accs la mmoire suprieur 64Ko. (k) = Rr Avec : Rr = 16 31, k = 0 65535. Instruction : Code Oprateurs STS Rr, k Code : Code Instruction Suite instruction Registre Statut : SREG I T Action Exemple : ; Charge direct mmoire lds r2, $FF00 add r2, r1 sts $FF00, r2

Rsultat 1001 kkkk H S -

PC PC + 1 001r kkkk V rrrr kkkk N -

Octet 4 0000 Kkkk Z C -

Cycle 2

; Charge r2 avec le contenu de ladresse $FF00 ; Ajout r1 r2 ; Ecrire en retour

SUB Subtract without Carry Soustraction sans Retenue


Soustrait deux registres Rd et Rr sans la retenue et place le rsultat dans le registre Rd. Rd = Rd - Rr Avec : Rd = 0 31 et Rr = 0 31. Instruction : Code Oprateurs Rsultat PC Octet SUB Rd, Rr Rd PC + 1 2 Code : 0001 10rd dddd rrrr Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7 & Rr7 & R7 ! Rd7 & Rr7 & R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : ; Soustraction sur 16 bits r1:r0 par r3:r2 sub r2, r0 ; Soustraction bas sbc r3, r1 ; Soustraction haut avec retenue

Cycle 1

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

87

SUBI Subtract Immediate Soustraction Immediate


Soustraction dune valeur immdiate K au registre Rd sans la retenue et place le rsultat dans le registre Rd. Rd = Rd K Avec : Rd = 16 31 et K = 0 255. Instruction : Code Oprateurs Rsultat PC Octet Cycle SUBI Rd, K Rd PC + 1 2 1 Code : 0101 KKKK dddd KKKK Code Instruction Registre Statut : SREG I T H S V N Z C Action X X X X X X H = Rd3 & Rr3 ! Rr3 & R3 ! R3 & Rd3 S=NV V = Rd7 & Rr7 & R7 ! Rd7 & Rr7 & R7 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 & Z C = Rd7 & Rr7 ! Rr7 & R7 ! R7 & Rd7 Exemple : ; Soustraction Immdiate $4F23 r17:r16 subi r16, $23 ; Soustraction bas sbci r17, $4F ; Soustraction haut avec retenue

SWAP Swap Nibbles Echange Rciproque de Demi Octet


change les 4 bits haut avec les 4 bits bas et vice versa dun registre, instruction utile pour le codage BCD : R(7:4) = Rd(3:0) et R(3:0) = Rd(7:4) Avec : Rd = 0 31. Instruction : Code SWAP Code : Registre Statut : SREG Action I T H S V N Z C -

Oprateurs Rd Code Instruction

Rsultat Rd 1001 010d

PC PC + 1 Dddd

Octet 2 0010

Cycle 1

Exemple : ; Echange haut et bas de Rd inc r1 swap r1 inc r1 swap r1

; Incrment de r1 ; Echange haut et bas de r1 ; Incrment haut de r1 ; Echange arrire

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

88

TST Test for Zero or Minus Test Zro ou Ngatif


Test si un registre est zro ou est ngatif. Excute un ET logique entre le registre Rd et lui-mme. Le registre Rd restera inchang. Rd = Rd & Rd Avec : Rd = 0 31. Instruction : Code TEST Code : Registre Statut : SREG Action I T H S X V 0 N X Z X C -

Oprateurs Rd Code Instruction

Rsultat Rd 0010 00dd

PC PC + 1 dddd

Octet 2 dddd

Cycle 1

S=NV V=0 N = R7 Z = R7 & R6 & R5 & R4 & R3 & R2 & R1 & R0 Exemple : ; Test si 0 ou ngatif tst r0 ; Test r0 breq zero ; Branche si r0 = 0 ... zero: nop ; Destination branchement

WDR Watchdog Reset Remise Zro du Chien de Garde


Cette instruction remet 0 le Timer de garde. Cette instruction doit tre excute dans un temps limit donn par le pr-diviseur Watchdog. Voir la spcification de matriel de Timer du chien de garde. Instruction : Code Oprateurs Rsultat PC Octet Cycle WDR PC + 1 2 1 Code : 1001 0101 1010 1000 Code Instruction Registre Statut : SREG I T H S V N Z C Action Exemple : ; Remise 0 du Watchdog Wdt ; Remise 0 du Chien de Garde

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

89

Lassembleur
Ce chapitre dcrit l'utilisation de l'assembleur ATMEL qui couvre la gamme entire de microcontrleurs dans la famille AT90S et ATMEGA. L'assembleur traduit le code source assembl dans le code d'objet pour tre employ avec un simulateur. L'assembleur produit aussi un code PROMable et un fichier facultatif EEPROM qui peut tre programm directement dans la mmoire programme et la mmoire EEPROM d'un microcontrleur. L'assembleur produit des assignations de code fixes, par consquent aucune jonction n'est ncessaire. L'assembleur fonctionne sous Windows95 et successeur. De plus, il y a une version de ligne de commande de MS-DOS. La version en fentres contient une fonction d'aide en ligne couvrant la plupart des commandes ce document.

Dbut Rapide
Nous supposons que l'assembleur AVR et tous les fichiers de programme qui viennent avec lui sont correctement installs sur votre ordinateur. Rfrez-vous s'il vous plat aux instructions d'installation. Dmarrage Ouvrir le logiciel WavrAsm.exe et commencez l'assemblage en choisissant File puis Open du menu ou en cliquetant sur la barre d'outils, ouvrez un fichier "avr100.asm". Cela charge le fichier en assembleur dans une fentre dite fentre rdacteur. Lisez lentte du programme et jetez un coup dil dans le programme mais ne faites pas de changements encore. Assemblage de Votre Premier Fichier Une fois que vous avez regard le programme, lanc la compilation avec le menu Assemble . Une deuxime fentre (la fentre de Message) apparat, contenant les messages de compilation et d'erreur. Cette fentre chevauchera la fentre principale, donc c'est une bonne ide de nettoyer votre espace de travail sur l'cran. Votre cran doit ressembler cela :

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

90

Dcouverte et Correction d'Erreurs Dans la fentre de Message, il semble que lassemblage du programme sans bogues (dfauts). Mais si on modifie la ligne 53 avec pjmp , et que lon assemble de nouveau, il y aura une erreur, elle doit tre trouve et corrige. Par exemple :

Le premier message d'erreur dans la fentre de Message (celui annonc pour tre sur la ligne 53) et press sur le bouton gauche de la souris. Remarquez dans le rdacteur la fentre, une barre rouge horizontale est montre sur la ligne 53. Le message d'erreur dit Unknown instruction opcode . Voir la figure ci-dessous. Rassemblage Une fois toutes les erreurs corriges, un double-clic sur une erreur (pour activer la fentre Rdacteur) ou un clic l'intrieur de la fentre Rdacteur avant de relancer lassemblage Assemble une nouvelle fois. Si vous l'avez fait cela va jusqu' maintenant, la fentre de Message dira que vous tes couronns de succs.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

91

Assembler un programme source


L'assembleur travaille sur des fichiers source contenant les mnmoniques d'instruction, les tiquettes et les directives. Les mnmoniques d'instruction et les directives prennent souvent des oprandes. Les lignes de code doivent tre limites 120 caractres. Chaque ligne d'entre peut tre prcde par une tiquette, qui est une srie alphanumrique termine par un deux-points. Les tiquettes sont employes comme des cibles pour les sauts et les instructions de branchement et comme des noms de variables dans la mmoire programme et la SRAM. Une ligne d'entre peut prendre une des quatre des formes suivantes : 1. [tiquette:] directive [oprandes] [; Commentaire] 2. [tiquette:] instruction [oprandes] [; Commentaire] 3. ; Commentaire 4. Ligne vide Un commentaire la forme suivante : ; [Texte] Les articles placs dans des accolades sont facultatifs. Le texte entre le dlimiteur de commentaire ; et la fin de ligne EOL est ignore par l'Assembleur. Les tiquettes, les instructions et les directives sont dcrites plus en dtail dans les paragraphes suivants. Example label:

.EQU var1 = 100 ; Met var1 100 (Directive) .EQU var2 = 200 ; Met var2 200 test: rjmp test ; Boucle infini (Instruction) ; Ligne de commentaire pur ; Autres commentaires ... Note : Il n'y a aucune restriction en ce qui concerne le placement de colonne d'tiquettes, des directives, des commentaires ou des instructions, mais pour facilit la lecture du programme source, il est prfrable de placer les lments similaires sur les mmes colonnes , comme le montre lexemple.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

92

Directives dAssemblage
L'Assembleur soutient quelques directives qui ne sont pas traduites directement en opcodes . Au lieu de cela, elles sont employes pour ajuster l'emplacement du programme dans la mmoire, dfinir des macros, initialiser la mmoire etc. On donne une vue d'ensemble des directives dans la table suivante : Directive Description BYTE Rserve d'octet pour une variable CSEG Segment de Code DB Dfinit le(s) octet(s) constant DEF Dfinit un nom symbolique pour un registre DEVICE Dfinit le modle pour lassemblage DSEG Segment de Donnes DW Dfinit le(s) mot(s) constant ENDMACRO Fin macro EQU Attribut un symbole une expression ESEG Segment EEPROM EXIT Sortie du fichier INCLUDE Importe la source d'un autre fichier LIST Met en route la gnration de listfile LISTMAC Met en route l'extension macro MACRO Commence une macro NOLIST Arrt de la gnration de listfile ORG Origine du programme en mmoire SET Dclare un symbole pour une expression Nous allons maintenant prsenter chaque directive dassemblage avec des exemples. BYTE Reserve bytes to a variable - Rserve d'octet pour une variable La directive BYTE rserve des ressources de mmoire dans la SRAM. Pour tre capable de se rfrer l'emplacement rserv, la directive BYTE doit tre prcde dune tiquette. La directive prend un paramtre, qui est le nombre d'octets rserver. La directive peut seulement tre employe dans un segment de donnes (voir des directives CSEG, DSEG et ESEG). Le paramtre est obligatoire et les octets allous ne sont pas initialiss. Syntaxe LABEL: Exemple .DSEG var1: table: .CSEG .BYTE 1 .BYTE tab_size ldi ldi ld r30, low(var1) r31, high(var1) r1, Z ; Rserve 1 octet var1 ; Rserve tab_size octets ; Charge registre Z bas ; Charge registre Z haut ; Charge VAR1 dans r1 .BYTE expression

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

93

CSEG Code Segment - Segment de Code La directive CSEG dfinit le dbut d'un segment de code. Un fichier assembleur peut contenir plusieurs segments de code, qui sont enchans dans un seul segment de code aprs lassemblage. La directive BYTE ne peut pas tre employe dans un segment de code. Le type de segment par dfaut est le segment de code. Les segments de code ont leur propre compteur d'emplacement qui est un compteur de mot. La directive ORG (voir la description plus tard dans ce chapitre) peut tre employe pour placer le code et les constantes aux emplacements spcifiques dans la mmoire programme. La directive ne prend pas de paramtres. Syntax .CSEG Example vartab: const: .DSEG .BYTE 4 .CSEG .DW 2 mov r1, r0 ; Dbut du segments de donne ; Rserve 4 octets dans la SRAM ; Dbut du segments de code ; Ecrire $0002 dans la mmoire programme ; Dbut du programme

DB-Define constant byte(s) in program memory or EEPROM memory - Dfinit le(s) octet(s) constant La directive DB rserve des ressources de mmoire dans la mmoire programme ou la mmoire EEPROM. Pour tre capable de se rfrer aux emplacements rservs, la directive DB doit tre prcde par une tiquette. La directive DB prend une liste d'expressions et doit contenir au moins une expression. La directive DB doit tre place dans un segments de code ou un segments d'EEPROM. La liste d'expression est un ordre d'expressions, dlimites par des virgules. Chaque expression doit valuer un nombre compris entre -128 et 255. Si l'expression value un nombre ngatif, le complment 2 des 8 bits du nombre sera plac dans la mmoire programme ou l'emplacement de mmoire EEPROM. Si la directive DB est employe dans un segment de code et l'expression list contient plus qu'une expression, les expressions sont runies deux deux et places dans les mots mmoire programme de 16 bits. Si l'expression list contient un nombre impair d'expressions, la dernire expression sera place dans un mot mmoire programme propre 16 bits, mme si la ligne suivante dans le code d'assemblage contient une directive DB. Syntaxe LABEL: Example consts: eeconst: .CSEG .DB 0, 255, 0b01010101, -128, $AA .ESEG .DB $FF .DB expression list

DEF - Set a symbolic name on a register - Dfinit un nom symbolique pour un registre La directive DEF permet aux registres d'tre mentionne par des symboles. Un symbole ainsi dfini peut tre employ dans le reste du programme pour se rfrer au registre auquel il est assign. Un registre peut prendre plusieurs noms symboliques. Un symbole peut tre redfini plus tard dans le programme. Syntaxe .DEF Symbol = Registre Exemple .DEF temp = R16 .DEF ior = R0 .CSEG ldi temp, $F0 in ior, $3F

; Charge $F0 dans temp (r16) ; Lire SREG dans ior (r0) 94

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

eor

temp, ior

; Ou exclusif entre temp et ior

DEVICE Define which device to assemble for - Dfinit le modle pour lassemblage La directive DEVICE permet l'utilisateur de signaler l'assembleur sur lequel modle le code doit tre excut. Si cette directive est employe, un avertissement est affich si une instruction nest pas soutenue par le modle indiqu. Si la taille du segments de code ou le segments d'EEPROM est plus grande que lespace du modle spcifi, un avertissement est affich. Si la directive DEVICE n'est pas employe, aucun message ne sera affich et toutes les instructions sont valides, il n'y a aucune restriction de tailles mmoires. Syntaxe .DEVICE Exemple .DEVICE ATMEGA32 .CSEG push r30 ; Utilise le modle ATMEGA32 ; Place le registre r30 sur la pile ATMEGA32

DSEG Data Segment - Segment de Donnes La directive DSEG dfinit le dbut d'un segment de donnes. Un fichier assembleur peut contenir plusieurs segments de donnes, qui sont enchans dans un seul segment de donnes dans le code assembl. Un segment de donnes seulement contiendra normalement la directive BYTE (et les tiquettes). Les segments de donnes ont leur propre compteur d'emplacement qui est un compteur d'octet. La directive ORG (voir la description plus tard dans ce chapitre) peut tre employ pour positionner les variables dans la SRAM. La directive ne prend pas de paramtres. Syntax .DSEG Example var1: table: .DSEG .BYTE 1 .BYTE tab_size .CSEG ldi r30, low(var1) ldi r31, high(var1) ld r1, Z ; Dbut du segment de donne ; Rserve 1 octet var1 ; Rserve tab_size octets ; Charge registre Z bas ; Charge registre Z haut ; Charge var1 avec r1

DW - Define constant word(s) in program memory or EEPROM memory - Dfinit le(s) mot(s) constant La directive DW rserve des ressources de mmoire dans la mmoire programme ou la mmoire EEPROM. Pour tre capable de se rfrer aux emplacements rservs, la directive DW doit tre prcde par une tiquette. La directive DW prend une liste d'expressions et doit contenir au moins une expression. La directive DB doit tre place dans un segment de code ou un segment d'EEPROM. La liste d'expression est un ordre d'expressions, dlimites par des virgules. Chaque expression doit valuer un nombre entre -32768 et 65535. Si l'expression value un nombre ngatif, le complment 2 des 16 bits du nombre sera plac dans l'emplacement mmoire programme. Syntaxe LABEL: Exemple varlist: eevar: .CSEG .DW 0, $FFFF, 0b1001110001010101, -32768, 65535 .ESEG .DW $FFFF .DW expression list

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

95

ENDMACRO End macro - Fin macro La directive ENDMACRO dfinit la fin d'une dfinition de macro. La directive ne prend pas de paramtres. Voir la directive MACRO pour plus d'information sur les macros. Syntax .ENDMACRO Exemple .MACRO SUBI16 subi r16, low(@0) sbci r17, high(@0) ; Dbut de dfinition dune macro ; Soustraction bas ; Soustraction haut ; Fin de la dfinition de la macro

.ENDMACRO

EQU - Set a symbol equal to an expression - Attribut un symbole une expression La directive EQU assigne une valeur une tiquette. Cette tiquette peut alors tre employe dans des expressions postrieures. Une tiquette assigne une valeur selon la directive EQU est une constante et ne peut pas tre change ou redfinie. Syntax .EQU label = expression Example .EQU io_offset = 0x23 .EQU porta = io_offset + 2 .CSEG ; Dbut du segment clr r2 ; Efface r2 out porta, r2 ; Ecrir le Port A ESEG EEPROM Segment - Segment EEPROM La directive ESEG dfinit le dbut d'un segment d'EEPROM. Un fichier assembleur peut consister en plusieurs segments EEPROM, qui sont enchans dans un seul segment d'EEPROM aprs lassemblage. La directive BYTE ne peut pas tre employe dans un segment d'EEPROM. Les segments d'EEPROM ont leur propre compteur d'emplacement qui est un compteur d'octet. La directive ORG (voir la description plus tard dans ce chapitre) peut tre employ pour positionner le segment dans la mmoire EEPROM. La directive ne prend pas de paramtres. Syntax .ESEG Example vartab: eevar: const: .DSEG .BYTE 4 .ESEG .DW $FF0F .CSEG .DW 2 mov r1, r0 ; Dbut de segment de donne ; Rserve 4 octet dans la SRAM ; Initialise un mot dans lEEPROM ; Dbut du segment de code ; Ecrit $0002 dans la mmoire programme ; Dbut du programme

EXIT - Exit this file - Sortie du fichier La directive EXIT dit lassembleur darrter d'assembler le fichier. Normalement, l'assembleur court jusqu' la fin du fichier EOF. Si une directive EXIT apparat dans un fichier inclus, l'assembleur continu la ligne aprs la directive INCLUDE dans le fichier contenant la directive INCLUDE. Syntaxe .EXIT

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

96

Exemple .EXIT ; Sortie du fichier

INCLUDE Include another file - Importe la source d'un autre fichier La directive INCLUDE dit lassembleur de commencer lire le fichier indiqu. L'assembleur assemble alors le fichier indiqu avant que l'on ne rencontre la fin du fichier EOF ou une directive EXIT. Un fichier inclus peut contenir aussi des directives INCLUDE. Syntax .INCLUDE Example ; iodefs.asm: .EQU sreg = $3F .EQU sphigh = $3E .EQU splow = $3D ; incdemo.asm .INCLUDE iodefs.asm in r0, sreg ; Inclus I/O definitions ; Lire le registre status ; Registre Status ; Pointeur de Pile haut ; Pointeur de Pile bas filename

LIST - Turn the listfile generation on - Met en route la gnration de listfile La directive LIST dit l'assembleur de mettre en route la gnration listfile. L'assembleur produit un listfile qui est une combinaison de code source assembl, des adresses et des opcodes. La gnration listfile est allum par dfaut. La directive peut aussi tre employe avec la directive NOLIST pour produire seulement des parties choisies d'un fichier de source d'assembl. Syntaxe .LIST Exemple .NOLIST .INCLUDE macro.inc .INCLUDE const.def .LIST ; Dsactive la gnration listfile ; Inclus un fichier macro ; Non visible dans listfile ; Active la gnration listfile

LISTMAC Turn macro expansion on - Met en route l'extension macro La directive LISTMAC dit l'assembleur quand une macro est appele, l'extension dune macro doit tre montre sur listfile produit par l'assembleur. Par dfaut, on montre la macro appele avec les paramtres dans le fichier listfile. Syntax .LISTMAC Example .MACRO MACX add r0, @0 eor r1, @1 .LISTMAC MACX r2, r1 ; Dfinition dun exemple de macro

.ENDMACRO

; Fin de la dfinition de la macro ; Active lextension macro ; Appel de la macro

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

97

MACRO Begin macro - Commence une macro La directive MACRO dit l'assembleur que c'est le dbut d'une macro. La directive MACRO prend le nom macro comme paramtre. Quand le nom de la macro est crit plus tard dans le programme, la dfinition macro est employe la place. Une macro peut prendre jusqu 10 paramtres. Ces paramtres sont mentionns comme @0-9 dans la dfinition de la macro. En publiant un appel de macro, on donne les paramtres spars par une virgule dans la liste. La dfinition de la macro est termine avec la directive ENDMACRO. Par dfaut, on montre l'appel des macros sur le fichier listfile produit par l'assembleur. Pour inclure l'extension macro dans le fichier listfile, la directive LISTMAC doit tre employe. Une macro est marque avec un symbole + dans le champ opcode du fichier listfile. Syntax .MACRO Example .MACRO SUBI16 subi @1, low(@0) sbci @2, high(@0) .CSEG SUBI16 $1234, r16, r17 macroname ; Dbut de la dfinition de la macro ; Soustraction bas ; Soustraction haut ; Fin de la macro ; Dbut du segment de code ; Soustraction $1234 r17:r16

.ENDMACRO

NOLIST - Turn listfile generation off - Arrt de la gnration de listfile La directive NOLIST dit l'assembleur darrter la gnration du fichier listfile. L'assembleur produit normalement un fichier listfile qui est une combinaison du code source d'assembl, des adresses et des opcodes. La gnration du fichier listfile est allum par dfaut, mais peut tre mis hors de service en employant cette directive. La directive peut aussi tre employe avec la directive LIST pour produire seulement des parties choisies d'un fichier de source d'assembl. Syntax .NOLIST Example .NOLIST .INCLUDE macro.inc .INCLUDE const.def .LIST ; Dsactivation de listfile ; Inclus un fichier macro ; non visible dans listfile ; Active la gnration listfile ; Dsactivation de listfile

ORG - Set program origin - Origine du programme en mmoire La directive ORG dfinit le compteur d'emplacement une valeur absolue. On donne la valeur comme un paramtre de la directive. Si une directive ORG est plac dans un segment de donnes, c'est le compteur d'emplacement SRAM qui est mis, si la directive est dans un segment de code, c'est le compteur de mmoire programme qui est mis et si la directive est dans un segment d'EEPROM, c'est le compteur d'emplacement EEPROM qui est mis. Si la directive est prcde par une tiquette (sur la mme ligne de code source), on donnera l'tiquette la valeur du paramtre. Les valeurs par dfaut du code et des compteurs d'emplacement EEPROM sont zro, tandis que la valeur par dfaut du compteur d'emplacement SRAM est de 32 (due aux registres rapides occupant les adresses 0 31). L'EEPROM et l'emplacement SRAM sont en octet tandis que l'emplacement de mmoire programme est en mots 16 bits. Syntax .ORG expression Example .DSEG .ORG $67 .BYTE 1 ; Dbut du segment de donne ; SRAM ladresse $67 ; Rserve 1 octet dans la SRAM 98

variable:

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

; adr.$67 .ESEG .ORG $20 ; compteur eevar: .DW FEFF .CSEG .ORG $10 mov r0, r1 ; Dbut du segment dEEPROM ; Localisation de lEEPROM ; Initialise un mot ; Compteur de Programme (PC)

; 10 SET - Set a symbol equal to an expression - Dclare un symbole pour une expression La directive SET assigne une valeur une tiquette. Cette tiquette peut alors tre employe dans des expressions postrieures. Une tiquette assigne une valeur selon la directive SET peut tre change plus tard dans le programme. Syntax .SET label = expression Example .SET io_offset = $23 .SET porta = io_offset + 2 .CSEG ; Dbut du segment de code clr r2 ; Efface r2 out porta, r2 ; Ecrit dans le Port A Ceci termine le chapitre sur les directives dassemblage.

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

99

Les Expressions de lAssembleur


L'Assembleur incorpore des expressions. Les expressions peuvent consister en des oprandes, des oprateurs et des fonctions. En voici le desciptif complet. Operandes Les oprandes suivants peuvent tre employs : - L'utilisateur a dfini les tiquettes que l'on donne la valeur du compteur d'emplacement la place o ils apparaissent. - L'utilisateur a dfini des variables selon la directive de SET - L'utilisateur a dfini des constantes selon la directive EQU - Entier constants : selon plusieurs formats, incluant : a) - (Dfaut) dcimal : 10, 255 b) - Hexadcimal (deux notations) : 0x0A, $0A, 0xFF, $FF c) - Valeur binaire : 0b00001010, 0b11111111 - PC - la valeur actuelle du compteur programme en mmoire programme Fonctions Les fonctions suivantes sont dfinies : - LOW (l'expression) rend l'octet bas d'une expression - HIGH (expression) rend le deuxime octet d'une expression - BYTE2 (l'expression) est la mme fonction que HIGH - BYTE3 (l'expression) rend le troisime octet d'une expression - BYTE4 (l'expression) rend le quatrime octet d'une expression - LWRD (l'expression) rend les particules 0-15 d'une expression - HWRD (l'expression) rend les particules 16-31 d'une expression - PAGE (l'expression) rend les particules 16-21 d'une expression - EXP2 (l'expression) retourne 2 exposant - LOG2 (l'expression) rend la partie d'entier (d'expression) log2 Oprateurs L'Assembleur soutient quelques oprateurs qui sont dcrits ici. Les expressions peuvent tre incluses dans des parenthses et telles expressions sont toujours values avant dtre combin avec les valeurs l'extrieur des parenthses. Unaire Symbole : ! L'oprateur Unaire retourne 1 si l'expression tait zro et retourne 0 si l'expression tait non zro : Exemple : Ldi r16, !$F0 ; Charge r16 avec $00 Ngation Symbole : ~ L'oprateur Ngation rend l'expression d'entre avec tous les bits inverss : Exemple : Ldi r16, ~$F0 ; Charge r16 avec $0F Moins Symbole : L'oprateur Moins rend la ngation arithmtique d'une expression : Exemple : Ldi r16, -2 ; Charge 2 ($FE) dans r16 Multiplication Symbole : * L'oprateur Multiplication binaire que rend le produit de deux expressions : Exemple : Ldi r30, label * 2 ; Charge r30 avec label multiplier par 2

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

100

Division Symbole : / L'oprateur Division binaire rend le quotient entier de l'expression gauche divise par l'expression juste : Exemple: Ldi r30, label / 2 ; Charge r30 avec label diviser par 2 Addition Symbole : + L'oprateur Addition binaire rend la somme de deux expressions : Exemple : Ldi r30, c1 + c2 ; Charge r30 avec c1 plus c2 Soustraction Symbole : L'oprateur Soustraction binaire rend l'expression gauche moins l'expression juste Exemple : Ldi r17, c1 - c2 ; Charge r17 avec c1 moins c2 Dcalage Gauche Symbole : << L'oprateur Dcalage Gauche binaire rend l'expression gauche dcal gauche plusieurs fois fonction de l'expression juste : Exemple : Ldi r17, 1<<bitmask ; Charge r17 avec 1 dcal gauche de bitmask fois Dcalage Droit Symbol: >> L'oprateur Dcalage Droite binaire rend l'expression gauche dcal droite plusieurs fois en fonction de l'expression juste : Exemple : Ldi r17, c1>>c2 ; Charge r17 avec c1 dcal droite de c2 fois Plus Petit Que Symbole : < L'oprateur Plus Petit Que binaire retourne 1 si l'expression signe gauche est moins grande que l'expression signe de droit, 0 autrement : Exemple : Ori r18, bitmask * (c1<c2) + 1 ; OU avec r18 Plus Petit ou Equale Symbole : <= L'oprateur Plus Petit ou Egale binaire retourne 1 si l'expression signe gauche est moins grande ou gale l'expression signe de droit, 0 autrement : Exemple : Ori r18, bitmask * (c1<=c2) + 1 ; OU avec r18 Plus Grand Que Symbole : > L'oprateur Plus Grand Que binaire retourne 1 si l'expression signe gauche est plus grande que l'expression signe droit, 0 autrement : Exemple : Ori r18, bitmask * (c1>c2) + 1 ; OU avec r18 Plus Grand ou Equale Symbole : >= L'oprateur Plus Grand ou Egale binaire retourne 1 si l'expression signe gauche est plus grande ou gale l'expression signe droit, 0 autrement : Exemple : Ori r18, bitmask * (c1>=c2) + 1 ; OU sur r18 Equale Symbole : == L'oprateur Egale binaire retourne 1 si l'expression signe gauche est gale l'expression signe droit, 0 autrement : Exemple : Andi r19, bitmask * (c1==c2)+1 ; ET sur r19 Non Equale Symbole : != L'oprateur Non Egale binaire retourne 1 si l'expression signe gauche n'est pas gale l'expression signe droit, 0 autrement : Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr 101

Exemple :

.SET flag = (c1!=c2)

; Met le flag avec 1 ou 0

ET entre valeur Symbol : & L'oprateur ET binaire rend le test ET entre deux expressions : Exemple : Ldi r18, High(c1&c2) ; Charge r18 avec un ET logique OU Exclusif Logique Symbol : ^ L'oprateur OU Exclusif binaire retourne le test dun OU Exclusif entre deux expressions : Exemple : ldi r18,Low(c1^c2) ;Charge r18 avec un ou exclusif OU entre deux valeur Symbol : | L'oprateur OU binaire rend le test OU entre deux expressions : Exemple : ldi r18, Low(c1|c2) ; Charge 18 avec un OU logique ET Logique Symbol : && L'oprateur ET Logique binaire retourne 1 si les expressions sont tout les deux diffrent de zro, 0 autrement : Exemple : ldi r18, Low(c1&&c2) ; Charge r18 avec un ET logique OU Logique Symbol : || L'oprateur OU Logique binaire retourne 1 si un ou les deux expressions sont diffrent de zro, 0 autrement Exemple : ldi r18, Low(c1||c2) ; Charge r18 avec un OU logique Ceci clot ce document, bonne programmation.

Jean-Nol

Assembleur et Instructions de lATMEGA32, Janvier 2005 V1.2 Balade.nono@voila.fr

102

Você também pode gostar