HELP,     ÿÿÿÿ,    ýÿÿ    ü         $   DIR$    0  Hýÿÿ¥²í         !Root   P  Gÿÿÿdº™i         ADC ¼  Gÿÿÿº™a         ADD    Hýÿÿ	è°íÚ          address ü  Fÿÿÿi4{'E         ADR D  Gÿÿÿtº™ð         AND 4  GÿÿÿÈô©™+         B   `  Gÿÿÿ	º™ô         BIC T  Gÿÿÿ.ÿ©™T         BL  ¨!  FÿÿÿÚû|'Q         CDP ü"  Gÿÿÿ»º™º         CMN ¸%  Gÿÿÿº™º         CMP t(  Fýÿÿt˜û×í         cond    d,  FýÿÿŠ–"Tø         Constants   \/  Fýÿÿ0
+‹         directives  è1  Hýÿÿµí´        dir_    Øo  GÿÿÿQº™¶         EOR q  FýÿÿÐÖþ'¤         Formats 4s  Hýÿÿßµí|        Form_   t—  Fÿÿÿ[ }'Q         LDC È˜  Gÿÿÿõ_6         LDM    GÿÿÿT®?0™         LDR œ¡  Fÿÿÿ_»'^         MCR ü¢  Gÿÿÿí"j5         MLA  ¥  Gÿÿÿä(j53         MLAL    4§  Fýÿÿ^Ü„'Ò         Mode    ©  Gÿÿÿ©º™å         MOV ð«  Fÿÿÿqr'Z         MRC L­  Fÿÿÿ|'S         MRS  ®  Gÿÿÿ&¼™ÿ         MSR  °  GÿÿÿÜ0j5ó         MUL ”²  Gÿÿÿy8j5%         MULL    ¼´  FýÿÿP‡'ä         mul_timing   ¼  Gÿÿÿ‚ º™é         MVN Œ¿  Fÿÿÿ)-€'?         NOP ÌÀ  Fýÿÿ"ð&T
         Op2 ØÁ  FýÿÿÓÃØÓ         Operators   ¬Æ  Gÿÿÿë#º™µ         ORR dÈ  Fýÿÿ.Å„'r         PSR ØÉ  FÿÿÿŽ/ðw         R15 PË  HýÿÿáW5­ÿ          Rd  PÌ  Hýÿÿâß´í'         References  xÎ  Hýÿÿ·c5­°          Rn  (Ï  GÿÿÿH&º™'         RSB PÐ  Gÿÿÿ”(º™3         RSC „Ñ  Fýÿÿƒpƒ'”          S   Ò  Hýÿÿðµíh         SA-110_ ˆÛ  GÿÿÿÔ*º™m         SBC øÝ  Fýÿÿs„'x         shift   pà  Fÿÿÿ,¤€'V         STC Èá  Gÿÿÿä_ÿ         STM Èå  Gÿÿÿ,€@0D         STR ê  GÿÿÿR-º™a         SUB pì  Gÿÿÿ²B0“         SWI î  GÿÿÿzÑ{ˆ         SWP Œð  Fýÿÿ0'Tu         sym_names   ò  Gÿÿÿ¥0º™         TEQ „ó  GýÿÿN90          Timing  „ù  Gÿÿÿ»2º™         TST û  Fýÿÿ¦x+„         variables   DATA  ARM 6/7/8/10 - StrongARM
#wrap off
{_}{/}Jeu d'instructions de l'ARM6/7/8/10/StrongARM:{/}{_}
#tab
<ADC>	Addition avec retenue				<MOV>	Déplacement
<ADD>	Addition					<MRC>	Transfert coprocesseur vers registre CPU
<ADR>	Chargement d'adresse dans un registre		<MRS>	Transfert PSR vers registre
<AND>	ET logique					<MSR>	Transfert registre vers PSR
<B>	Branchement					<MUL>	Multiplication
<BIC>	Effacement de bits				<MULL>	Multiplication longue (1)
<BL>	Branchement avec lien				<MVN>	NON logique
BLX	Branchement avec lien et échange (3)		<NOP>	Pas d'opération
BX	Branchement et échange (3)			<ORR>	OU logique
<CDP>	Opération coprocesseur				<RSB>	Soustraction inversée
CLZ	Compte les zéros situés en tête (2)		<RSC>	Soustraction inversée avec retenue
<CMN>	Comparaison négative				<SBC>	Soustraction avec retenue
<CMP>	Comparaison					<STC>	Stockage d'un registre coprocesseur
<EOR>	OU exclusif					<STM>	Stockage de plusieurs registres
<LDC>	Chargement d'un registre coprocesseur		<STR>	Stockage d'un registre
<LDM>	Chargement de plusieurs registres		<SUB>	Soustraction
<LDR>	Chargement d'un registre			<SWI>	Interruption logicielle
<MCR>	Transfert registre CPU vers coprocesseur	<SWP>	Echange registre avec mémoire
<MLA>	Multiplication avec accumulation		<TEQ>	Test d'égalité bit à bit
<MLAL>	Multiplication longue avec accumulation (1)	<TST>	Test avec ET logique

(1)	ARM7DM/ARM8/StrongARM/ARM10
(2)	ARM10
(3)	Thumb

#Table lines 3
    <Codes condition=>cond>
    <Suffixe S=>S>
    <PSR>
    <Rd>
    <Rn>
    <Op2>
    <Directives de l'assembleur=>directives>
    <Opérateurs=>Operators>
    <R15 (mode 26 bits)=>R15>
    <Formats>
    <Timing ARM6/7=>Timing>
    <Timing StrongARM=>SA-110_Timing>
#Endtable

<Références=>References>
#Line;Align Centre;wrap off
par <Vincent Lefèvre=>address>, 5 avril 1999
  DATAi  ADC
#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 <SBC>
appliquée au complément à 1 de la constante. Si cette seconde tentative
échoue aussi, il se produit une erreur.
#Indent
   DATAa  ADD
#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 <SUB>
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:		<shmanuals@vinc17.org=>#url mailto:shmanuals@vinc17.org>
Page d'accueil:	<http://www.vinc17.org/=>#url>
Page Risc PC:	<http://www.vinc17.org/acorn/riscpc_fra.html=>#url>
  DATAE  ADR
#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 <BIC>
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 (<note=>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 <AND>
appliquée au complément à 1 de la constante. Si cette seconde tentative
échoue aussi, il se produit une erreur.
#Indent
DATAT  BL
#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 (<note=>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
DATAQ  CDP
#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 <CMP>
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 <CMN>
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
<Toutes les directives=>dir_all>

#Table columns 2
  <Allocation de mémoire=>dir_storalloc>
  <Assemblage conditionnel=>dir_cond>
  <Définitions de symboles=>dir_symdef>
  <Directives de diagnostic=>dir_diag>
  <Directives de lien de fichiers=>dir_filelink>
  <Directives de linking=>dir_link>
  <Directives de listing=>dir_list>
  <Divers=>dir_misc>
  <Initialisation de mémoire=>dir_storinit>
  <Labels locaux=>dir_loclbl>
  <Macros=>dir_macros>
  <Organisation=>dir_orga>
#EndTable

#Table columns 3
<Constantes=>Constants>  
<Noms de symboles=>sym_names>  
<Variables prédéfinies=>variables>
#EndTable
 DIR$´  ´  œ3  FýÿÿÕÒ­*Ü         all xD  Fýÿÿ|+ò         cond    lF  Gýÿÿv®ðŽC         diag    °H  Fýÿÿ/½+q          filelink    $I  FýÿÿÝÖ+c         link    ˆM  Fýÿÿ) +‰         list    S  Fýÿÿ ]+=         loclbl  TV  Fýÿÿ+#         macros  xW  Fýÿÿ´‚$TÖ         misc    PY  FýÿÿôÓ+1	         orga    „b  FýÿÿÓ
