| 1 | @c Copyright 1996, 1997, 1998, 1999, 2000, 2001 | 
|---|
| 2 | @c Free Software Foundation, Inc. | 
|---|
| 3 | @c This is part of the GAS manual. | 
|---|
| 4 | @c For copying conditions, see the file as.texinfo. | 
|---|
| 5 |  | 
|---|
| 6 | @ifset GENERIC | 
|---|
| 7 | @page | 
|---|
| 8 | @node ARM-Dependent | 
|---|
| 9 | @chapter ARM Dependent Features | 
|---|
| 10 | @end ifset | 
|---|
| 11 |  | 
|---|
| 12 | @ifclear GENERIC | 
|---|
| 13 | @node Machine Dependencies | 
|---|
| 14 | @chapter ARM Dependent Features | 
|---|
| 15 | @end ifclear | 
|---|
| 16 |  | 
|---|
| 17 | @cindex ARM support | 
|---|
| 18 | @cindex Thumb support | 
|---|
| 19 | @menu | 
|---|
| 20 | * ARM Options::              Options | 
|---|
| 21 | * ARM Syntax::               Syntax | 
|---|
| 22 | * ARM Floating Point::       Floating Point | 
|---|
| 23 | * ARM Directives::           ARM Machine Directives | 
|---|
| 24 | * ARM Opcodes::              Opcodes | 
|---|
| 25 | @end menu | 
|---|
| 26 |  | 
|---|
| 27 | @node ARM Options | 
|---|
| 28 | @section Options | 
|---|
| 29 | @cindex ARM options (none) | 
|---|
| 30 | @cindex options for ARM (none) | 
|---|
| 31 |  | 
|---|
| 32 | @table @code | 
|---|
| 33 |  | 
|---|
| 34 | @cindex @code{-mcpu=} command line option, ARM | 
|---|
| 35 | @item -mcpu=@var{processor}[+@var{extension}@dots{}] | 
|---|
| 36 | This option specifies the target processor.  The assembler will issue an | 
|---|
| 37 | error message if an attempt is made to assemble an instruction which | 
|---|
| 38 | will not execute on the target processor.  The following processor names are | 
|---|
| 39 | recognized: | 
|---|
| 40 | @code{arm1}, | 
|---|
| 41 | @code{arm2}, | 
|---|
| 42 | @code{arm250}, | 
|---|
| 43 | @code{arm3}, | 
|---|
| 44 | @code{arm6}, | 
|---|
| 45 | @code{arm60}, | 
|---|
| 46 | @code{arm600}, | 
|---|
| 47 | @code{arm610}, | 
|---|
| 48 | @code{arm620}, | 
|---|
| 49 | @code{arm7}, | 
|---|
| 50 | @code{arm7m}, | 
|---|
| 51 | @code{arm7d}, | 
|---|
| 52 | @code{arm7dm}, | 
|---|
| 53 | @code{arm7di}, | 
|---|
| 54 | @code{arm7dmi}, | 
|---|
| 55 | @code{arm70}, | 
|---|
| 56 | @code{arm700}, | 
|---|
| 57 | @code{arm700i}, | 
|---|
| 58 | @code{arm710}, | 
|---|
| 59 | @code{arm710t}, | 
|---|
| 60 | @code{arm720}, | 
|---|
| 61 | @code{arm720t}, | 
|---|
| 62 | @code{arm740t}, | 
|---|
| 63 | @code{arm710c}, | 
|---|
| 64 | @code{arm7100}, | 
|---|
| 65 | @code{arm7500}, | 
|---|
| 66 | @code{arm7500fe}, | 
|---|
| 67 | @code{arm7t}, | 
|---|
| 68 | @code{arm7tdmi}, | 
|---|
| 69 | @code{arm8}, | 
|---|
| 70 | @code{arm810}, | 
|---|
| 71 | @code{strongarm}, | 
|---|
| 72 | @code{strongarm1}, | 
|---|
| 73 | @code{strongarm110}, | 
|---|
| 74 | @code{strongarm1100}, | 
|---|
| 75 | @code{strongarm1110}, | 
|---|
| 76 | @code{arm9}, | 
|---|
| 77 | @code{arm920}, | 
|---|
| 78 | @code{arm920t}, | 
|---|
| 79 | @code{arm922t}, | 
|---|
| 80 | @code{arm940t}, | 
|---|
| 81 | @code{arm9tdmi}, | 
|---|
| 82 | @code{arm9e}, | 
|---|
| 83 | @code{arm946e-r0}, | 
|---|
| 84 | @code{arm946e}, | 
|---|
| 85 | @code{arm966e-r0}, | 
|---|
| 86 | @code{arm966e}, | 
|---|
| 87 | @code{arm10t}, | 
|---|
| 88 | @code{arm10e}, | 
|---|
| 89 | @code{arm1020}, | 
|---|
| 90 | @code{arm1020t}, | 
|---|
| 91 | @code{arm1020e}, | 
|---|
| 92 | @code{ep9312} (ARM920 with Cirrus Maverick coprocessor), | 
|---|
| 93 | @code{i80200} (Intel XScale processor) | 
|---|
| 94 | @code{iwmmxt} (Intel(r) XScale processor with Wireless MMX(tm) technology coprocessor) | 
|---|
| 95 | and | 
|---|
| 96 | @code{xscale}. | 
|---|
| 97 | The special name @code{all} may be used to allow the | 
|---|
| 98 | assembler to accept instructions valid for any ARM processor. | 
|---|
| 99 |  | 
|---|
| 100 | In addition to the basic instruction set, the assembler can be told to | 
|---|
| 101 | accept various extension mnemonics that extend the processor using the | 
|---|
| 102 | co-processor instruction space.  For example, @code{-mcpu=arm920+maverick} | 
|---|
| 103 | is equivalent to specifying @code{-mcpu=ep9312}.  The following extensions | 
|---|
| 104 | are currently supported: | 
|---|
| 105 | @code{+maverick} | 
|---|
| 106 | @code{+iwmmxt} | 
|---|
| 107 | and | 
|---|
| 108 | @code{+xscale}. | 
|---|
| 109 |  | 
|---|
| 110 | @cindex @code{-march=} command line option, ARM | 
|---|
| 111 | @item -march=@var{architecture}[+@var{extension}@dots{}] | 
|---|
| 112 | This option specifies the target architecture.  The assembler will issue | 
|---|
| 113 | an error message if an attempt is made to assemble an instruction which | 
|---|
| 114 | will not execute on the target architecture.  The following architecture | 
|---|
| 115 | names are recognized: | 
|---|
| 116 | @code{armv1}, | 
|---|
| 117 | @code{armv2}, | 
|---|
| 118 | @code{armv2a}, | 
|---|
| 119 | @code{armv2s}, | 
|---|
| 120 | @code{armv3}, | 
|---|
| 121 | @code{armv3m}, | 
|---|
| 122 | @code{armv4}, | 
|---|
| 123 | @code{armv4xm}, | 
|---|
| 124 | @code{armv4t}, | 
|---|
| 125 | @code{armv4txm}, | 
|---|
| 126 | @code{armv5}, | 
|---|
| 127 | @code{armv5t}, | 
|---|
| 128 | @code{armv5txm}, | 
|---|
| 129 | @code{armv5te}, | 
|---|
| 130 | @code{armv5texp} | 
|---|
| 131 | @code{iwmmxt} | 
|---|
| 132 | and | 
|---|
| 133 | @code{xscale}. | 
|---|
| 134 | If both @code{-mcpu} and | 
|---|
| 135 | @code{-march} are specified, the assembler will use | 
|---|
| 136 | the setting for @code{-mcpu}. | 
|---|
| 137 |  | 
|---|
| 138 | The architecture option can be extended with the same instruction set | 
|---|
| 139 | extension options as the @code{-mcpu} option. | 
|---|
| 140 |  | 
|---|
| 141 | @cindex @code{-mfpu=} command line option, ARM | 
|---|
| 142 | @item -mfpu=@var{floating-point-format} | 
|---|
| 143 |  | 
|---|
| 144 | This option specifies the floating point format to assemble for.  The | 
|---|
| 145 | assembler will issue an error message if an attempt is made to assemble | 
|---|
| 146 | an instruction which will not execute on the target floating point unit. | 
|---|
| 147 | The following format options are recognized: | 
|---|
| 148 | @code{softfpa}, | 
|---|
| 149 | @code{fpe}, | 
|---|
| 150 | @code{fpe2}, | 
|---|
| 151 | @code{fpe3}, | 
|---|
| 152 | @code{fpa}, | 
|---|
| 153 | @code{fpa10}, | 
|---|
| 154 | @code{fpa11}, | 
|---|
| 155 | @code{arm7500fe}, | 
|---|
| 156 | @code{softvfp}, | 
|---|
| 157 | @code{softvfp+vfp}, | 
|---|
| 158 | @code{vfp}, | 
|---|
| 159 | @code{vfp10}, | 
|---|
| 160 | @code{vfp10-r0}, | 
|---|
| 161 | @code{vfp9}, | 
|---|
| 162 | @code{vfpxd}, | 
|---|
| 163 | @code{arm1020t} | 
|---|
| 164 | and | 
|---|
| 165 | @code{arm1020e}. | 
|---|
| 166 |  | 
|---|
| 167 | In addition to determining which instructions are assembled, this option | 
|---|
| 168 | also affects the way in which the @code{.double} assembler directive behaves | 
|---|
| 169 | when assembling little-endian code. | 
|---|
| 170 |  | 
|---|
| 171 | The default is dependent on the processor selected.  For Architecture 5 or | 
|---|
| 172 | later, the default is to assembler for VFP instructions; for earlier | 
|---|
| 173 | architectures the default is to assemble for FPA instructions. | 
|---|
| 174 |  | 
|---|
| 175 | @cindex @code{-mthumb} command line option, ARM | 
|---|
| 176 | @item -mthumb | 
|---|
| 177 | This option specifies that the assembler should start assembling Thumb | 
|---|
| 178 | instructions; that is, it should behave as though the file starts with a | 
|---|
| 179 | @code{.code 16} directive. | 
|---|
| 180 |  | 
|---|
| 181 | @cindex @code{-mthumb-interwork} command line option, ARM | 
|---|
| 182 | @item -mthumb-interwork | 
|---|
| 183 | This option specifies that the output generated by the assembler should | 
|---|
| 184 | be marked as supporting interworking. | 
|---|
| 185 |  | 
|---|
| 186 | @cindex @code{-mapcs} command line option, ARM | 
|---|
| 187 | @item -mapcs @code{[26|32]} | 
|---|
| 188 | This option specifies that the output generated by the assembler should | 
|---|
| 189 | be marked as supporting the indicated version of the Arm Procedure. | 
|---|
| 190 | Calling Standard. | 
|---|
| 191 |  | 
|---|
| 192 | @cindex @code{-matpcs} command line option, ARM | 
|---|
| 193 | @item -matpcs | 
|---|
| 194 | This option specifies that the output generated by the assembler should | 
|---|
| 195 | be marked as supporting the Arm/Thumb Procedure Calling Standard.  If | 
|---|
| 196 | enabled this option will cause the assembler to create an empty | 
|---|
| 197 | debugging section in the object file called .arm.atpcs.  Debuggers can | 
|---|
| 198 | use this to determine the ABI being used by. | 
|---|
| 199 |  | 
|---|
| 200 | @cindex @code{-mapcs-float} command line option, ARM | 
|---|
| 201 | @item -mapcs-float | 
|---|
| 202 | This indicates the the floating point variant of the APCS should be | 
|---|
| 203 | used.  In this variant floating point arguments are passed in FP | 
|---|
| 204 | registers rather than integer registers. | 
|---|
| 205 |  | 
|---|
| 206 | @cindex @code{-mapcs-reentrant} command line option, ARM | 
|---|
| 207 | @item -mapcs-reentrant | 
|---|
| 208 | This indicates that the reentrant variant of the APCS should be used. | 
|---|
| 209 | This variant supports position independent code. | 
|---|
| 210 |  | 
|---|
| 211 | @cindex @code{-EB} command line option, ARM | 
|---|
| 212 | @item -EB | 
|---|
| 213 | This option specifies that the output generated by the assembler should | 
|---|
| 214 | be marked as being encoded for a big-endian processor. | 
|---|
| 215 |  | 
|---|
| 216 | @cindex @code{-EL} command line option, ARM | 
|---|
| 217 | @item -EL | 
|---|
| 218 | This option specifies that the output generated by the assembler should | 
|---|
| 219 | be marked as being encoded for a little-endian processor. | 
|---|
| 220 |  | 
|---|
| 221 | @cindex @code{-k} command line option, ARM | 
|---|
| 222 | @cindex PIC code generation for ARM | 
|---|
| 223 | @item -k | 
|---|
| 224 | This option specifies that the output of the assembler should be marked | 
|---|
| 225 | as position-independent code (PIC). | 
|---|
| 226 |  | 
|---|
| 227 | @cindex @code{-moabi} command line option, ARM | 
|---|
| 228 | @item -moabi | 
|---|
| 229 | This indicates that the code should be assembled using the old ARM ELF | 
|---|
| 230 | conventions, based on a beta release release of the ARM-ELF | 
|---|
| 231 | specifications, rather than the default conventions which are based on | 
|---|
| 232 | the final release of the ARM-ELF specifications. | 
|---|
| 233 |  | 
|---|
| 234 | @end table | 
|---|
| 235 |  | 
|---|
| 236 |  | 
|---|
| 237 | @node ARM Syntax | 
|---|
| 238 | @section Syntax | 
|---|
| 239 | @menu | 
|---|
| 240 | * ARM-Chars::                Special Characters | 
|---|
| 241 | * ARM-Regs::                 Register Names | 
|---|
| 242 | @end menu | 
|---|
| 243 |  | 
|---|
| 244 | @node ARM-Chars | 
|---|
| 245 | @subsection Special Characters | 
|---|
| 246 |  | 
|---|
| 247 | @cindex line comment character, ARM | 
|---|
| 248 | @cindex ARM line comment character | 
|---|
| 249 | The presence of a @samp{@@} on a line indicates the start of a comment | 
|---|
| 250 | that extends to the end of the current line.  If a @samp{#} appears as | 
|---|
| 251 | the first character of a line, the whole line is treated as a comment. | 
|---|
| 252 |  | 
|---|
| 253 | @cindex line separator, ARM | 
|---|
| 254 | @cindex statement separator, ARM | 
|---|
| 255 | @cindex ARM line separator | 
|---|
| 256 | The @samp{;} character can be used instead of a newline to separate | 
|---|
| 257 | statements. | 
|---|
| 258 |  | 
|---|
| 259 | @cindex immediate character, ARM | 
|---|
| 260 | @cindex ARM immediate character | 
|---|
| 261 | Either @samp{#} or @samp{$} can be used to indicate immediate operands. | 
|---|
| 262 |  | 
|---|
| 263 | @cindex identifiers, ARM | 
|---|
| 264 | @cindex ARM identifiers | 
|---|
| 265 | *TODO* Explain about /data modifier on symbols. | 
|---|
| 266 |  | 
|---|
| 267 | @node ARM-Regs | 
|---|
| 268 | @subsection Register Names | 
|---|
| 269 |  | 
|---|
| 270 | @cindex ARM register names | 
|---|
| 271 | @cindex register names, ARM | 
|---|
| 272 | *TODO* Explain about ARM register naming, and the predefined names. | 
|---|
| 273 |  | 
|---|
| 274 | @node ARM Floating Point | 
|---|
| 275 | @section Floating Point | 
|---|
| 276 |  | 
|---|
| 277 | @cindex floating point, ARM (@sc{ieee}) | 
|---|
| 278 | @cindex ARM floating point (@sc{ieee}) | 
|---|
| 279 | The ARM family uses @sc{ieee} floating-point numbers. | 
|---|
| 280 |  | 
|---|
| 281 |  | 
|---|
| 282 |  | 
|---|
| 283 | @node ARM Directives | 
|---|
| 284 | @section ARM Machine Directives | 
|---|
| 285 |  | 
|---|
| 286 | @cindex machine directives, ARM | 
|---|
| 287 | @cindex ARM machine directives | 
|---|
| 288 | @table @code | 
|---|
| 289 |  | 
|---|
| 290 | @cindex @code{align} directive, ARM | 
|---|
| 291 | @item .align @var{expression} [, @var{expression}] | 
|---|
| 292 | This is the generic @var{.align} directive.  For the ARM however if the | 
|---|
| 293 | first argument is zero (ie no alignment is needed) the assembler will | 
|---|
| 294 | behave as if the argument had been 2 (ie pad to the next four byte | 
|---|
| 295 | boundary).  This is for compatibility with ARM's own assembler. | 
|---|
| 296 |  | 
|---|
| 297 | @cindex @code{req} directive, ARM | 
|---|
| 298 | @item @var{name} .req @var{register name} | 
|---|
| 299 | This creates an alias for @var{register name} called @var{name}.  For | 
|---|
| 300 | example: | 
|---|
| 301 |  | 
|---|
| 302 | @smallexample | 
|---|
| 303 | foo .req r0 | 
|---|
| 304 | @end smallexample | 
|---|
| 305 |  | 
|---|
| 306 | @cindex @code{code} directive, ARM | 
|---|
| 307 | @item .code @code{[16|32]} | 
|---|
| 308 | This directive selects the instruction set being generated. The value 16 | 
|---|
| 309 | selects Thumb, with the value 32 selecting ARM. | 
|---|
| 310 |  | 
|---|
| 311 | @cindex @code{thumb} directive, ARM | 
|---|
| 312 | @item .thumb | 
|---|
| 313 | This performs the same action as @var{.code 16}. | 
|---|
| 314 |  | 
|---|
| 315 | @cindex @code{arm} directive, ARM | 
|---|
| 316 | @item .arm | 
|---|
| 317 | This performs the same action as @var{.code 32}. | 
|---|
| 318 |  | 
|---|
| 319 | @cindex @code{force_thumb} directive, ARM | 
|---|
| 320 | @item .force_thumb | 
|---|
| 321 | This directive forces the selection of Thumb instructions, even if the | 
|---|
| 322 | target processor does not support those instructions | 
|---|
| 323 |  | 
|---|
| 324 | @cindex @code{thumb_func} directive, ARM | 
|---|
| 325 | @item .thumb_func | 
|---|
| 326 | This directive specifies that the following symbol is the name of a | 
|---|
| 327 | Thumb encoded function.  This information is necessary in order to allow | 
|---|
| 328 | the assembler and linker to generate correct code for interworking | 
|---|
| 329 | between Arm and Thumb instructions and should be used even if | 
|---|
| 330 | interworking is not going to be performed.  The presence of this | 
|---|
| 331 | directive also implies @code{.thumb} | 
|---|
| 332 |  | 
|---|
| 333 | @cindex @code{thumb_set} directive, ARM | 
|---|
| 334 | @item .thumb_set | 
|---|
| 335 | This performs the equivalent of a @code{.set} directive in that it | 
|---|
| 336 | creates a symbol which is an alias for another symbol (possibly not yet | 
|---|
| 337 | defined).  This directive also has the added property in that it marks | 
|---|
| 338 | the aliased symbol as being a thumb function entry point, in the same | 
|---|
| 339 | way that the @code{.thumb_func} directive does. | 
|---|
| 340 |  | 
|---|
| 341 | @cindex @code{.ltorg} directive, ARM | 
|---|
| 342 | @item .ltorg | 
|---|
| 343 | This directive causes the current contents of the literal pool to be | 
|---|
| 344 | dumped into the current section (which is assumed to be the .text | 
|---|
| 345 | section) at the current location (aligned to a word boundary). | 
|---|
| 346 | @code{GAS} maintains a separate literal pool for each section and each | 
|---|
| 347 | sub-section.  The @code{.ltorg} directive will only affect the literal | 
|---|
| 348 | pool of the current section and sub-section.  At the end of assembly | 
|---|
| 349 | all remaining, un-empty literal pools will automatically be dumped. | 
|---|
| 350 |  | 
|---|
| 351 | Note - older versions of @code{GAS} would dump the current literal | 
|---|
| 352 | pool any time a section change occurred.  This is no longer done, since | 
|---|
| 353 | it prevents accurate control of the placement of literal pools. | 
|---|
| 354 |  | 
|---|
| 355 | @cindex @code{.pool} directive, ARM | 
|---|
| 356 | @item .pool | 
|---|
| 357 | This is a synonym for .ltorg. | 
|---|
| 358 |  | 
|---|
| 359 | @end table | 
|---|
| 360 |  | 
|---|
| 361 | @node ARM Opcodes | 
|---|
| 362 | @section Opcodes | 
|---|
| 363 |  | 
|---|
| 364 | @cindex ARM opcodes | 
|---|
| 365 | @cindex opcodes for ARM | 
|---|
| 366 | @code{@value{AS}} implements all the standard ARM opcodes.  It also | 
|---|
| 367 | implements several pseudo opcodes, including several synthetic load | 
|---|
| 368 | instructions. | 
|---|
| 369 |  | 
|---|
| 370 | @table @code | 
|---|
| 371 |  | 
|---|
| 372 | @cindex @code{NOP} pseudo op, ARM | 
|---|
| 373 | @item NOP | 
|---|
| 374 | @smallexample | 
|---|
| 375 | nop | 
|---|
| 376 | @end smallexample | 
|---|
| 377 |  | 
|---|
| 378 | This pseudo op will always evaluate to a legal ARM instruction that does | 
|---|
| 379 | nothing.  Currently it will evaluate to MOV r0, r0. | 
|---|
| 380 |  | 
|---|
| 381 | @cindex @code{LDR reg,=<label>} pseudo op, ARM | 
|---|
| 382 | @item LDR | 
|---|
| 383 | @smallexample | 
|---|
| 384 | ldr <register> , = <expression> | 
|---|
| 385 | @end smallexample | 
|---|
| 386 |  | 
|---|
| 387 | If expression evaluates to a numeric constant then a MOV or MVN | 
|---|
| 388 | instruction will be used in place of the LDR instruction, if the | 
|---|
| 389 | constant can be generated by either of these instructions.  Otherwise | 
|---|
| 390 | the constant will be placed into the nearest literal pool (if it not | 
|---|
| 391 | already there) and a PC relative LDR instruction will be generated. | 
|---|
| 392 |  | 
|---|
| 393 | @cindex @code{ADR reg,<label>} pseudo op, ARM | 
|---|
| 394 | @item ADR | 
|---|
| 395 | @smallexample | 
|---|
| 396 | adr <register> <label> | 
|---|
| 397 | @end smallexample | 
|---|
| 398 |  | 
|---|
| 399 | This instruction will load the address of @var{label} into the indicated | 
|---|
| 400 | register.  The instruction will evaluate to a PC relative ADD or SUB | 
|---|
| 401 | instruction depending upon where the label is located.  If the label is | 
|---|
| 402 | out of range, or if it is not defined in the same file (and section) as | 
|---|
| 403 | the ADR instruction, then an error will be generated.  This instruction | 
|---|
| 404 | will not make use of the literal pool. | 
|---|
| 405 |  | 
|---|
| 406 | @cindex @code{ADRL reg,<label>} pseudo op, ARM | 
|---|
| 407 | @item ADRL | 
|---|
| 408 | @smallexample | 
|---|
| 409 | adrl <register> <label> | 
|---|
| 410 | @end smallexample | 
|---|
| 411 |  | 
|---|
| 412 | This instruction will load the address of @var{label} into the indicated | 
|---|
| 413 | register.  The instruction will evaluate to one or two PC relative ADD | 
|---|
| 414 | or SUB instructions depending upon where the label is located.  If a | 
|---|
| 415 | second instruction is not needed a NOP instruction will be generated in | 
|---|
| 416 | its place, so that this instruction is always 8 bytes long. | 
|---|
| 417 |  | 
|---|
| 418 | If the label is out of range, or if it is not defined in the same file | 
|---|
| 419 | (and section) as the ADRL instruction, then an error will be generated. | 
|---|
| 420 | This instruction will not make use of the literal pool. | 
|---|
| 421 |  | 
|---|
| 422 | @end table | 
|---|
| 423 |  | 
|---|
| 424 | For information on the ARM or Thumb instruction sets, see @cite{ARM | 
|---|
| 425 | Software Development Toolkit Reference Manual}, Advanced RISC Machines | 
|---|
| 426 | Ltd. | 
|---|
| 427 |  | 
|---|