HELP,ÿÿÿÿ,ýÿÿü$DIR$0Hýÿÿ¥²í!RootPGÿÿÿdº™iADC¼Gÿÿÿ º™aADD Hýÿÿ è°íÚaddressüFÿÿÿi4{'EADRDGÿÿÿt º™ðAND4GÿÿÿÈô©™+B`Gÿÿÿ º™ôBICTGÿÿÿ.ÿ©™TBL¨!FÿÿÿÚû|'QCDPü"Gÿÿÿ»º™ºCMN¸%Gÿÿÿº™ºCMPt(Fýÿÿt˜û×ícondd,FýÿÿŠ–"TøConstants\/Fýÿÿ0 +‹directivesè1Hýÿÿ µí´dir_ØoGÿÿÿQº™¶EORqFýÿÿÐÖþ'¤Formats4sHýÿÿß µí|Form_t—Fÿÿÿ[ }'QLDCȘGÿÿÿõ_6LDMGÿÿÿT®?0™LDRœ¡Fÿÿÿ_»'^MCRü¢Gÿÿÿí"j5MLA¥Gÿÿÿä(j53MLAL4§Fýÿÿ^Ü„'ÒMode©Gÿÿÿ©º™åMOVð«Fÿÿÿqr'ZMRCL­Fÿÿÿ|'SMRS ®Gÿÿÿ&¼™ÿMSR °GÿÿÿÜ0j5óMUL”²Gÿÿÿy8j5%MULL¼´FýÿÿP‡'ämul_timing ¼Gÿÿÿ‚ º™éMVNŒ¿Fÿÿÿ)-€'?NOPÌÀFýÿÿ"ð&T Op2ØÁFýÿÿÓÃØÓOperators¬ÆGÿÿÿë#º™µORRdÈFýÿÿ.Å„'rPSRØÉFÿÿÿŽ/ðwR15PËHýÿÿáW5­ÿRdPÌHýÿÿâß´í'ReferencesxÎHýÿÿ·c5­°Rn(ÏGÿÿÿH&º™'RSBPÐGÿÿÿ”(º™3RSC„ÑFýÿÿƒpƒ'”SÒHýÿÿðµíhSA-110_ˆÛGÿÿÿÔ*º™mSBCøÝFýÿÿs„'xshiftpàFÿÿÿ,¤€'VSTCÈáGÿÿÿä_ÿSTMÈåGÿÿÿ,€@0DSTR êGÿÿÿR-º™aSUBpìGÿÿÿ²B0“SWIîGÿÿÿzÑ{ˆSWPŒðFýÿÿ0'Tusym_namesòGÿÿÿ¥0º™TEQ„óGýÿÿN90Timing„ùGÿÿÿ»2º™TSTûFýÿÿ¦x+„variablesDATAARM 6/7/8/10 - StrongARM #wrap off {_}{/}Jeu d'instructions de l'ARM6/7/8/10/StrongARM:{/}{_} #tab Addition avec retenue Déplacement Addition Transfert coprocesseur vers registre CPU Chargement d'adresse dans un registre Transfert PSR vers registre ET logique Transfert registre vers PSR Branchement Multiplication Effacement de bits Multiplication longue (1) Branchement avec lien NON logique BLX Branchement avec lien et échange (3) Pas d'opération BX Branchement et échange (3) OU logique Opération coprocesseur Soustraction inversée CLZ Compte les zéros situés en tête (2) Soustraction inversée avec retenue Comparaison négative Soustraction avec retenue Comparaison Stockage d'un registre coprocesseur OU exclusif Stockage de plusieurs registres Chargement d'un registre coprocesseur Stockage d'un registre Chargement de plusieurs registres Soustraction Chargement d'un registre Interruption logicielle Transfert registre CPU vers coprocesseur Echange registre avec mémoire Multiplication avec accumulation Test d'égalité bit à bit Multiplication longue avec accumulation (1) Test avec ET logique (1) ARM7DM/ARM8/StrongARM/ARM10 (2) ARM10 (3) Thumb #Table lines 3 cond> S> directives> Operators> R15> Timing> SA-110_Timing> #Endtable References> #Line;Align Centre;wrap off par address>, 5 avril 1999 DATAiADC #wrap off #fH4:Opération #Indent 4 Rd = Rn + Op2 + Carry #Indent #fH4:Syntaxe #fCode;Indent 4 ADC\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATAaADD #wrap off #fH4:Opération #Indent 4 Rd = Rn + Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 ADD\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATAÚVincent Lefèvre #wrap off #tab E-mail: #url mailto:shmanuals@vinc17.org> Page d'accueil: #url> Page Risc PC: #url> DATAEADR #wrap off #fH4:Opération #Indent 4 Rd = /expression/ #Indent #fH4:Syntaxe #fCode;Indent 4 ADR Rd, /expression/ #Indent;f #fH4:Notes #wrap on;Indent 4 Pseudo-instruction. L'assembleur génère les instructions appropriées pour charger l'adresse; une des instructions ADD, SUB, MOV, MVN, LDR sera utilisée. #Indent DATAðAND #wrap off #fH4:Opération #Indent 4 Rd = Rn AND Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 AND\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes #wrap on;Indent 4 Il n'y a aucune retenue dans cette opération, mais le flag Carry est positionné par la sortie du shifter. #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATA+B #wrap off #fH4:Opération #Indent 4 PC = /nouvelle adresse/ #Indent #fH4:Syntaxe #fCode;Indent 4 B\{{/}condition{/}\} /expression/ #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 2 S + 1 N {/}ARM8{/}: 0 à 3 cycles {/}StrongARM{/}: 2 + 0 cycle (SA-110_branch>) #Indent #fH4:Notes #wrap on;Indent 4 Il s'agit d'un branchement relatif PC. L'expression est évaluée et placée dans un champ signé de 24 bits de l'instruction. La valeur est décalée de 2 bits vers la gauche, étendue sur 32 bits et ajoutée au PC. L'instruction peut donc spécifier un branchement de ±32MB. # A cause du pipe-line, le PC contient l'adresse de l'instruction courante + 8. Cela signifie que l'offset pour les instructions de branchement doit être ajusté par l'assembleur. #Indent DATAôBIC #wrap off #fH4:Opération #Indent 4 Rd = Rn AND NOT Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 BIC\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes #wrap on;Indent 4 Il n'y a aucune retenue dans cette opération, mais le flag Carry est positionné par la sortie du shifter. #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATATBL #wrap off #fH4:Opération #Indent 4 R14 = PC, PC = /nouvelle adresse/ #Indent #fH4:Syntaxe #fCode;Indent 4 BL\{{/}condition{/}\} /expression/ #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 2 S + 1 N {/}ARM8{/}: 0 à 3 cycles (1 à 3 si branchement pris) {/}StrongARM{/}: 2 + 0 cycle (SA-110_branch>) #Indent #fH4:Notes #wrap on;Indent 4 Il s'agit d'un branchement relatif PC. L'expression est évaluée et placée dans un champ signé de 24 bits de l'instruction. La valeur est décalée de 2 bits vers la gauche, étendue sur 32 bits et ajoutée au PC. L'instruction peut donc spécifier un branchement de ±32MB. # A cause du pipe-line, le PC contient l'adresse de l'instruction courante + 8. Cela signifie que l'offset pour les instructions de branchement doit être ajusté par l'assembleur. #Indent DATAQCDP #wrap off #fH4:Opération #Indent 4 Spécifique coprocesseur #Indent #fH4:Syntaxe #fCode;Indent 4 CDP\{{/}condition{/}\} p{/}cp_no{/}, {/}cp_opc{/}, cRd, cRn, cRm \{, {/}expression{/}\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 1 S + b I (b = nombre de cycles d'attente) #Indent DATAºCMN #wrap off #fH4:Opération #Indent 4 Flags = Rn + Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 CMN\{{/}condition{/}\}\{P\} Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) #Indent #fH4:Notes #wrap on;Indent 4 La forme P de cette instruction ne doit pas être utilisée dans les modes 32 bits. #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATAºCMP #wrap off #fH4:Opération #Indent 4 Flags = Rn - Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 CMP\{{/}condition{/}\}\{P\} Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) #Indent #fH4:Notes #wrap on;Indent 4 La forme P de cette instruction ne doit pas être utilisée dans les modes 32 bits. #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATAíCodes condition #wrap on Toutes les instructions sont exécutées conditionnellement. Si la condition située dans les 4 bits de poids fort de l'instruction n'est pas vérifiée, alors même les instructions illégales n'ont pas d'effet... #wrap off; tab *Code* *Mnemonic* *Flags* *Signification* 0000 EQ Z égal à 0001 NE ~Z différent de 0010 CS ou HS C supérieur ou égal à (non signé) 0011 CC ou LO ~C inférieur à (non signé) 0100 MI N négatif 0101 PL ~N positif ou nul 0110 VS V overflow (dépassement de capacité) 0111 VC ~V pas d'overflow 1000 HI C and ~Z supérieur à (non signé) 1001 LS ~C or Z inférieur ou égal à (non signé) 1010 GE N == V supérieur ou égal à (signé) 1011 LT N != V inférieur à (signé) 1100 GT ~Z and (N == V) supérieur à (signé) 1101 LE Z or (N != V) inférieur ou égal à (signé) 1110 AL 1 toujours #wrap on Si la condition n'est pas spécifiée, l'assembleur suppose qu'il s'agit de /always/. DATAøConstantes #wrap off #fH4:Constantes numériques #Indent 4;wrap on Les constantes numériques peuvent être écrites en décimal, hexadécimal (style C ou Acorn), ou dans n'importe quelle base entre 2 et 9, ayant la forme {/}n_xxx{/} où /n/ est la base et /xxx/ le nombre écrit dans cette base. Par exemple: #wrap off;Indent 8;fCode 123 décimal 0xffe3 hexadécimal (style C) &65FF hexadécimal (style Acorn) 7_350 base 7 #f;Indent;Indent #fH4:Constantes booléennes #Indent 4;fCode \{TRUE\} (vrai) \{FALSE\} (faux) #f;Indent #fH4:Constantes chaîne #Indent 4;wrap on Les constantes chaîne doivent être entre doubles-quotes (guillemets). Pour utiliser le caractère double-quote ou dollar dans une chaîne, entrer 2 fois le caractère voulu. #Indent DATA‹Directives de l'assembleur #wrap off dir_all> #Table columns 2 dir_storalloc> dir_cond> dir_symdef> dir_diag> dir_filelink> dir_link> dir_list> dir_misc> dir_storinit> dir_loclbl> dir_macros> dir_orga> #EndTable #Table columns 3 Constants> sym_names> variables> #EndTable DIR$´´œ3FýÿÿÕÒ­*ÜallxDFýÿÿ|+òcondlFGýÿÿv®ðŽCdiag°HFýÿÿ/½ +qfilelink$IFýÿÿÝÖ+clinkˆMFýÿÿ) +‰listSFýÿÿ ]+=loclblTVFýÿÿ+#macrosxWFýÿÿ´‚$TÖmiscPYFýÿÿôÓ+1 orga„bFýÿÿÓ +PstorallocÔeFýÿÿ¡Q%TýstorinitÔhFýÿÿwi&TsymdefDATAÜDirectives de l'assembleur #wrap off; tab *Directive* *Synonyme* *Type* *Signification* ! dir_diag> Assertion arithmétique \# dir_storalloc> Réservation de mémoire dans la structure & DCD dir_storinit> Définition d'une constante word (32 bits) % dir_storinit> / dir_loclbl> Remplissage avec des 0 / Introduction de labels locaux * EQU dir_symdef> Equate = DCB dir_storinit> Définition d'une constante byte (8 bits) [ dir_cond> IF ] dir_cond> ENDIF | dir_cond> ELSE ^ dir_storalloc> Origine de la structure ALIGN dir_storalloc> Alignement du PC AREA dir_orga> Définition des program areas ASSERT dir_diag> Assertion logique CN dir_symdef> Equate de registre coprocesseur CP dir_symdef> Equate coprocesseur DCB = dir_storinit> Définition d'une constante byte (8 bits) DCD & dir_storinit> Définition d'une constante word (32 bits) DCFD dir_storinit> Définition d'une constante flottante double précision DCFS dir_storinit> Définition d'une constante flottante simple précision DCW dir_storinit> Définition d'une constante half-word (16 bits) END dir_orga> Fin du fichier source assembleur ENTRY dir_orga> Définition du point d'entrée de l'AREA EQU * dir_symdef> Equate EXPORT dir_link> Déclaration d'un symbole à exporter FN dir_symdef> Equate de registre flottant GBLA dir_symdef> Déclaration de variable globale (type arithmétique) GBLL dir_symdef> Déclaration de variable globale (type logique) GBLS dir_symdef> Déclaration de variable globale (type chaîne) GET INCLUDE dir_filelink> Inclusion d'un fichier IMPORT dir_link> Annonce un symbole externe INCLUDE GET dir_filelink> Inclusion d'un fichier KEEP dir_orga> Garde les symboles locaux dans la table des symboles LCLA dir_symdef> Déclaration de variable locale (type arithmétique) LCLL dir_symdef> Déclaration de variable locale (type logique) LCLS dir_symdef> Déclaration de variable locale (type chaîne) LTORG dir_orga> Origine de la zone des litéraux MACRO dir_macros> Début d'une définition de macro MEND dir_macros> Fin d'une définition de macro MEXIT dir_macros> Sortie anticipée d'une macro NOFP dir_misc> Flottants non autorisés OPT dir_list> Options d'assemblage ORG dir_orga> Origine de l'assemblage RLIST dir_misc> Définition d'une liste de registres RN dir_symdef> Equate de registre ROUT dir_loclbl> Début d'une région de labels locaux SETA dir_symdef> Assigne une valeur à une variable (type arithmétique) SETL dir_symdef> Assigne une valeur à une variable (type logique) SETS dir_symdef> Assigne une valeur à une variable (type chaîne) SUBT dir_list> Chaîne de sous-titre TTL dir_list> Chaîne de titre WEND dir_cond> Fin de tant que WHILE dir_cond> Tant que DATAòAssemblage conditionnel #wrap off #fH4:If-Then-Else-Endif (Si-Alors-Sinon-FinSi) #fCode;Indent 4 [ {/}expression-logique{/} ...instructions assemblées si expression vraie... \{| ...instructions assemblées si expression fausse...\} ] #f;wrap on Aucun des [, | ou ] ne doit être le premier caractère d'une ligne. #Indent;wrap off #fH4:While-Wend (TantQue-FinTantQue) #fCode;Indent 4 WHILE {/}expression-logique{/} ...instructions assemblées tant que expression est vraie... WEND #Indent DATACDirectives de diagnostic #wrap off #fH4:Assertion arithmétique #fCode;Indent 4 ! {/}expression-arithmétique{/}, {/}expression-de-chaîne{/} #f;wrap on Si l'expression arithmétique s'évalue en une valeur non nulle, l'expression de chaîne est imprimée en tant que message d'erreur et l'assemblage est interrompu après la première passe. #Indent;wrap off #fH4:Assertion logique #fCode;Indent 4 ASSERT {/}expression-logique{/} #f;wrap on Si l'expression logique est fausse, le message d'erreur "Assertion failed" est imprimé pendant la seconde passe de l'assemblage. #Indent DATAqDirectives de lien de fichiers #wrap off;fCode INCLUDE {/}nom-de-fichier{/} GET {/}nom-de-fichier{/} DATAcDirectives de linking (édition de liens) #wrap off;fCode EXPORT {/}symbole{/}\{[FPREGARGS, DATA, LEAF]\} #f;wrap on Déclare un symbole qui sera utilisé lors de l'édition de liens par d'autres fichiers objet. Les paramètres optionnels sont: #wrap off;tab *Paramètre* *Signification* FPREGARGS Le symbole attend des arguments flottants dans des registres flottants DATA Le symbole définit une donnée du segment code, qui n'est pas une fonction/procédure LEAF Le symbole est une fonction qui n'appelle aucune autre fonction (fonction feuille) #fCode IMPORT {/}symbole{/}\{[FPREGARGS]\}\{,WEAK\} #f;wrap on Fournit à l'assembleur un symbole qui n'est pas définit dans le source mais qui sera résolu à l'édition de liens, faisant référence à un symbole défini dans un autre fichier objet assemblé à part; le symbole est considéré comme une adresse. Les paramètres optionnels sont: #wrap off *Paramètre* *Signification* FPREGARGS Le symbole attend des arguments flottants dans des registres flottants WEAK Ne renvoie pas d'erreur pour les références non résolues pendant l'édition de liens DATA‰Directives de listing #wrap off;fCode OPT {/}expression-arithmétique{/} #f;tab Spécifie les options d'assemblage. *Code* *Effet* 1 Active le listing 2 Désactive le listing 4 Form feed (nouvelle page) 8 Remet à 0 le compteur le lignes 16 Active le listing des directives dir_symdef>, dir_symdef> et dir_symdef> 32 Désactive le listing des directives dir_symdef>, dir_symdef> et dir_symdef> 64 Active le listing des expansions de macro 128 Désactive le listing des expansions de macro 256 Active le listing des appels de macro 512 Désactive le listing des appels de macro 1024 Active le listing pendant la première passe de l'assemblage 2048 Désactive le listing pendant la première passe de l'assemblage 4096 Active le listing des directives conditionnelles 8192 Désactive le listing des directives conditionnelles 16384 Active le listing des directives dir_macros> 32768 Désactive le listing des directives dir_macros> #wrap on Les options courantes peuvent être lues à l'aide de la pseudo-variable \{OPT\}. #wrap off;fCode TTL {/}chaîne-de-titre{/} #f;wrap on Définit une chaîne de titre, qui sera imprimée en haut de chaque page du listing. #wrap off;fCode SUBT {/}chaîne-de-sous-titre{/} #f;wrap on Définit une chaîne de sous-titre, qui sera imprimée en haut de chaque page du listing. DATA=Labels locaux Un label local est un nombre de 2 chiffres. Exemple: #wrap off;fCode;Indent 4 MaRoutine ROUT ;définit le début d'une routine ... 01 ... ;label local 01 ... 02 ... ;label local 02 ... BNE %01 ;référence au label 01 ... #Indent;f;wrap on On distingue les labels locaux par leurs 2 chiffres initiaux, qui peuvent être suivis du label parent, par exemple: #fCode;Indent 4 06MaRoutine #Indent;f Les références aux labels locaux doivent commencer par le caractère %, suivi éventuellement de B ou F pour dire à l'assembleur de chercher le label vers l'arrière ({/}backwards{/}) ou vers l'avant ({/}forwards{/}), et de A ou T pour le chercher à tout ({/}all{/}) niveau de macro ou seulement à ce ({/}this{/}) niveau. DATA#Macros #fH4:Définition de macro #wrap off;Indent 4;fCode MACRO \{${/}label{/}\} /nom_macro/ \{${/}param1{/}\}\{,${/}param2{/}\}\{,${/}param3{/}\}... ...instructions... MEND #f;Indent #fH4:Sortie anticipée d'une macro #Indent 4;fCode MEXIT #Indent DATAÖDivers #wrap off;fCode NOFP #f;wrap on Une erreur sera générée si une directive ou instruction flottante est rencontrée. #wrap off;fCode /Label/ RLIST \{{/}liste_reg{/}\} #f;wrap on Définit un label faisant référence à une liste de registres entiers de l'ARM (entre accolades obligatoires). Les registres peuvent être listés dans n'importe quel ordre; les intervalles de registres sont formés de deux numéros de registre séparés par un tiret. Voir /. DATA1 Directives d'organisation #wrap off;fCode AREA {/}nom{/}\{, {/}attr{/}\}...\{, ALIGN={/}expression{/}\} #f;tab Définition d'un segment de programme. *Attribut* *Signification* ABS Absolu: placé à adresse fixe. REL Relogeable par le linker (défaut). PIC Code indépendant de la position: exécuté où qu'il soit chargé. CODE Contient des instructions machine. DATA Contient des données, aucune instruction. READONLY Le segment ne sera pas accédé en écriture. COMDEF Définition de segment commun. COMMON Segment commun. NOINIT Data Segment initialisé à 0 et ne contenant que des directives de réservation de mémoire. REENTRANT Segment réentrant (s'applique uniquement à des segments de type code). BASED R{/}n{/} Segment statique de données basé à R{/}n{/}. #wrap on La sous-directive optionnelle d'alignement force le début du segment à être aligné sur une limite de la forme 2^{/}n{/}. Par défaut, les segments sont alignés sur les mots, mais l'expression /n/ peut définir une autre limite allant de 2^2 à 2^12. #wrap off;fCode ENTRY #f;wrap on Point d'entrée unique de tout programme contenant ce segment. #wrap off;fCode END #f;wrap on Dit à l'assembleur d'arrêter l'assemblage du fichier source courant. #wrap off;fCode ORG {/}expression-numérique{/} #f;wrap on Fixe l'origine du programme, i.e. la valeur initiale du compteur ordinal. Un fichier source ne peut contenir au plus qu'une seule ORG et aucune instruction ARM ou directive d'initialisation de mémoire ne peut la précéder. S'il n'y a pas d'ORG, l'assembleur essaie de générer un code relogeable et le compteur ordinal est initialisé à 0. #wrap off;fCode LTORG {/}expression-numérique{/} #f;wrap on Force la zone de littéraux, utilisée pour stocker les constantes du programme, à être placée immédiatement après cette directive. Une LTORG est placée par défaut à chaque directive END. Les gros programmes peuvent avoir besoin de plusieurs LTORGs afin d'éviter de violer la limite de ±4Ko imposée par les instructions /. #wrap off;fCode KEEP \{{/}symbole{/}\} #f;wrap on Garde tous les symboles (pas d'argument) ou le symbole spécifié dans la table des symboles de ce fichier objet. Normalement, l'assembleur n'inclut pas les symboles locaux (ceux non exportés à l'aide de dir_link>) dans le fichier objet. DATAPAllocation de mémoire #wrap off #fH4:Directive d'alignement #fCode;Indent 4 ALIGN \{power-of-two\{, offset-expression\}\} #f;wrap on Force le compteur ordinal à être aligné sur la limite spécifiée. L'alignement par défaut est 4 (i.e. alignement sur un mot) et l'offset par défaut est 0. #Indent;wrap off #fH4:Directives de structure #fCode;Indent 4 ^ {/}expression{/}\{, {/}base-register{/}\} \{{/}label{/}\} \# {/}expression{/} #f;wrap on La directive ^ positionne l'origine d'un enregistrement (structure C) à l'adresse spécifiée par l'expression. La directive # décrit la mémoire prise dans l'enregistrement. Par exemple: #wrap off;Indent 4;fCode ^ 0, r9 # 4 Label # 4 ... LDR r0, Label #f;Indent où l'instruction LDR équivaut à: #Indent 4;fCode LDR r0, [r9, #4] #Indent;Indent DATAýInitialisation de mémoire #wrap off;fCode;Indent 4 DCB {/}liste_expression{/} DCW {/}liste_expression{/} DCD {/}liste_expression{/} DCFS {/}liste_fpconst{/} DCFD {/}liste_fpconst{/} % {/}expression-numérique{/} #f;Indent où {/}fpconst{/} est de l'une des formes suivantes: #fCode;Indent 4 \{-\}{/}entier{/}E\{-\}{/}entier{/} \{-\}{/}entier{/}.{/}entier{/}\{E\{-\}{/}entier{/}\} #f;Indent;wrap on Les directives DCB, DCW, DCD définissent des octets, demi-mots et mots en mémoire; la liste d'expressions est formée d'une suite d'expressions numériques ou de chaîne séparées par des virgules. Les directives DCFS et DCFD définissent des flottants en double ou simple précision en mémoire. La directive % initialise à 0 le nombre spécifié d'octets. DATADéfinitions de symboles #wrap off #fH4:Directives de nommage de nombres #Indent 4;fCode /label/ EQU /expression/ /label/ * /expression/ #f;Indent #fH4:Directives de nommage de registres #Indent 4;fCode /label/ RN {/}expression-numérique{/} /label/ FN {/}expression-numérique{/} #f;wrap on La directive RN définit des noms de registres; les noms R0-R15, r0-r15, PC, pc, LR, lr sont prédéfinis. La directive FN définit des noms de registres flottants; les noms F0-F7 et f0-f7 sont prédéfinis. #Indent;wrap off #fH4:Directives de nommage de coprocesseurs #Indent 4;fCode /label/ CP {/}expression-numérique{/} /label/ CN {/}expression-numérique{/} #f;wrap on La directive CP définit des noms de coprocesseurs, qui doivent être compris entre 0 et 15; les noms p0-p15 sont prédéfinis. La directive CN définit un nom de registre coprocesseur; c0-c15 sont prédéfinis. #Indent;wrap off #fH4:Déclaration et assignement de variables #Indent 4;fCode GBLA {/}nom-de-variable{/} GBLL {/}nom-de-variable{/} GBLS {/}nom-de-variable{/} LCLA {/}nom-de-variable{/} LCLL {/}nom-de-variable{/} LCLS {/}nom-de-variable{/} {/}nom-de-variable{/} SETA {/}expression-arithmétique{/} {/}nom-de-variable{/} SETL {/}expression-logique{/} {/}nom-de-variable{/} SETS {/}expression-de-chaîne{/} #f;wrap on Les directives GBLx et LCLx déclarent des variables globales et locales de type arithmétique, logique ou chaîne. Les variables doivent être déclarées avant d'être utilisées. Les directives SETx sont utilisées pour leur assigner des valeurs. La portée des variables globales s'étend au fichier source entier, mais pas au-delà. La portée des variables locales est restreinte à une instantiation de macro. #Indent DATA¶EOR #wrap off #fH4:Opération #Indent 4 Rd = Rn EOR Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 EOR\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes #wrap on;Indent 4 Il n'y a aucune retenue dans cette opération, mais le flag Carry est positionné par la sortie du shifter. #Indent DATA¤Formats des instructions #wrap off Form_dataproc> Form_branch> Form_mul> Form_single> Form_block> Form_SWP> Form_PSR> Form_SWI> Form_copro> Form_undef> DIR$||°tFýÿÿí<ÿ'ÕblockˆvHýÿÿI2³í>branchÈxFýÿÿ7þÿ'Ucopro ~Fýÿÿy@(ƒdataproc¤€HýÿÿŒN²ímul¸ƒFýÿÿœü( opĉFýÿÿöj( PSRÔŒFýÿÿur(„shiftX‘FýÿÿÚ(&single€”Fýÿÿ(ì(âSWId•FýÿÿÒ (<SWP –Fýÿÿ< (ÑundefDATAÕTransferts de blocs de données #wrap off; fCode +-------------------------------------+ | xxxx100P USWLnnnn llllllll llllllll | +-------------------------------------+ #f; tab cond> code condition. P 0: incr./décr. après, 1: incr./décr. avant. U 0: décrémentation, 1: incrémentation. S "^" à la fin de l'instruction. W write-back (!), i.e. écriture du registre modifié. L 0: , 1: . nnnn registre Rn. lll...lll liste de registres. DATA>Instructions de branchement #wrap off #fH4:B/BL #fCode +-------------------------------------+ | xxxx101L oooooooo oooooooo oooooooo | +-------------------------------------+ #f; tab cond> code condition. L drapeau de link ( / ). ooo...ooo offset. adresse de destination = adresse courante + 8 + (4 * offset) #fH4:BX/BLX (Thumb) #fCode +-------------------------------------+ | xxxx0001 00101111 11111111 00L1mmmm | +-------------------------------------+ #f; tab cond> code condition. L drapeau de link (BX / BLX). mmmm registre Rm. DATAUCoprocesseur #wrap off #fH4:Opérations coprocesseur #fCode +-------------------------------------+ | xxxx1110 oooonnnn ddddpppp qqq0mmmm | +-------------------------------------+ #f; tab cond> code condition. oooo numéro de l'opération. nnnn registre cRn. dddd registre cRd. pppp numéro du coprocesseur. qqq information supplémentaire sur l'opération concernée. mmmm registre cRm. #fH4:Transfert de données coprocesseur #fCode +-------------------------------------+ | xxxx110P UNWLnnnn DDDDpppp oooooooo | / +-------------------------------------+ #f; tab cond> code condition. P 0: adressage post-indexé, 1: adressage pré-indexé. U 0: offset soustrait, 1: offset ajouté au registre de base. N 0: forme courte, 1: forme longue. W write-back (!); doit être à 1 si P = 0. L 0: , 1: . nnnn registre rRn. DDDD registre cRd. pppp numéro du coprocesseur. oooooooo offset / 4. #fH4:Transfert de registres coprocesseur #fCode +-------------------------------------+ | xxxx1110 oooLNNNN ddddpppp qqq1MMMM | / +-------------------------------------+ #f; tab cond> code condition. ooo numéro de l'opération. L 0: , 1: . NNNN registre cRn. dddd registre rRd. pppp numéro du coprocesseur. qqq information supplémentaire. MMMM spécifique au coprocesseur. DATAƒInstructions arithmétiques et logiques #wrap off; fCode +-------------------------------------+ | xxxx000a aaaSnnnn ddddcccc ctttmmmm | Forme registre +-------------------------------------+ | xxxx001a aaaSnnnn ddddrrrr bbbbbbbb | Forme immédiate +-------------------------------------+ #f; tab cond> code condition. Form_op> opération. suffixe S. Rn> registre Rn. Rd> registre Rd. Form_shift> nombre de shifts ou registre de shift. Form_shift> type de shift. Op2> registre Rm (Op2). Op2> nombre de rotations / 2. Op2> valeur immédiate (octet). DATAMultiplication #wrap off #fH4:Multiplication #fCode +-------------------------------------+ | xxxx0000 00ASdddd nnnnssss 1001mmmm | +-------------------------------------+ #f; tab cond> code condition. A drapeau d'accumulation ( / ). suffixe S. dddd registre Rd (cf MUL ou MLA). nnnn registre Rn (cf MLA). ssss registre Rs (cf MUL ou MLA). mmmm registre Rm (cf MUL ou MLA). #fH4:Multiplication longue (ARM7DM/ARM8/SA/ARM10) #fCode +-------------------------------------+ | xxxx0000 1UAShhhh llllssss 1001mmmm | +-------------------------------------+ #f; tab cond> code condition. U 0: non signée, 1: signée. A drapeau d'accumulation. suffixe S. hhhh registre Rh. llll registre Rl. ssss registre Rs. mmmm registre Rm. DATA Instructions arithmétiques et logiques (aaaa) #wrap off; fCode +---------------------------------------------------------------------+ | aaaa Assembleur Signification P-Code | +---------------------------------------------------------------------+ | 0000 Et logique Rd = Rn AND Op2 | | 0001 Ou exclusif Rd = Rn EOR Op2 | | 0010 Soustraction Rd = Rn - Op2 | | 0011 Soustraction inversée Rd = Op2 - Rn | | 0100 Addition Rd = Rn + Op2 | | 0101 Addition avec retenue Rd = Rn + Op2 + C | | 0110 Soustraction avec ret. Rd = Rn - Op2 - (1-C) | | 0111 Soustr. inv. avec ret. Rd = Op2 - Rn - (1-C) | | 1000 Test de bits Rn AND Op2 | | 1001 Test d'égalité Rn EOR Op2 | | 1010 Comparaison Rn - Op2 | | 1011 Comparaison négative Rn + Op2 | | 1100 Ou logique Rd = Rn OR Op2 | | 1101 Déplacement Rd = Op2 | | 1110 Effacement de bits Rd = Rn AND NOT Op2 | | 1111 Non logique Rd = NOT Op2 | +---------------------------------------------------------------------+ #f DATA Transferts de registre d'état #wrap off; #fCode +-------------------------------------+ | xxxx0001 0s10aaaa 11110000 0000mmmm | Forme registre +-------------------------------------+ MSR | xxxx0011 0s10aaaa 1111rrrr bbbbbbbb | Forme immédiate +-------------------------------------+ +-------------------------------------+ | xxxx0001 0s001111 dddd0000 00000000 | MRS +-------------------------------------+ #f; tab cond> code condition. s 0: CPSR, 1: SPSR. aaaa 0001: positionne les bits de contrôle du PSR concerné. 1000: positionne les bits de flag du PSR concerné. 1001: positionne les bits de contrôle et de flag du PSR concerné. mmmm registre Rm. rrrr nombre de shifts. dddd registre Rd. bbbbbbbb valeur immédiate = #b, ROR #2r. DATA„Format du shift #wrap off; fCode +----------------------------------------------------------------+ | ttt Assembleur Signification | +----------------------------------------------------------------+ | 000 = LSL #c Décalage logique à gauche | | 001 = LSL Rc Décalage logique à gauche | | 010 = LSR #c for c != 0 Décalage logique à droite | | = LSR #32 for c == 0 | | 011 = LSR Rc Décalage logique à droite | | 100 = ASR #c for c != 0 Décalage arithmétique à droite | | = ASR #32 for c == 0 | | 101 = ASR Rc Décalage arithmétique à droite | | 110 = ROR #c for c != 0 Rotation vers la droite | | RRX for c == 0 Rotation droite sur 33 bits | | 111 = ROR Rc Rotation vers la droite | +----------------------------------------------------------------+ #f; wrap on Dans la forme registre, Rc est codé par les bits 8-11; le bit 7 doit être nul si Rc est utilisé. DATA&Transfert de donnée simple #wrap off; fCode +-------------------------------------+ | xxxx010P UBWLnnnn ddddoooo oooooooo | Forme immédiate +-------------------------------------+ | xxxx011P UBWLnnnn ddddcccc ctt0mmmm | Forme registre +-------------------------------------+ #f; tab cond> code condition. P 0: adressage post-indexé, 1: adressage pré-indexé. U 0: offset soustrait, 1: offset ajouté au registre de base. B 0: mot transféré, 1: octet transféré. W pour l'adressage pré-indexé: write-back (!). pour l'adressage post-indexé: translation d'adresse (T). L 0: , 1: . nnnn registre Rn (registre de base). dddd registre Rd. ooo...ooo offset. Form_shift> nombre de shifts. Form_shift> type du shift. mmmm registre Rm (offset). DATAâFormat de SWI #wrap off; fCode +-------------------------------------+ | xxxx1111 yyyyyyyy yyyyyyyy yyyyyyyy | +-------------------------------------+ #f; tab cond> code condition. SWI> opérande. DATA<Echange de données (SWP) #wrap off; fCode +-------------------------------------+ | xxxx0001 0B00nnnn dddd0000 1001mmmm | +-------------------------------------+ #f; tab cond> code condition. B 0: mot transféré, 1: octet transféré. nnnn registre Rn. dddd registre Rd. mmmm registre Rm. DATAÑInstructions non définies #wrap off; fCode +-------------------------------------+ | xxxx011y yyyyyyyy yyyyyyyy yyy1yyyy | +-------------------------------------+ #f; tab cond> code condition. DATAQLDC #wrap off #fH4:Opération #Indent 4 cRd = /adresse/ #Indent #fH4:Syntaxe #fCode;Indent 4 LDC\{{/}condition{/}\}\{L\} p{/}cp_no{/}, cRd, {/}adresse{/}\{!\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 (n-1) S + 2 N + b I (n = nombre de mots, b = nombre de cycles d'attente) #Indent DATA6LDM #wrap off #fH4:Opération #Indent 4 Manipulation de pile (dépilement) #Indent #fH4:Syntaxe #fCode;Indent 4 LDM\{{/}condition{/}\}{/}mode{/} Rn\{!\},\{\{{/}liste_reg{/}\}\}\{^\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 n S + 1 N + 1 I (n = nombre de mots transférés) + 1 S + 1 N si R15 chargé {/}ARM8{/}: MAX(2,n) cycles, n + 5 si R15 chargé {/}StrongARM{/}: MAX(2,n) + 1 cycles #Indent #fH4:Notes #wrap on;Indent 4 Le registre ayant le numéro le plus bas est toujours chargé avec le contenu de l'adresse la plus basse. #wrap off !: écriture de la valeur du registre modifié après utilisation. #tab *Mode* *Signification* *Pile* *Utilisation* *Fonction* IB/ED Increment Before Empty, Descending Dépilement vers le haut Pré-incrémentation IA/FD Increment After Full, Descending Dépilement vers le haut Post-incrémentation DB/EA Decrement Before Empty, Ascending Dépilement vers le bas Pré-décrémentation DA/FA Decrement After Full, Ascending Dépilement vers le bas Post-décrémentation #Indent DATA™LDR #wrap off #fH4:Opération #Indent 4 Rd = [{/}adresse{/}] #Indent #fH4:Syntaxe #fCode;Indent 4 LDR\{{/}condition{/}\}\{B\}\{T\} Rd, {/}adresse{/}\{!\} LDR\{{/}condition{/}\}(H|SB|SH) Rd, {/}adresse{/}\{!\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 N + 1 I + 1 S + 1 N si R15 chargé #Indent #fH4:Notes #Indent 4 LDRH, LDRSB et LDRSH ne sont pas disponibles sur ARM6/7. S: extension de signe (sinon extension à 0). B: chargement d'un octet (8 bits). H: chargement d'un demi-mot (16 bits). T: force la translation d'adresse en mode Superviseur (LDR/LDRB). !: écriture de la valeur du registre modifié après utilisation. #tab *Mode* *Adresse effective* *Indexation* *Restrictions* [Rn] Rn Aucune - [Rn, #expression] Rn + expression Pré-indexé LDR/LDRB [Rn, ±Rm] Rn ± Rm Pré-indexé - [Rn, ±Rm, #nombre] Rn ± (Rm shifté de nombre) Pré-indexé LDR/LDRB [Rn], #expression Rn Post-incrémenté LDR/LDRB [Rn], ±Rm Rn Post-incrémenté - [Rn], ±Rm, #nombre Rn Post-incrémenté LDR/LDRB L'expression doit s'évaluer en une valeur comprise entre -4095 to +4095. #Indent DATA^MCR #wrap off #fH4:Opération #Indent 4 cRn = rRd \{{/}op{/} cRm\} #Indent #fH4:Syntaxe #fCode;Indent 4 MCR\{{/}condition{/}\} p{/}cp_no{/}, {/}cp_opc{/}, rRd, cRn, cRm \{, {/}expression{/}\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 1 S + (b+1) I + 1 C (b = nombre de cycles d'attente) #Indent DATAMLA #wrap off #fH4:Opération #Indent 4 Rd = (Rm * Rs) + Rn #Indent #fH4:Syntaxe #fCode;Indent 4 MLA\{{/}condition{/}\}\{S\} Rd, Rm, Rs, Rn #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + m I (mul_timing> = nombre de cycles de multiplication) {/}ARM8{/}: 3 à 6 cycles {/}StrongARM{/}: 1 à 3 cycles + 1 cycle de délai #Indent #fH4:Notes #wrap on;Indent 4 Les registres Rd et Rm doivent être différents, et R15 (PC) ne doit pas être utilisé. #Indent DATA3UMLAL et SMLAL #wrap off #fH4:Opération #Indent 4 RdHi,RdLo = (Rm * Rs) + RdHi,RdLo #Indent #fH4:Syntaxe #fCode;Indent 4 UMULL\{{/}condition{/}\}\{S\} RdLo, RdHi, Rm, Rs SMULL\{{/}condition{/}\}\{S\} RdLo, RdHi, Rm, Rs #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 {/}ARM7DM{/}: 4 à 7 cycles {/}ARM8{/}: 4 à 7 cycles {/}StrongARM{/}: 2 à 4 cycles + 1 cycle de délai #Indent #fH4:Notes #wrap on;Indent 4 Les registres RdHi, RdLo et Rm doivent être différents, et R15 (PC) ne doit pas être utilisé. #Indent DATAÒModes #wrap off; tab {*}M[4:0]{*} *Mode* *Registres accessibles* 10000 usr_32 PC, R14..R0 CPSR 10001 fiq_32 PC, R14_fiq..R8_fiq, R7..R0 CPSR, SPSR_fiq 10010 irq_32 PC, R14_irq..R13_irq, R12..R0 CPSR, SPSR_irq 10011 svc_32 PC, R14_svc..R13_svc, R12..R0 CPSR, SPSR_svc 10111 abt_32 PC, R14_abt..R13_abt, R12..R0 CPSR, SPSR_abt 11011 und_32 PC, R14_und..R13_und, R12..R0 CPSR, SPSR_und #wrap on Note: M4 = 0 pour les modes 26 bits. DATAåMOV #wrap off #fH4:Opération #Indent 4 Rd = Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 MOV\{{/}condition{/}\}\{S\} Rd, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes #wrap on;Indent 4 Il n'y a aucune retenue dans cette opération, mais le flag Carry est positionné par la sortie du shifter. #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATAZMRC #wrap off #fH4:Opération #Indent 4 rRd = cRn \{{/}op{/} cRm\} #Indent #fH4:Syntaxe #fCode;Indent 4 MRC\{{/}condition{/}\} p{/}cp_no{/}, {/}cp_opc{/}, rRd, cRn, cRm \{, {/}expression{/}\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 1 S + b I + 1 C (b = nombre de cycles d'attente) #Indent DATASMRS #wrap off #fH4:Opération #Indent 4 Rn = PSR #Indent #fH4:Syntaxe #fCode;Indent 4 MRS\{{/}condition{/}\} Rd, /psr/ #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 1 S #Indent #fH4:Notes #wrap on;Indent 4 /psr/ est un des CPSR/CPSR_all (synonymes) ou SPSR/SPSR_all (synonymes). #Indent DATAÿMSR #wrap off #fH4:Opération #Indent 4 PSR = Rm #Indent #fH4:Syntaxe #fCode;Indent 4 MSR\{{/}condition{/}\} /psr/, Rm MSR\{{/}condition{/}\} /psrf/, Rm MSR\{{/}condition{/}\} /psrf/, /expression/ #Indent;f #fH4:Flags affectés #Indent 4 tous #Indent #fH4:Temps d'exécution #Indent 4 1 S {/}ARM8{/}: 1 à 3 cycles {/}StrongARM{/}: 1 à 4 cycles #Indent #fH4:Notes #wrap on;Indent 4 /psr/ est un des CPSR/CPSR_all (synonymes) ou SPSR/SPSR_all (synonymes). /psrf/ est un des CPSR_flg ou SPSR_flg. #Indent DATAóMUL #wrap off #fH4:Opération #Indent 4 Rd = Rm * Rs #Indent #fH4:Syntaxe #fCode;Indent 4 MUL\{{/}condition{/}\}\{S\} Rd, Rm, Rs #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + m I (mul_timing> = nombre de cycles de multiplication) {/}ARM8{/}: 3 à 6 cycles {/}StrongARM{/}: 1 à 3 cycles + 1 cycle de délai #Indent #fH4:Notes #wrap on;Indent 4 Les registres Rd et Rm doivent être différents, et R15 (PC) ne doit pas être utilisé. #Indent DATA%UMULL et SMULL #wrap off #fH4:Opération #Indent 4 RdHi,RdLo = Rm * Rs #Indent #fH4:Syntaxe #fCode;Indent 4 UMULL\{{/}condition{/}\}\{S\} RdLo, RdHi, Rm, Rs SMULL\{{/}condition{/}\}\{S\} RdLo, RdHi, Rm, Rs #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 {/}ARM7DM{/}: 3 à 6 cycles {/}ARM8{/}: 4 à 7 cycles {/}StrongARM{/}: 2 à 4 cycles + 1 cycle de délai #Indent #fH4:Notes #wrap on;Indent 4 Les registres RdHi, RdLo et Rm doivent être différents, et R15 (PC) ne doit pas être utilisé. #Indent DATAäTemps d'exécution d'une multiplication #wrap off; fCode +------------------------------------------+ | Intervalle pour Rs Nombre de cycles | +------------------------------------------+ | &0-&1 1 S + 1 I | | &2-&7 1 S + 2 I | | &8-&1F 1 S + 3 I | | &20-&7F 1 S + 4 I | | &80-&1FF 1 S + 5 I | | &200-&7FF 1 S + 6 I | | &800-&1FFF 1 S + 7 I | | &2000-&7FFF 1 S + 8 I | | &8000-&1FFFF 1 S + 9 I | | &20000-&7FFFF 1 S + 10 I | | &80000-&1FFFFF 1 S + 11 I | | &200000-&7FFFFF 1 S + 12 I | | &800000-&1FFFFFF 1 S + 13 I | | &2000000-&7FFFFFF 1 S + 14 I | | &8000000-&1FFFFFFF 1 S + 15 I | | &20000000-&FFFFFFFF 1 S + 16 I | +------------------------------------------+ #f; wrap on Ces temps ne s'appliquent pas à l'ARM7DM. Les temps pour l'ARM7DM sont donnés par la table suivante. #wrap off; fCode +---------------------------------------------------------------------------------+ | Intervalle pour Rs MUL MLA/SMULL SMLAL UMULL UMLAL | +---------------------------------------------------------------------------------+ | &0-&FF 1 S + 1 I 1 S + 2 I 1 S + 3 I 1 S + 2 I 1 S + 3 I | | &100-&FFFF 1 S + 2 I 1 S + 3 I 1 S + 4 I 1 S + 3 I 1 S + 4 I | | &10000-&FFFFFF 1 S + 3 I 1 S + 4 I 1 S + 5 I 1 S + 4 I 1 S + 5 I | | &1000000-&FEFFFFFF 1 S + 4 I 1 S + 5 I 1 S + 6 I 1 S + 5 I 1 S + 6 I | | &FF000000-&FFFEFFFF 1 S + 3 I 1 S + 4 I 1 S + 5 I 1 S + 5 I 1 S + 6 I | | &FFFF0000-&FFFFFEFF 1 S + 2 I 1 S + 3 I 1 S + 4 I 1 S + 5 I 1 S + 6 I | | &FFFFFF00-&FFFFFFFF 1 S + 1 I 1 S + 2 I 1 S + 3 I 1 S + 5 I 1 S + 6 I | +---------------------------------------------------------------------------------+ DATAéMVN #wrap off #fH4:Opération #Indent 4 Rd = NOT Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 MVN\{{/}condition{/}\}\{S\} Rd, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes #wrap on;Indent 4 Il n'y a aucune retenue dans cette opération, mais le flag Carry est positionné par la sortie du shifter. #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATA?NOP #wrap off #fH4:Opération #Indent 4 Pas d'opération #Indent #fH4:Syntaxe #fCode;Indent 4 NOP #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 1 S #Indent #fH4:Notes #Indent 4 Cette pseudo-instruction n'est pas conditionnelle. NOP est assemblée en MOV r0,r0. #Indent DATA Op2 #wrap off Reg Reg, #constante Reg, Reg (Note: cela prend un cycle d'horloge supplémentaire; seul l'octet de poids faible du registre de décalage est utilisé) #constante (de la forme Octet ROR n*2, n étant dans 0..15) DATAÓOpérateurs (Acorn Assembler Release 2) #wrap off Toutes les valeurs entières sont traitées comme des entiers non signés sur 32 bits. #tab 7 ?A Quantité de code généré par la ligne définissant le label A 7 +A Plus unaire 7 -A Opposé 7 :LNOT:A NON logique booléen 7 :NOT:A NON logique bit à bit 7 :DEF:A Teste si la variable A est définie à l'assemblage 7 :LEN:A Longueur de la chaîne A 7 :CHR:A Chaîne ASCII de A (longueur 1) 7 :STR:A Chaîne hexadécimal de A (8 chiffres ou T ou F) 6 A*B Multiplication 6 A/B Division 6 A:MOD:B Modulo 5 A:LEFT:B B caractères les plus à gauche de A 5 A:RIGHT:B B caractères les plus à droite de A 5 A:CC:B B concaténé à A 4 A:ROL:B Rotation à gauche de B bits 4 A:ROR:B Rotation à droite de B bits 4 A:SHL:B Décalage à gauche de B bits 4 A:SHR:B Décalage à droite de B bits 3 A+B Addition 3 A-B Soustraction 3 A:AND:B ET logique bit à bit 3 A:OR:B OU logique bit à bit 3 A:EOR:B OU exclusif bit à bit 2 A=B A égal à B 2 A>B A supérieur à B 2 A>=B A supérieur ou égal à B 2 A\B A différent de B 1 A:LAND:B ET logique booléen 1 A:LOR:B OU logique booléen 1 A:LEOR:B OU exclusif booléen DATAµORR #wrap off #fH4:Opération #Indent 4 Rd = Rn OR Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 ORR\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes #wrap on;Indent 4 Il n'y a aucune retenue dans cette opération, mais le flag Carry est positionné par la sortie du shifter. #Indent DATArProgram Status Registers #wrap off; tab Registres d'état : #fH4:Flags #Indent 4 *Bit* *Nom* *Signification* 31 N Négatif 30 Z Zéro 29 C Carry (retenue) 28 V Overflow (dépassement de capacité) #Indent #fH4:Contrôle #Indent 4 *Bit* *Nom* *Signification* 7 I IRQ désactivée 6 F FIQ désactivée 4 M4 3 M3 2 M2 1 M1 0 M0 #Indent DATAwR15 Mode 26 bits: PSR bits 0-1 et 26-31 PC bits 2-25 Bits 0-1: #Indent 4 0 Mode user 1 Mode FIQ 2 Mode IRQ 3 Mode SVC #Indent Bits 26-31: #Indent 4; tab *Bit* *Nom* *Signification* 31 N Négatif 30 Z Zéro 29 C Carry (retenue) 28 V oVerflow (dépassement de capacité) 27 I Interrupt request (IRQ) désactivée 26 F Fast interrupt request (FIQ) désactivée #Indent DATAÿRd #wrap on Rd peut être n'importe lequel des registres R0 à R15. Si Rd = R15 et si le suffixe S n'est pas présent, alors seuls les bits du PC sont affectés, pas les flags (en mode User 32 bits, le suffixe S ne doit pas être présent si Rd = R15). DATA'Références #wrap off {/}The ARM RISC Chip - A Programmer's Guide{/} par Alex van Someren et Carol Atack Addison-Wesley, ISBN 0-201-62410-9 Guide de l'utilisateur de l'{/}Acorn Assembler Release 2{/} Fichier {/}ARM Instruction Formats/Timings{/} de Robin Watts Manuel StrongHelp /Assembly/ StrongARM Data Sheet V2.0 ARM810 Data Sheet Usenet: #url news:comp.sys.arm> SA-110 Microprocessor Instruction Timing (juin 1997) ARM10 Thumb Family (ARM Product Overview) Site web d'ARM: #url> DATA°Rn #wrap on Rn peut être n'importe lequel des registres R0 à R15. Si Rn = R15, alors seuls les bits du PC sont utilisés. Les bits correspondant aux flags sont annulés. DATA'RSB #wrap off #fH4:Opération #Indent 4 Rd = Op2 - Rn #Indent #fH4:Syntaxe #fCode;Indent 4 RSB\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent DATA3RSC #wrap off #fH4:Opération #Indent 4 Rd = Op2 - Rn - 1 + Carry #Indent #fH4:Syntaxe #fCode;Indent 4 RSC\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent DATA”Suffixe S #wrap off Les flags sont uniquement mis à jour si le suffixe S est présent. Le suffixe S est implicite dans CMP, CMN, TEQ et TST. DIR$hh€ÒGýÿÿ5ª¬™ branch ÔGýÿÿ¾™4pcÔÕGýÿÿsþ™³TimingDATA Temps d'exécution de B/BL sur StrongARM #fCode X B/BL Y X+4 ... #f;wrap on Pendant le décodage de l'instruction B/BL, l'instruction à X+4 est chargée (fetch). Si le fetch /manque/ le Icache ou le I-TLB, alors le fetch externe, la lecture d'une ligne de cache, ou le fetch de l'entrée de la table des pages sera achevé avant que le processeur charge l'instruction à Y. Noter que si le fetch de X+4 /manque/ le Icache et le I-TLB, alors le processeur chargera uniquement l'entrée de la table des pages avant de charger l'instruction à Y. DATA4Instructions ayant le PC comme destination #wrap off MOV PC, Rx 1 cycle supplémentaire (mais pas de bypass pour lire Rx) Autre 2 cycles supplémentaires #fH4:Conséquence #fCode;Indent 4 MOV R3, R2 ADD PC, R3, #0 #Indent;f est un cycle plus rapide que #fCode;Indent 4 MOV R3, R2 MOV PC, R3 #Indent;f DATA³Temps d'exécution des instructions du StrongARM #wrap on Le délai est le nombre de cycles que la prochaine instruction devra attendre si elle utilise le résultat comme entrée. Pour les load et store, le timing est pour les cache hits. #wrap off; fCode +-------------------------------+-------+--------------+ | Groupe d'instructions | délai | #cycles | +-------------------------------+-------+--------------+ | Data processing | 0 | 1 | | Register shift instruction | 0 | 2 | | MUL/MLA, résultat sur 32 bits | 1 | 1..3 | | MUL/MLA, résultat sur 64 bits | 1 | 2..4 | | LDR - writeback of base | 1 | 1 | | LDR - load data zero extended | 1 | 1 | | LDR - load data sign extended | 2 | 1 | | STR - writeback of base | 0 | 1 | | LDM (delai pour dernier reg.) | 1 | MAX(2,#regs) | | STM - writeback of base | 0 | MAX(2,#regs) | | B/BL | 0 | 2 | | MCR | 2 | 1 | | MRC | 1 | 1 | | MSR | 0 | 1..4 | | MRS | 0 | 1 | | SWAP | 2 | 2 | +-------------------------------+-------+--------------+ #f SA-110_pc> DATAmSBC #wrap off #fH4:Opération #Indent 4 Rd = Rn - Op2 - 1 + Carry #Indent #fH4:Syntaxe #fCode;Indent 4 SBC\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATAxShift #wrap off Les différents types de shift sont : #Indent 2; tab *Mnemonic* *Signification* {*}Nombres de shifts spécifiés dans l'instruction{*} LSL Décalage logique vers la gauche 0..31 LSR Décalage logique vers la droite 1..32 ASR Décalage arithmétique vers la droite 1..32 ROR Rotation vers la droite 1..31 RRX Rotation sur 33 bits vers la droite 1 #Indent #wrap on RRX est une rotation de 1, où bit 31 = ancienne carry et nouvelle carry = ancien bit 0. Pour tous les shifts, le flag carry est positionné par le dernier bit sorti (ancienne valeur du flag carry dans le cas d'un nombre de shifts nul). DATAVSTC #wrap off #fH4:Opération #Indent 4 /adresse/ = cRn #Indent #fH4:Syntaxe #fCode;Indent 4 STC\{{/}condition{/}\}\{L\}\{T\} p{/}cp_no{/}, cRn, {/}adresse{/}\{!\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 (n-1) S + 2 N + b I (n = nombre de mots, b = nombre de cycles d'attente) #Indent DATAÿSTM #wrap off #fH4:Opération #Indent 4 Manipulation de pile (empilement) #Indent #fH4:Syntaxe #fCode;Indent 4 STM\{{/}condition{/}\}{/}mode{/} Rn\{!\},\{\{{/}liste_reg{/}\}\}\{^\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 (n-1) S + 2 N (n = nombre de mots transférés) {/}ARM8{/}: MAX(2,n) cycles {/}StrongARM{/}: MAX(2,n) + 0 cycles #Indent #fH4:Notes #wrap on;Indent 4 Le contenu du registre ayant le numéro le plus bas est toujours stocké à l'adresse la plus basse. #wrap off !: écriture de la valeur du registre modifié après utilisation. #tab *Mode* *Signification* *Pile* *Utilisation* *Fonction* IB/FA Increment Before Full, Ascending Empilement vers le haut Pré-incrémentation IA/EA Increment After Empty, Ascending Empilement vers le haut Post-incrémentation DB/FD Decrement Before Full, Descending Empilement vers le bas Pré-décrémentation DA/ED Decrement After Empty, Descending Empilement vers le bas Post-décrémentation #Indent DATADSTR #wrap off #fH4:Opération #Indent 4 [{/}adresse{/}] = Rd #Indent #fH4:Syntaxe #fCode;Indent 4 STR\{{/}condition{/}\}\{B\}\{T\} Rd, {/}adresse{/}\{!\} STR\{{/}condition{/}\}H Rd, {/}adresse{/}\{!\} #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 2 N {/}StrongARM{/}: 1 + 0 cycle #Indent #fH4:Notes #Indent 4 STRH n'est pas disponible sur ARM6/7. B: stockage d'un octet (8 bits). H: stockage d'un demi-mot (16 bits). T: force la translation d'adresse en mode Superviseur (STR/STRB). !: écriture de la valeur du registre modifié après utilisation. #tab *Mode* *Adresse effective* *Indexation* *Restrictions* [Rn] Rn Aucune - [Rn, #expression] Rn + expression Pré-indexé STR/STRB [Rn, ±Rm] Rn ± Rm Pré-indexé - [Rn, ±Rm, #nombre] Rn ± (Rm shifté de nombre) Pré-indexé STR/STRB [Rn], #expression Rn Post-incrémenté STR/STRB [Rn], ±Rm Rn Post-incrémenté - [Rn], ±Rm, #nombre Rn Post-incrémenté STR/STRB L'expression doit s'évaluer en une valeur comprise entre -4095 to +4095. #Indent DATAaSUB #wrap off #fH4:Opération #Indent 4 Rd = Rn - Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 SUB\{{/}condition{/}\}\{S\} Rd, Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C, V #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) + 1 S + 1 N si R15 mis à jour #Indent #fH4:Notes (constante Op2) #wrap on;Indent 4 Si Op2 est une constante qui n'est pas le résultat d'une rotation paire sur une valeur 8 bits, l'assembleur essaie de générer une instruction appliquée au complément à 1 de la constante. Si cette seconde tentative échoue aussi, il se produit une erreur. #Indent DATA“SWI #wrap off #fH4:Opération #Indent 4 Appel au système d'exploitation #Indent #fH4:Syntaxe #fCode;Indent 4 SWI\{{/}condition{/}\} /opérande/ #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 2 S + 1 N {/}ARM8{/}: 4 cycles #Indent #fH4:Notes #wrap on;Indent 4 Un opérande sur 24 bits est passé pour être interprété par le système d'exploitation. #Indent DATAˆSWP #wrap off #fH4:Opération #Indent 4 Rd = [Rn], [Rn] = Rm #Indent #fH4:Syntaxe #fCode;Indent 4 SWP\{{/}condition{/}\}\{B\} Rd, Rm, [Rn] #Indent;f #fH4:Flags affectés #Indent 4 aucun #Indent #fH4:Temps d'exécution #Indent 4 1 S + 2 N + 1 I {/}ARM8{/}: 2 cycles {/}StrongARM{/}: 2 + 2 cycles #Indent #fH4:Notes #wrap on;Indent 4 Le contenu de l'adresse donnée par Rn est lu dans la mémoire externe, le cache étant ignoré. La broche LOCK du processeur est mise au niveau haut pendant l'exécution de cette instruction pour signaler à la mémoire que l'opération doit être indivisible. R15 ne doit pas être utilisé comme opérande. #Indent DATAuNoms de symboles #wrap on Les symboles doivent commencer par une lettre majuscule ou minuscule, peuvent contenir des caractères alphanumériques et le caractère de soulignement (underscore), et peuvent avoir jusqu'à 255 caractères. L'assembleur est case-sensitive. D'autres caractères peuvent être utilisés si le nom de symbole est entouré de barres verticales (|). DATATEQ #wrap off #fH4:Opération #Indent 4 Flags = Rn EOR Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 TEQ\{{/}condition{/}\}\{P\} Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) #Indent #fH4:Notes #wrap on;Indent 4 La forme P de cette instruction ne doit pas être utilisée dans les modes 32 bits. #Indent DATATemps d'exécution des instructions (ARM6/7) #wrap on #fH4:Catégories de cycles #Indent 4 Cycle non séquentiel (cycle N). Le CPU doit effectuer un transfert à une adresse qui n'est pas liée à celle utilisée au cycle précédent. # Cycle séquentiel (cycle S). Le CPU doit effectuer un transfert à une adresse qui est soit égale soit un mot plus grand que celle utilisée au cycle précédent. # Cycle interne (cycle I). Le CPU effectue une opération interne et aucun transfert de mémoire n'est demandé. # Cycle coprocesseur (cycle C). Le CPU veut utiliser le bus de données pour communiquer avec un coprocesseur, aucun transfert de mémoire n'est demandé. #Indent #wrap off; tab #fH4:Vitesse des instructions de l'ARM #Indent 4 *Instruction* *Nombre de cycles* *Cycles supplémentaires* Traitement de données 1 S + 1 S si shift par registre (opérations ALU) + 1 S + 1 N si R15 mis à jour MSR, MRS 1 S LDR 1 S + 1 N + 1 I + 1 S + 1 N si R15 mis à jour STR 2 N LDM n S + 1 N + 1 I + 1 S + 1 N si R15 mis à jour STM (n-1) S + 2 N SWP 1 S + 2 N + 1 I B, BL 2 S + 1 N SWI 2 S + 1 N MUL, MLA 1 S + mul_timing> I CDP 1 S + b I LDC, STC (n-1) S + 2 N + b I MRC 1 S + b I + 1 C MCR 1 S + (b+1) I + 1 C #wrap on n est le nombre de mots transférés. # mul_timing> est le nombre de cycles pris par le multiplieur. # b est le nombre de cycles passés à attendre le coprocesseur, il est déterminé par le coprocesseur lui-même. #Indent DATATST #wrap off #fH4:Opération #Indent 4 Flags = Rn AND Op2 #Indent #fH4:Syntaxe #fCode;Indent 4 TST\{{/}condition{/}\}\{P\} Rn, Op2 #Indent;f #fH4:Flags affectés #Indent 4 N, Z, C #Indent #fH4:Temps d'exécution #Indent 4 1 S + 1 S si shift (Rs) #Indent #fH4:Notes #wrap on;Indent 4 La forme P de cette instruction ne doit pas être utilisée dans les modes 32 bits. #Indent DATA„Variables prédéfinies #wrap off;tab *Variable* *Signification* \{PC\} ou '.' Compteur ordinal (de programme) courant. \{VAR\} ou '@' dir_storalloc> courant. \{TRUE\} Constante logique Constants>. \{FALSE\} Constante logique Constants>. \{OPT\} dir_list> courantes. \{CONFIG\} Taille du PC (32 ou 26).