+P         storalloc   Ôe  Fýÿÿ¡Q%Tý         storinit    Ôh  Fýÿÿwi&T         symdef  DATAÜ  Directives de l'assembleur
#wrap off; tab
*Directive* 	*Synonyme* 	*Type* 								*Signification*
! 		 		<Directives de diagnostic=>dir_diag> 				Assertion arithmétique
\# 		 		<Allocation de mémoire=>dir_storalloc> 				Réservation de mémoire dans la structure
& 		DCD 		<Initialisation de mémoire=>dir_storinit> 			Définition d'une constante word (32 bits)
% 		 		<Init. de mémoire=>dir_storinit> / <Labels locaux=>dir_loclbl> 	Remplissage avec des 0 / Introduction de labels locaux
* 		EQU 		<Définitions de symboles=>dir_symdef> 				Equate
= 		DCB 		<Initialisation de mémoire=>dir_storinit> 			Définition d'une constante byte (8 bits)
[ 		 		<Assemblage conditionnel=>dir_cond> 				IF
] 		 		<Assemblage conditionnel=>dir_cond> 				ENDIF
| 		 		<Assemblage conditionnel=>dir_cond> 				ELSE
^ 		 		<Allocation de mémoire=>dir_storalloc> 				Origine de la structure
ALIGN 		 		<Allocation de mémoire=>dir_storalloc> 				Alignement du PC
AREA 		 		<Organisation=>dir_orga> 					Définition des program areas
ASSERT 		 		<Directives de diagnostic=>dir_diag> 				Assertion logique
CN 		 		<Définitions de symboles=>dir_symdef> 				Equate de registre coprocesseur
CP 		 		<Définitions de symboles=>dir_symdef> 				Equate coprocesseur
DCB 		= 		<Initialisation de mémoire=>dir_storinit> 			Définition d'une constante byte (8 bits)
DCD		& 		<Initialisation de mémoire=>dir_storinit> 			Définition d'une constante word (32 bits)
DCFD		 		<Initialisation de mémoire=>dir_storinit> 			Définition d'une constante flottante double précision
DCFS		 		<Initialisation de mémoire=>dir_storinit> 			Définition d'une constante flottante simple précision
DCW		 		<Initialisation de mémoire=>dir_storinit> 			Définition d'une constante half-word (16 bits)
END		 		<Organisation=>dir_orga> 					Fin du fichier source assembleur
ENTRY		 		<Organisation=>dir_orga> 					Définition du point d'entrée de l'AREA
EQU		* 		<Définitions de symboles=>dir_symdef> 				Equate
EXPORT 		 		<Directives de linking=>dir_link> 				Déclaration d'un symbole à exporter
FN 		 		<Définitions de symboles=>dir_symdef> 				Equate de registre flottant
GBLA 		 		<Définitions de symboles=>dir_symdef> 				Déclaration de variable globale (type arithmétique)
GBLL 		 		<Définitions de symboles=>dir_symdef> 				Déclaration de variable globale (type logique)
GBLS 		 		<Définitions de symboles=>dir_symdef> 				Déclaration de variable globale (type chaîne)
GET 		INCLUDE 	<Directives de lien de fichiers=>dir_filelink> 			Inclusion d'un fichier
IMPORT 		 		<Directives de linking=>dir_link> 				Annonce un symbole externe
INCLUDE 	GET 		<Directives de lien de fichiers=>dir_filelink> 			Inclusion d'un fichier
KEEP 		 		<Organisation=>dir_orga> 					Garde les symboles locaux dans la table des symboles
LCLA 		 		<Définitions de symboles=>dir_symdef> 				Déclaration de variable locale (type arithmétique)
LCLL 		 		<Définitions de symboles=>dir_symdef> 				Déclaration de variable locale (type logique)
LCLS 		 		<Définitions de symboles=>dir_symdef> 				Déclaration de variable locale (type chaîne)
LTORG 		 		<Organisation=>dir_orga> 					Origine de la zone des litéraux
MACRO 		 		<Macros=>dir_macros> 						Début d'une définition de macro
MEND 		 		<Macros=>dir_macros> 						Fin d'une définition de macro
MEXIT 		 		<Macros=>dir_macros> 						Sortie anticipée d'une macro
NOFP 		 		<Divers=>dir_misc> 						Flottants non autorisés
OPT 		 		<Directives de listing=>dir_list> 				Options d'assemblage
ORG 		 		<Organisation=>dir_orga> 					Origine de l'assemblage
RLIST 		 		<Divers=>dir_misc> 						Définition d'une liste de registres
RN 		 		<Définitions de symboles=>dir_symdef> 				Equate de registre
ROUT 		 		<Labels locaux=>dir_loclbl> 					Début d'une région de labels locaux
SETA 		 		<Définitions de symboles=>dir_symdef> 				Assigne une valeur à une variable (type arithmétique)
SETL 		 		<Définitions de symboles=>dir_symdef> 				Assigne une valeur à une variable (type logique)
SETS 		 		<Définitions de symboles=>dir_symdef> 				Assigne une valeur à une variable (type chaîne)
SUBT 		 		<Directives de listing=>dir_list> 				Chaîne de sous-titre
TTL 		 		<Directives de listing=>dir_list> 				Chaîne de titre
WEND 		 		<Assemblage conditionnel=>dir_cond> 				Fin de tant que
WHILE 		 		<Assemblage conditionnel=>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
  DATAC  Directives 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
 DATAq   Directives de lien de fichiers
#wrap off;fCode
INCLUDE {/}nom-de-fichier{/}
GET     {/}nom-de-fichier{/}
   DATAc  Directives 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 <SET=>dir_symdef>, <GBL=>dir_symdef> et <LCL=>dir_symdef>
  	32 	Désactive le listing des directives <SET=>dir_symdef>, <GBL=>dir_symdef> et <LCL=>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 <MEND=>dir_macros>
  	32768 	Désactive le listing des directives <MEND=>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 <LDM>/<STM>.
  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 <LDR>/<STR>.

#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 <EXPORT=>dir_link>) dans le
fichier objet.
   DATAP  Allocation 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.
   DATA  Dé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
<Instructions arithmétiques et logiques=>Form_dataproc>
<Instructions de branchement=>Form_branch>
<Multiplication=>Form_mul>
<Transferts de donnée simple=>Form_single>
<Transferts de blocs de données=>Form_block>
<Echange de données (swap)=>Form_SWP>
<Transferts de registre d'état=>Form_PSR>
<SWI=>Form_SWI>
<Coprocesseur=>Form_copro>
<Instructions non définies=>Form_undef>
DIR$|  |  °t  Fýÿÿí<ÿ'Õ         block   ˆv  HýÿÿI2³í>         branch  Èx  Fýÿÿ7þÿ'U         copro    ~  Fýÿÿy@ (ƒ         dataproc    ¤€  HýÿÿŒN²í         mul ¸ƒ  Fýÿÿœü (
         op  Ä‰  Fýÿÿöj(         PSR ÔŒ  Fýÿÿur(„         shift   X‘  FýÿÿÚ(&         single  €”  Fýÿÿ(ì(â          SWI d•  FýÿÿÒ	(<         SWP  –  Fýÿÿ<	(Ñ          undef   DATAÕ  Transferts de blocs de données
#wrap off; fCode
+-------------------------------------+
| xxxx100P USWLnnnn llllllll llllllll |
+-------------------------------------+
#f; tab
<xxxx=>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: <STM>, 1: <LDM>.
nnnn 		registre Rn.
lll...lll 	liste de registres.
   DATA>  Instructions de branchement
#wrap off
#fH4:B/BL
#fCode
+-------------------------------------+
| xxxx101L oooooooo oooooooo oooooooo |
+-------------------------------------+
#f; tab
<xxxx=>cond> 	code condition.
L 		drapeau de link (<B> / <BL>).
ooo...ooo 	offset.

adresse de destination = adresse courante + 8 + (4 * offset)

#fH4:BX/BLX (Thumb)
#fCode
+-------------------------------------+
| xxxx0001 00101111 11111111 00L1mmmm |
+-------------------------------------+
#f; tab
<xxxx=>cond> 	code condition.
L 		drapeau de link (BX / BLX).
mmmm 		registre Rm.
  DATAU  Coprocesseur
#wrap off
#fH4:Opérations coprocesseur
#fCode
+-------------------------------------+
| xxxx1110 oooonnnn ddddpppp qqq0mmmm | <CDP>
+-------------------------------------+
#f; tab
<xxxx=>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 | <LDC>/<STC>
+-------------------------------------+
#f; tab
<xxxx=>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: <STC>, 1: <LDC>.
nnnn 		registre rRn.
DDDD 		registre cRd.
pppp 		numéro du coprocesseur.
oooooooo 	offset / 4.

#fH4:Transfert de registres coprocesseur
#fCode
+-------------------------------------+
| xxxx1110 oooLNNNN ddddpppp qqq1MMMM | <MRC>/<MCR>
+-------------------------------------+
#f; tab
<xxxx=>cond> 	code condition.
ooo 		numéro de l'opération.
L 		0: <MCR>, 1: <MRC>.
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
<xxxx=>cond> 		code condition.
<aaaa=>Form_op> 	opération.
<S> 			suffixe S.
<nnnn=>Rn> 		registre Rn.
<dddd=>Rd> 		registre Rd.
<ccccc=>Form_shift> 	nombre de shifts ou registre de shift.
<ttt=>Form_shift> 	type de shift.
<mmmm=>Op2> 		registre Rm (Op2).
<rrrr=>Op2> 		nombre de rotations / 2.
<bbbbbbbb=>Op2> 	valeur immédiate (octet).
 DATA  Multiplication
#wrap off
#fH4:Multiplication
#fCode
+-------------------------------------+
| xxxx0000 00ASdddd nnnnssss 1001mmmm |
+-------------------------------------+
#f; tab
<xxxx=>cond> 	code condition.
A 		drapeau d'accumulation (<MUL> / <MLA>).
<S> 		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
<xxxx=>cond> 	code condition.
U 		0: non signée, 1: signée.
A 		drapeau d'accumulation.
<S> 		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   <AND>         Et logique               Rd = Rn AND Op2         |
| 0001   <EOR>         Ou exclusif              Rd = Rn EOR Op2         |
| 0010   <SUB>         Soustraction             Rd = Rn  -  Op2         |
| 0011   <RSB>         Soustraction inversée    Rd = Op2 -  Rn          |
| 0100   <ADD>         Addition                 Rd = Rn  +  Op2         |
| 0101   <ADC>         Addition avec retenue    Rd = Rn  +  Op2 + C     |
| 0110   <SBC>         Soustraction avec ret.   Rd = Rn  -  Op2 - (1-C) |
| 0111   <RSC>         Soustr. inv. avec ret.   Rd = Op2 -  Rn  - (1-C) |
| 1000   <TST>         Test de bits                  Rn AND Op2         |
| 1001   <TEQ>         Test d'égalité                Rn EOR Op2         |
| 1010   <CMP>         Comparaison                   Rn  -  Op2         |
| 1011   <CMN>         Comparaison négative          Rn  +  Op2         |
| 1100   <ORR>         Ou logique               Rd = Rn OR  Op2         |
| 1101   <MOV>         Déplacement              Rd =        Op2         |
| 1110   <BIC>         Effacement de bits       Rd = Rn AND NOT Op2     |
| 1111   <MVN>         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
<xxxx=>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
<xxxx=>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: <STR>, 1: <LDR>.
nnnn 			registre Rn (registre de base).
dddd 			registre Rd.
ooo...ooo 		offset.
<ccccc=>Form_shift> 	nombre de shifts.
<tt=>Form_shift> 	type du shift.
mmmm 			registre Rm (offset).
  DATAâ   Format de SWI
#wrap off; fCode
+-------------------------------------+
| xxxx1111 yyyyyyyy yyyyyyyy yyyyyyyy |
+-------------------------------------+
#f; tab
<xxxx=>cond> 		code condition.
<yyy...yyy=>SWI> 	opérande.
  DATA<  Echange de données (SWP)
#wrap off; fCode
+-------------------------------------+
| xxxx0001 0B00nnnn dddd0000 1001mmmm | <SWP>
+-------------------------------------+
#f; tab
<xxxx=>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
<xxxx=>cond> 	code condition.
   DATAQ  LDC
#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
   DATA6  LDM
#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, <shift> #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, <shift> #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
  DATA  MLA
#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 (<m=>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
   DATA3  UMLAL 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 <MVN>
appliquée au complément à 1 de la constante. Si cette seconde tentative
échoue aussi, il se produit une erreur.
#Indent
   DATAZ  MRC
#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
  DATAS  MRS
#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 (<m=>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 <MOV>
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, <shift> #constante
 Reg, <shift> 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 inférieur à B
2	A\<=B		A inférieur ou égal à B
2	A/=B		A différent de 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
   DATAr  Program 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	<Mode>
3	M3	<Mode>
2	M2	<Mode>
1	M1	<Mode>
0	M0	<Mode>
#Indent
  DATAw  R15
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: <comp.sys.arm=>#url news:comp.sys.arm>
 SA-110 Microprocessor Instruction Timing (juin 1997)
 ARM10 Thumb Family (ARM Product Overview)
 Site web d'ARM: <http://www.arm.com/=>#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
 DATA3  RSC
#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$h   h   €Ò  Gýÿÿ5ª¬™          branch   Ô  Gýÿÿ¾™4         pc  ÔÕ  GýÿÿsÃ¾™³         Timing  DATA   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.
DATA4  Instructions 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
<Instructions ayant le PC comme destination=>SA-110_pc>
 DATAm  SBC
#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 <ADC>
appliquée au complément à 1 de la constante. Si cette seconde tentative
échoue aussi, il se produit une erreur.
#Indent
   DATAx  Shift
#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).
DATAV  STC
#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
 DATAD  STR
#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, <shift> #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, <shift> #nombre 	Rn 				Post-incrémenté	STR/STRB
L'expression doit s'évaluer en une valeur comprise entre -4095 to +4095.
#Indent
DATAa  SUB
#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 <ADD>
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
DATAu  Noms 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 (|).
   DATA  TEQ
#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
 DATA   Temps 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 + <m=>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.
#
 <m=>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
DATA  TST
#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 '@' 	<Compteur ordinal d'enregistrement=>dir_storalloc> courant.
\{TRUE\} 	Constante logique <TRUE=>Constants>.
\{FALSE\} 	Constante logique <FALSE=>Constants>.
\{OPT\} 	<Options de listing=>dir_list> courantes.
\{CONFIG\} 	Taille du PC (32 ou 26).
