Improve handling of REPT pseudo op with a negative count.
[deliverable/binutils-gdb.git] / gas / doc / c-arm.texi
CommitLineData
2571583a 1@c Copyright (C) 1996-2017 Free Software Foundation, Inc.
252b5132
RH
2@c This is part of the GAS manual.
3@c For copying conditions, see the file as.texinfo.
4
5@ifset GENERIC
6@page
7@node ARM-Dependent
8@chapter ARM Dependent Features
9@end ifset
10
11@ifclear GENERIC
12@node Machine Dependencies
13@chapter ARM Dependent Features
14@end ifclear
15
16@cindex ARM support
17@cindex Thumb support
18@menu
19* ARM Options:: Options
20* ARM Syntax:: Syntax
21* ARM Floating Point:: Floating Point
22* ARM Directives:: ARM Machine Directives
23* ARM Opcodes:: Opcodes
6057a28f 24* ARM Mapping Symbols:: Mapping Symbols
7da4f750 25* ARM Unwinding Tutorial:: Unwinding
252b5132
RH
26@end menu
27
28@node ARM Options
29@section Options
30@cindex ARM options (none)
31@cindex options for ARM (none)
adcf07e6 32
252b5132 33@table @code
adcf07e6 34
03b1477f 35@cindex @code{-mcpu=} command line option, ARM
92081f48 36@item -mcpu=@var{processor}[+@var{extension}@dots{}]
252b5132
RH
37This option specifies the target processor. The assembler will issue an
38error message if an attempt is made to assemble an instruction which
03b1477f 39will not execute on the target processor. The following processor names are
34bca508 40recognized:
03b1477f
RE
41@code{arm1},
42@code{arm2},
43@code{arm250},
44@code{arm3},
45@code{arm6},
46@code{arm60},
47@code{arm600},
48@code{arm610},
49@code{arm620},
50@code{arm7},
51@code{arm7m},
52@code{arm7d},
53@code{arm7dm},
54@code{arm7di},
55@code{arm7dmi},
56@code{arm70},
57@code{arm700},
58@code{arm700i},
59@code{arm710},
60@code{arm710t},
61@code{arm720},
62@code{arm720t},
63@code{arm740t},
64@code{arm710c},
65@code{arm7100},
66@code{arm7500},
67@code{arm7500fe},
68@code{arm7t},
69@code{arm7tdmi},
1ff4677c 70@code{arm7tdmi-s},
03b1477f
RE
71@code{arm8},
72@code{arm810},
73@code{strongarm},
74@code{strongarm1},
75@code{strongarm110},
76@code{strongarm1100},
77@code{strongarm1110},
78@code{arm9},
79@code{arm920},
80@code{arm920t},
81@code{arm922t},
82@code{arm940t},
83@code{arm9tdmi},
7fac0536
NC
84@code{fa526} (Faraday FA526 processor),
85@code{fa626} (Faraday FA626 processor),
03b1477f 86@code{arm9e},
7de9afa2 87@code{arm926e},
1ff4677c 88@code{arm926ej-s},
03b1477f
RE
89@code{arm946e-r0},
90@code{arm946e},
db8ac8f9 91@code{arm946e-s},
03b1477f
RE
92@code{arm966e-r0},
93@code{arm966e},
db8ac8f9
PB
94@code{arm966e-s},
95@code{arm968e-s},
03b1477f 96@code{arm10t},
db8ac8f9 97@code{arm10tdmi},
03b1477f
RE
98@code{arm10e},
99@code{arm1020},
100@code{arm1020t},
7de9afa2 101@code{arm1020e},
db8ac8f9 102@code{arm1022e},
1ff4677c 103@code{arm1026ej-s},
4a58c4bd
NC
104@code{fa606te} (Faraday FA606TE processor),
105@code{fa616te} (Faraday FA616TE processor),
7fac0536 106@code{fa626te} (Faraday FA626TE processor),
4a58c4bd 107@code{fmp626} (Faraday FMP626 processor),
7fac0536 108@code{fa726te} (Faraday FA726TE processor),
1ff4677c
RE
109@code{arm1136j-s},
110@code{arm1136jf-s},
db8ac8f9
PB
111@code{arm1156t2-s},
112@code{arm1156t2f-s},
0dd132b6
NC
113@code{arm1176jz-s},
114@code{arm1176jzf-s},
115@code{mpcore},
116@code{mpcorenovfp},
b38f9f31 117@code{cortex-a5},
c90460e4 118@code{cortex-a7},
62b3e311 119@code{cortex-a8},
15290f0a 120@code{cortex-a9},
dbb1f804 121@code{cortex-a15},
ed5491b9 122@code{cortex-a17},
6735952f 123@code{cortex-a32},
43cdc0a8 124@code{cortex-a35},
4469186b 125@code{cortex-a53},
15a7695f 126@code{cortex-a55},
4469186b
KT
127@code{cortex-a57},
128@code{cortex-a72},
362a3eba 129@code{cortex-a73},
15a7695f 130@code{cortex-a75},
62b3e311 131@code{cortex-r4},
307c948d 132@code{cortex-r4f},
70a8bc5b 133@code{cortex-r5},
134@code{cortex-r7},
5f474010 135@code{cortex-r8},
0cda1e19 136@code{cortex-r52},
b19ea8d2 137@code{cortex-m33},
ce1b0a45 138@code{cortex-m23},
a715796b 139@code{cortex-m7},
7ef07ba0 140@code{cortex-m4},
62b3e311 141@code{cortex-m3},
5b19eaba
NC
142@code{cortex-m1},
143@code{cortex-m0},
ce32bd10 144@code{cortex-m0plus},
246496bb 145@code{exynos-m1},
ea0d6bb9
PT
146@code{marvell-pj4},
147@code{marvell-whitney},
148@code{xgene1},
149@code{xgene2},
03b1477f
RE
150@code{ep9312} (ARM920 with Cirrus Maverick coprocessor),
151@code{i80200} (Intel XScale processor)
e16bb312 152@code{iwmmxt} (Intel(r) XScale processor with Wireless MMX(tm) technology coprocessor)
03b1477f 153and
34bca508 154@code{xscale}.
03b1477f
RE
155The special name @code{all} may be used to allow the
156assembler to accept instructions valid for any ARM processor.
157
34bca508
L
158In addition to the basic instruction set, the assembler can be told to
159accept various extension mnemonics that extend the processor using the
03b1477f 160co-processor instruction space. For example, @code{-mcpu=arm920+maverick}
34bca508 161is equivalent to specifying @code{-mcpu=ep9312}.
69133863 162
34bca508 163Multiple extensions may be specified, separated by a @code{+}. The
69133863
MGD
164extensions should be specified in ascending alphabetical order.
165
34bca508 166Some extensions may be restricted to particular architectures; this is
60e5ef9f
MGD
167documented in the list of extensions below.
168
34bca508
L
169Extension mnemonics may also be removed from those the assembler accepts.
170This is done be prepending @code{no} to the option that adds the extension.
171Extensions that are removed should be listed after all extensions which have
172been added, again in ascending alphabetical order. For example,
69133863
MGD
173@code{-mcpu=ep9312+nomaverick} is equivalent to specifying @code{-mcpu=arm920}.
174
175
eea54501 176The following extensions are currently supported:
ea0d6bb9 177@code{crc}
bca38921 178@code{crypto} (Cryptography Extensions for v8-A architecture, implies @code{fp+simd}),
c604a79a 179@code{dotprod} (Dot Product Extensions for v8.2-A architecture, implies @code{fp+simd}),
bca38921
MGD
180@code{fp} (Floating Point Extensions for v8-A architecture),
181@code{idiv} (Integer Divide Extensions for v7-A and v7-R architectures),
69133863
MGD
182@code{iwmmxt},
183@code{iwmmxt2},
ea0d6bb9 184@code{xscale},
69133863 185@code{maverick},
ea0d6bb9
PT
186@code{mp} (Multiprocessing Extensions for v7-A and v7-R
187architectures),
b2a5fbdc 188@code{os} (Operating System for v6M architecture),
f4c65163 189@code{sec} (Security Extensions for v6K and v7-A architectures),
bca38921 190@code{simd} (Advanced SIMD Extensions for v8-A architecture, implies @code{fp}),
34bca508 191@code{virt} (Virtualization Extensions for v7-A architecture, implies
90ec0d68 192@code{idiv}),
33eaf5de 193@code{pan} (Privileged Access Never Extensions for v8-A architecture),
4d1464f2
MW
194@code{ras} (Reliability, Availability and Serviceability extensions
195for v8-A architecture),
d6b4b13e
MW
196@code{rdma} (ARMv8.1 Advanced SIMD extensions for v8-A architecture, implies
197@code{simd})
03b1477f 198and
69133863 199@code{xscale}.
03b1477f
RE
200
201@cindex @code{-march=} command line option, ARM
92081f48 202@item -march=@var{architecture}[+@var{extension}@dots{}]
252b5132
RH
203This option specifies the target architecture. The assembler will issue
204an error message if an attempt is made to assemble an instruction which
34bca508
L
205will not execute on the target architecture. The following architecture
206names are recognized:
03b1477f
RE
207@code{armv1},
208@code{armv2},
209@code{armv2a},
210@code{armv2s},
211@code{armv3},
212@code{armv3m},
213@code{armv4},
214@code{armv4xm},
215@code{armv4t},
216@code{armv4txm},
217@code{armv5},
218@code{armv5t},
219@code{armv5txm},
220@code{armv5te},
09d92015 221@code{armv5texp},
c5f98204 222@code{armv6},
1ddd7f43 223@code{armv6j},
0dd132b6
NC
224@code{armv6k},
225@code{armv6z},
f33026a9 226@code{armv6kz},
b2a5fbdc
MGD
227@code{armv6-m},
228@code{armv6s-m},
62b3e311 229@code{armv7},
c450d570 230@code{armv7-a},
c9fb6e58 231@code{armv7ve},
c450d570
PB
232@code{armv7-r},
233@code{armv7-m},
9e3c6df6 234@code{armv7e-m},
bca38921 235@code{armv8-a},
a5932920 236@code{armv8.1-a},
56a1b672 237@code{armv8.2-a},
a12fd8e1 238@code{armv8.3-a},
ced40572 239@code{armv8-r},
e16bb312 240@code{iwmmxt}
ea0d6bb9 241@code{iwmmxt2}
03b1477f
RE
242and
243@code{xscale}.
244If both @code{-mcpu} and
245@code{-march} are specified, the assembler will use
246the setting for @code{-mcpu}.
247
248The architecture option can be extended with the same instruction set
249extension options as the @code{-mcpu} option.
250
251@cindex @code{-mfpu=} command line option, ARM
252@item -mfpu=@var{floating-point-format}
253
254This option specifies the floating point format to assemble for. The
255assembler will issue an error message if an attempt is made to assemble
34bca508 256an instruction which will not execute on the target floating point unit.
03b1477f
RE
257The following format options are recognized:
258@code{softfpa},
259@code{fpe},
bc89618b
RE
260@code{fpe2},
261@code{fpe3},
03b1477f
RE
262@code{fpa},
263@code{fpa10},
264@code{fpa11},
265@code{arm7500fe},
266@code{softvfp},
267@code{softvfp+vfp},
268@code{vfp},
269@code{vfp10},
270@code{vfp10-r0},
271@code{vfp9},
272@code{vfpxd},
62f3b8c8
PB
273@code{vfpv2},
274@code{vfpv3},
275@code{vfpv3-fp16},
276@code{vfpv3-d16},
277@code{vfpv3-d16-fp16},
278@code{vfpv3xd},
279@code{vfpv3xd-d16},
280@code{vfpv4},
281@code{vfpv4-d16},
f0cd0667 282@code{fpv4-sp-d16},
a715796b
TG
283@code{fpv5-sp-d16},
284@code{fpv5-d16},
bca38921 285@code{fp-armv8},
09d92015
MM
286@code{arm1020t},
287@code{arm1020e},
b1cc4aeb 288@code{arm1136jf-s},
62f3b8c8
PB
289@code{maverick},
290@code{neon},
d5e0ba9c
RE
291@code{neon-vfpv3},
292@code{neon-fp16},
bca38921
MGD
293@code{neon-vfpv4},
294@code{neon-fp-armv8},
081e4c7d
MW
295@code{crypto-neon-fp-armv8},
296@code{neon-fp-armv8.1}
d6b4b13e 297and
081e4c7d 298@code{crypto-neon-fp-armv8.1}.
03b1477f
RE
299
300In addition to determining which instructions are assembled, this option
301also affects the way in which the @code{.double} assembler directive behaves
302when assembling little-endian code.
303
34bca508 304The default is dependent on the processor selected. For Architecture 5 or
d5e0ba9c 305later, the default is to assemble for VFP instructions; for earlier
03b1477f 306architectures the default is to assemble for FPA instructions.
adcf07e6 307
252b5132
RH
308@cindex @code{-mthumb} command line option, ARM
309@item -mthumb
03b1477f 310This option specifies that the assembler should start assembling Thumb
34bca508 311instructions; that is, it should behave as though the file starts with a
03b1477f 312@code{.code 16} directive.
adcf07e6 313
252b5132
RH
314@cindex @code{-mthumb-interwork} command line option, ARM
315@item -mthumb-interwork
316This option specifies that the output generated by the assembler should
317be marked as supporting interworking.
adcf07e6 318
52970753
NC
319@cindex @code{-mimplicit-it} command line option, ARM
320@item -mimplicit-it=never
321@itemx -mimplicit-it=always
322@itemx -mimplicit-it=arm
323@itemx -mimplicit-it=thumb
324The @code{-mimplicit-it} option controls the behavior of the assembler when
325conditional instructions are not enclosed in IT blocks.
326There are four possible behaviors.
327If @code{never} is specified, such constructs cause a warning in ARM
328code and an error in Thumb-2 code.
329If @code{always} is specified, such constructs are accepted in both
330ARM and Thumb-2 code, where the IT instruction is added implicitly.
331If @code{arm} is specified, such constructs are accepted in ARM code
332and cause an error in Thumb-2 code.
333If @code{thumb} is specified, such constructs cause a warning in ARM
334code and are accepted in Thumb-2 code. If you omit this option, the
335behavior is equivalent to @code{-mimplicit-it=arm}.
e07e6e58 336
5a5829dd
NS
337@cindex @code{-mapcs-26} command line option, ARM
338@cindex @code{-mapcs-32} command line option, ARM
339@item -mapcs-26
340@itemx -mapcs-32
341These options specify that the output generated by the assembler should
252b5132
RH
342be marked as supporting the indicated version of the Arm Procedure.
343Calling Standard.
adcf07e6 344
077b8428
NC
345@cindex @code{-matpcs} command line option, ARM
346@item -matpcs
34bca508 347This option specifies that the output generated by the assembler should
077b8428
NC
348be marked as supporting the Arm/Thumb Procedure Calling Standard. If
349enabled this option will cause the assembler to create an empty
350debugging section in the object file called .arm.atpcs. Debuggers can
351use this to determine the ABI being used by.
352
adcf07e6 353@cindex @code{-mapcs-float} command line option, ARM
252b5132 354@item -mapcs-float
1be59579 355This indicates the floating point variant of the APCS should be
252b5132 356used. In this variant floating point arguments are passed in FP
550262c4 357registers rather than integer registers.
adcf07e6
NC
358
359@cindex @code{-mapcs-reentrant} command line option, ARM
252b5132
RH
360@item -mapcs-reentrant
361This indicates that the reentrant variant of the APCS should be used.
362This variant supports position independent code.
adcf07e6 363
33a392fb
PB
364@cindex @code{-mfloat-abi=} command line option, ARM
365@item -mfloat-abi=@var{abi}
366This option specifies that the output generated by the assembler should be
367marked as using specified floating point ABI.
368The following values are recognized:
369@code{soft},
370@code{softfp}
371and
372@code{hard}.
373
d507cf36
PB
374@cindex @code{-eabi=} command line option, ARM
375@item -meabi=@var{ver}
376This option specifies which EABI version the produced object files should
377conform to.
b45619c0 378The following values are recognized:
3a4a14e9
PB
379@code{gnu},
380@code{4}
d507cf36 381and
3a4a14e9 382@code{5}.
d507cf36 383
252b5132
RH
384@cindex @code{-EB} command line option, ARM
385@item -EB
386This option specifies that the output generated by the assembler should
387be marked as being encoded for a big-endian processor.
adcf07e6 388
080bb7bb
NC
389Note: If a program is being built for a system with big-endian data
390and little-endian instructions then it should be assembled with the
391@option{-EB} option, (all of it, code and data) and then linked with
392the @option{--be8} option. This will reverse the endianness of the
393instructions back to little-endian, but leave the data as big-endian.
394
252b5132
RH
395@cindex @code{-EL} command line option, ARM
396@item -EL
397This option specifies that the output generated by the assembler should
398be marked as being encoded for a little-endian processor.
adcf07e6 399
252b5132
RH
400@cindex @code{-k} command line option, ARM
401@cindex PIC code generation for ARM
402@item -k
a349d9dd
PB
403This option specifies that the output of the assembler should be marked
404as position-independent code (PIC).
adcf07e6 405
845b51d6
PB
406@cindex @code{--fix-v4bx} command line option, ARM
407@item --fix-v4bx
408Allow @code{BX} instructions in ARMv4 code. This is intended for use with
409the linker option of the same name.
410
278df34e
NS
411@cindex @code{-mwarn-deprecated} command line option, ARM
412@item -mwarn-deprecated
413@itemx -mno-warn-deprecated
414Enable or disable warnings about using deprecated options or
415features. The default is to warn.
416
2e6976a8
DG
417@cindex @code{-mccs} command line option, ARM
418@item -mccs
419Turns on CodeComposer Studio assembly syntax compatibility mode.
420
8b2d793c
NC
421@cindex @code{-mwarn-syms} command line option, ARM
422@item -mwarn-syms
423@itemx -mno-warn-syms
424Enable or disable warnings about symbols that match the names of ARM
425instructions. The default is to warn.
426
252b5132
RH
427@end table
428
429
430@node ARM Syntax
431@section Syntax
432@menu
cab7e4d9 433* ARM-Instruction-Set:: Instruction Set
252b5132
RH
434* ARM-Chars:: Special Characters
435* ARM-Regs:: Register Names
b6895b4f 436* ARM-Relocations:: Relocations
99f1a7a7 437* ARM-Neon-Alignment:: NEON Alignment Specifiers
252b5132
RH
438@end menu
439
cab7e4d9
NC
440@node ARM-Instruction-Set
441@subsection Instruction Set Syntax
442Two slightly different syntaxes are support for ARM and THUMB
443instructions. The default, @code{divided}, uses the old style where
444ARM and THUMB instructions had their own, separate syntaxes. The new,
445@code{unified} syntax, which can be selected via the @code{.syntax}
446directive, and has the following main features:
447
9e6f3811
AS
448@itemize @bullet
449@item
cab7e4d9
NC
450Immediate operands do not require a @code{#} prefix.
451
9e6f3811 452@item
cab7e4d9
NC
453The @code{IT} instruction may appear, and if it does it is validated
454against subsequent conditional affixes. In ARM mode it does not
455generate machine code, in THUMB mode it does.
456
9e6f3811 457@item
cab7e4d9
NC
458For ARM instructions the conditional affixes always appear at the end
459of the instruction. For THUMB instructions conditional affixes can be
460used, but only inside the scope of an @code{IT} instruction.
461
9e6f3811 462@item
cab7e4d9
NC
463All of the instructions new to the V6T2 architecture (and later) are
464available. (Only a few such instructions can be written in the
465@code{divided} syntax).
466
9e6f3811 467@item
cab7e4d9
NC
468The @code{.N} and @code{.W} suffixes are recognized and honored.
469
9e6f3811 470@item
cab7e4d9
NC
471All instructions set the flags if and only if they have an @code{s}
472affix.
9e6f3811 473@end itemize
cab7e4d9 474
252b5132
RH
475@node ARM-Chars
476@subsection Special Characters
477
478@cindex line comment character, ARM
479@cindex ARM line comment character
7c31ae13
NC
480The presence of a @samp{@@} anywhere on a line indicates the start of
481a comment that extends to the end of that line.
482
483If a @samp{#} appears as the first character of a line then the whole
484line is treated as a comment, but in this case the line could also be
485a logical line number directive (@pxref{Comments}) or a preprocessor
486control command (@pxref{Preprocessing}).
550262c4
NC
487
488@cindex line separator, ARM
489@cindex statement separator, ARM
490@cindex ARM line separator
a349d9dd
PB
491The @samp{;} character can be used instead of a newline to separate
492statements.
550262c4
NC
493
494@cindex immediate character, ARM
495@cindex ARM immediate character
496Either @samp{#} or @samp{$} can be used to indicate immediate operands.
252b5132
RH
497
498@cindex identifiers, ARM
499@cindex ARM identifiers
500*TODO* Explain about /data modifier on symbols.
501
502@node ARM-Regs
503@subsection Register Names
504
505@cindex ARM register names
506@cindex register names, ARM
507*TODO* Explain about ARM register naming, and the predefined names.
508
b6895b4f
PB
509@node ARM-Relocations
510@subsection ARM relocation generation
511
512@cindex data relocations, ARM
513@cindex ARM data relocations
514Specific data relocations can be generated by putting the relocation name
515in parentheses after the symbol name. For example:
516
517@smallexample
518 .word foo(TARGET1)
519@end smallexample
520
521This will generate an @samp{R_ARM_TARGET1} relocation against the symbol
522@var{foo}.
523The following relocations are supported:
524@code{GOT},
525@code{GOTOFF},
526@code{TARGET1},
527@code{TARGET2},
528@code{SBREL},
529@code{TLSGD},
530@code{TLSLDM},
531@code{TLSLDO},
0855e32b
NS
532@code{TLSDESC},
533@code{TLSCALL},
b43420e6
NC
534@code{GOTTPOFF},
535@code{GOT_PREL}
b6895b4f
PB
536and
537@code{TPOFF}.
538
539For compatibility with older toolchains the assembler also accepts
3da1d841
NC
540@code{(PLT)} after branch targets. On legacy targets this will
541generate the deprecated @samp{R_ARM_PLT32} relocation. On EABI
542targets it will encode either the @samp{R_ARM_CALL} or
543@samp{R_ARM_JUMP24} relocation, as appropriate.
b6895b4f
PB
544
545@cindex MOVW and MOVT relocations, ARM
546Relocations for @samp{MOVW} and @samp{MOVT} instructions can be generated
547by prefixing the value with @samp{#:lower16:} and @samp{#:upper16}
b45619c0 548respectively. For example to load the 32-bit address of foo into r0:
252b5132 549
b6895b4f
PB
550@smallexample
551 MOVW r0, #:lower16:foo
552 MOVT r0, #:upper16:foo
553@end smallexample
252b5132 554
72d98d16
MG
555Relocations @samp{R_ARM_THM_ALU_ABS_G0_NC}, @samp{R_ARM_THM_ALU_ABS_G1_NC},
556@samp{R_ARM_THM_ALU_ABS_G2_NC} and @samp{R_ARM_THM_ALU_ABS_G3_NC} can be
557generated by prefixing the value with @samp{#:lower0_7:#},
558@samp{#:lower8_15:#}, @samp{#:upper0_7:#} and @samp{#:upper8_15:#}
559respectively. For example to load the 32-bit address of foo into r0:
560
561@smallexample
562 MOVS r0, #:upper8_15:#foo
563 LSLS r0, r0, #8
564 ADDS r0, #:upper0_7:#foo
565 LSLS r0, r0, #8
566 ADDS r0, #:lower8_15:#foo
567 LSLS r0, r0, #8
568 ADDS r0, #:lower0_7:#foo
569@end smallexample
570
ba724cfc
NC
571@node ARM-Neon-Alignment
572@subsection NEON Alignment Specifiers
573
574@cindex alignment for NEON instructions
575Some NEON load/store instructions allow an optional address
576alignment qualifier.
577The ARM documentation specifies that this is indicated by
578@samp{@@ @var{align}}. However GAS already interprets
579the @samp{@@} character as a "line comment" start,
580so @samp{: @var{align}} is used instead. For example:
581
582@smallexample
583 vld1.8 @{q0@}, [r0, :128]
584@end smallexample
585
586@node ARM Floating Point
587@section Floating Point
588
589@cindex floating point, ARM (@sc{ieee})
590@cindex ARM floating point (@sc{ieee})
591The ARM family uses @sc{ieee} floating-point numbers.
592
252b5132
RH
593@node ARM Directives
594@section ARM Machine Directives
595
596@cindex machine directives, ARM
597@cindex ARM machine directives
598@table @code
599
4a6bc624
NS
600@c AAAAAAAAAAAAAAAAAAAAAAAAA
601
2b841ec2 602@ifclear ELF
4a6bc624
NS
603@cindex @code{.2byte} directive, ARM
604@cindex @code{.4byte} directive, ARM
605@cindex @code{.8byte} directive, ARM
606@item .2byte @var{expression} [, @var{expression}]*
607@itemx .4byte @var{expression} [, @var{expression}]*
608@itemx .8byte @var{expression} [, @var{expression}]*
609These directives write 2, 4 or 8 byte values to the output section.
2b841ec2 610@end ifclear
4a6bc624
NS
611
612@cindex @code{.align} directive, ARM
adcf07e6
NC
613@item .align @var{expression} [, @var{expression}]
614This is the generic @var{.align} directive. For the ARM however if the
615first argument is zero (ie no alignment is needed) the assembler will
616behave as if the argument had been 2 (ie pad to the next four byte
062b7c0c 617boundary). This is for compatibility with ARM's own assembler.
adcf07e6 618
4a6bc624
NS
619@cindex @code{.arch} directive, ARM
620@item .arch @var{name}
621Select the target architecture. Valid values for @var{name} are the same as
622for the @option{-march} commandline option.
252b5132 623
34bca508 624Specifying @code{.arch} clears any previously selected architecture
69133863
MGD
625extensions.
626
627@cindex @code{.arch_extension} directive, ARM
628@item .arch_extension @var{name}
34bca508
L
629Add or remove an architecture extension to the target architecture. Valid
630values for @var{name} are the same as those accepted as architectural
69133863
MGD
631extensions by the @option{-mcpu} commandline option.
632
633@code{.arch_extension} may be used multiple times to add or remove extensions
634incrementally to the architecture being compiled for.
635
4a6bc624
NS
636@cindex @code{.arm} directive, ARM
637@item .arm
638This performs the same action as @var{.code 32}.
252b5132 639
4a6bc624 640@c BBBBBBBBBBBBBBBBBBBBBBBBBB
0bbf2aa4 641
4a6bc624
NS
642@cindex @code{.bss} directive, ARM
643@item .bss
644This directive switches to the @code{.bss} section.
0bbf2aa4 645
4a6bc624
NS
646@c CCCCCCCCCCCCCCCCCCCCCCCCCC
647
648@cindex @code{.cantunwind} directive, ARM
649@item .cantunwind
650Prevents unwinding through the current function. No personality routine
651or exception table data is required or permitted.
652
653@cindex @code{.code} directive, ARM
654@item .code @code{[16|32]}
655This directive selects the instruction set being generated. The value 16
656selects Thumb, with the value 32 selecting ARM.
657
658@cindex @code{.cpu} directive, ARM
659@item .cpu @var{name}
660Select the target processor. Valid values for @var{name} are the same as
661for the @option{-mcpu} commandline option.
662
34bca508 663Specifying @code{.cpu} clears any previously selected architecture
69133863
MGD
664extensions.
665
4a6bc624
NS
666@c DDDDDDDDDDDDDDDDDDDDDDDDDD
667
668@cindex @code{.dn} and @code{.qn} directives, ARM
f467aa98 669@item @var{name} .dn @var{register name} [@var{.type}] [[@var{index}]]
1f9bb1ca 670@itemx @var{name} .qn @var{register name} [@var{.type}] [[@var{index}]]
23753660
JB
671
672The @code{dn} and @code{qn} directives are used to create typed
673and/or indexed register aliases for use in Advanced SIMD Extension
674(Neon) instructions. The former should be used to create aliases
675of double-precision registers, and the latter to create aliases of
676quad-precision registers.
677
678If these directives are used to create typed aliases, those aliases can
679be used in Neon instructions instead of writing types after the mnemonic
680or after each operand. For example:
681
682@smallexample
683 x .dn d2.f32
684 y .dn d3.f32
685 z .dn d4.f32[1]
686 vmul x,y,z
687@end smallexample
688
689This is equivalent to writing the following:
690
691@smallexample
692 vmul.f32 d2,d3,d4[1]
693@end smallexample
694
695Aliases created using @code{dn} or @code{qn} can be destroyed using
696@code{unreq}.
697
4a6bc624 698@c EEEEEEEEEEEEEEEEEEEEEEEEEE
252b5132 699
4a6bc624
NS
700@cindex @code{.eabi_attribute} directive, ARM
701@item .eabi_attribute @var{tag}, @var{value}
702Set the EABI object attribute @var{tag} to @var{value}.
252b5132 703
4a6bc624
NS
704The @var{tag} is either an attribute number, or one of the following:
705@code{Tag_CPU_raw_name}, @code{Tag_CPU_name}, @code{Tag_CPU_arch},
706@code{Tag_CPU_arch_profile}, @code{Tag_ARM_ISA_use},
75375b3e 707@code{Tag_THUMB_ISA_use}, @code{Tag_FP_arch}, @code{Tag_WMMX_arch},
4a6bc624
NS
708@code{Tag_Advanced_SIMD_arch}, @code{Tag_PCS_config},
709@code{Tag_ABI_PCS_R9_use}, @code{Tag_ABI_PCS_RW_data},
710@code{Tag_ABI_PCS_RO_data}, @code{Tag_ABI_PCS_GOT_use},
711@code{Tag_ABI_PCS_wchar_t}, @code{Tag_ABI_FP_rounding},
712@code{Tag_ABI_FP_denormal}, @code{Tag_ABI_FP_exceptions},
713@code{Tag_ABI_FP_user_exceptions}, @code{Tag_ABI_FP_number_model},
75375b3e 714@code{Tag_ABI_align_needed}, @code{Tag_ABI_align_preserved},
4a6bc624
NS
715@code{Tag_ABI_enum_size}, @code{Tag_ABI_HardFP_use},
716@code{Tag_ABI_VFP_args}, @code{Tag_ABI_WMMX_args},
717@code{Tag_ABI_optimization_goals}, @code{Tag_ABI_FP_optimization_goals},
718@code{Tag_compatibility}, @code{Tag_CPU_unaligned_access},
75375b3e 719@code{Tag_FP_HP_extension}, @code{Tag_ABI_FP_16bit_format},
cd21e546 720@code{Tag_MPextension_use}, @code{Tag_DIV_use},
4a6bc624
NS
721@code{Tag_nodefaults}, @code{Tag_also_compatible_with},
722@code{Tag_conformance}, @code{Tag_T2EE_use},
cd21e546 723@code{Tag_Virtualization_use}
4a6bc624
NS
724
725The @var{value} is either a @code{number}, @code{"string"}, or
726@code{number, "string"} depending on the tag.
727
75375b3e 728Note - the following legacy values are also accepted by @var{tag}:
34bca508 729@code{Tag_VFP_arch}, @code{Tag_ABI_align8_needed},
75375b3e
MGD
730@code{Tag_ABI_align8_preserved}, @code{Tag_VFP_HP_extension},
731
4a6bc624
NS
732@cindex @code{.even} directive, ARM
733@item .even
734This directive aligns to an even-numbered address.
735
736@cindex @code{.extend} directive, ARM
737@cindex @code{.ldouble} directive, ARM
738@item .extend @var{expression} [, @var{expression}]*
739@itemx .ldouble @var{expression} [, @var{expression}]*
740These directives write 12byte long double floating-point values to the
741output section. These are not compatible with current ARM processors
742or ABIs.
743
744@c FFFFFFFFFFFFFFFFFFFFFFFFFF
745
746@anchor{arm_fnend}
747@cindex @code{.fnend} directive, ARM
748@item .fnend
749Marks the end of a function with an unwind table entry. The unwind index
750table entry is created when this directive is processed.
252b5132 751
4a6bc624
NS
752If no personality routine has been specified then standard personality
753routine 0 or 1 will be used, depending on the number of unwind opcodes
754required.
755
756@anchor{arm_fnstart}
757@cindex @code{.fnstart} directive, ARM
758@item .fnstart
759Marks the start of a function with an unwind table entry.
760
761@cindex @code{.force_thumb} directive, ARM
252b5132
RH
762@item .force_thumb
763This directive forces the selection of Thumb instructions, even if the
764target processor does not support those instructions
765
4a6bc624
NS
766@cindex @code{.fpu} directive, ARM
767@item .fpu @var{name}
768Select the floating-point unit to assemble for. Valid values for @var{name}
769are the same as for the @option{-mfpu} commandline option.
252b5132 770
4a6bc624
NS
771@c GGGGGGGGGGGGGGGGGGGGGGGGGG
772@c HHHHHHHHHHHHHHHHHHHHHHHHHH
e1da3f5b 773
4a6bc624
NS
774@cindex @code{.handlerdata} directive, ARM
775@item .handlerdata
776Marks the end of the current function, and the start of the exception table
777entry for that function. Anything between this directive and the
778@code{.fnend} directive will be added to the exception table entry.
779
780Must be preceded by a @code{.personality} or @code{.personalityindex}
781directive.
782
783@c IIIIIIIIIIIIIIIIIIIIIIIIII
c921be7d
NC
784
785@cindex @code{.inst} directive, ARM
786@item .inst @var{opcode} [ , @dots{} ]
1f9bb1ca
AS
787@itemx .inst.n @var{opcode} [ , @dots{} ]
788@itemx .inst.w @var{opcode} [ , @dots{} ]
c921be7d
NC
789Generates the instruction corresponding to the numerical value @var{opcode}.
790@code{.inst.n} and @code{.inst.w} allow the Thumb instruction size to be
791specified explicitly, overriding the normal encoding rules.
792
4a6bc624
NS
793@c JJJJJJJJJJJJJJJJJJJJJJJJJJ
794@c KKKKKKKKKKKKKKKKKKKKKKKKKK
795@c LLLLLLLLLLLLLLLLLLLLLLLLLL
796
797@item .ldouble @var{expression} [, @var{expression}]*
798See @code{.extend}.
5395a469 799
252b5132
RH
800@cindex @code{.ltorg} directive, ARM
801@item .ltorg
802This directive causes the current contents of the literal pool to be
803dumped into the current section (which is assumed to be the .text
804section) at the current location (aligned to a word boundary).
3d0c9500
NC
805@code{GAS} maintains a separate literal pool for each section and each
806sub-section. The @code{.ltorg} directive will only affect the literal
807pool of the current section and sub-section. At the end of assembly
808all remaining, un-empty literal pools will automatically be dumped.
809
810Note - older versions of @code{GAS} would dump the current literal
811pool any time a section change occurred. This is no longer done, since
812it prevents accurate control of the placement of literal pools.
252b5132 813
4a6bc624 814@c MMMMMMMMMMMMMMMMMMMMMMMMMM
252b5132 815
4a6bc624
NS
816@cindex @code{.movsp} directive, ARM
817@item .movsp @var{reg} [, #@var{offset}]
818Tell the unwinder that @var{reg} contains an offset from the current
819stack pointer. If @var{offset} is not specified then it is assumed to be
820zero.
7ed4c4c5 821
4a6bc624
NS
822@c NNNNNNNNNNNNNNNNNNNNNNNNNN
823@c OOOOOOOOOOOOOOOOOOOOOOOOOO
7ed4c4c5 824
4a6bc624
NS
825@cindex @code{.object_arch} directive, ARM
826@item .object_arch @var{name}
827Override the architecture recorded in the EABI object attribute section.
828Valid values for @var{name} are the same as for the @code{.arch} directive.
829Typically this is useful when code uses runtime detection of CPU features.
7ed4c4c5 830
4a6bc624
NS
831@c PPPPPPPPPPPPPPPPPPPPPPPPPP
832
833@cindex @code{.packed} directive, ARM
834@item .packed @var{expression} [, @var{expression}]*
835This directive writes 12-byte packed floating-point values to the
836output section. These are not compatible with current ARM processors
837or ABIs.
838
ea4cff4f 839@anchor{arm_pad}
4a6bc624
NS
840@cindex @code{.pad} directive, ARM
841@item .pad #@var{count}
842Generate unwinder annotations for a stack adjustment of @var{count} bytes.
843A positive value indicates the function prologue allocated stack space by
844decrementing the stack pointer.
7ed4c4c5
NC
845
846@cindex @code{.personality} directive, ARM
847@item .personality @var{name}
848Sets the personality routine for the current function to @var{name}.
849
850@cindex @code{.personalityindex} directive, ARM
851@item .personalityindex @var{index}
852Sets the personality routine for the current function to the EABI standard
853routine number @var{index}
854
4a6bc624
NS
855@cindex @code{.pool} directive, ARM
856@item .pool
857This is a synonym for .ltorg.
7ed4c4c5 858
4a6bc624
NS
859@c QQQQQQQQQQQQQQQQQQQQQQQQQQ
860@c RRRRRRRRRRRRRRRRRRRRRRRRRR
861
862@cindex @code{.req} directive, ARM
863@item @var{name} .req @var{register name}
864This creates an alias for @var{register name} called @var{name}. For
865example:
866
867@smallexample
868 foo .req r0
869@end smallexample
870
871@c SSSSSSSSSSSSSSSSSSSSSSSSSS
7ed4c4c5 872
7da4f750 873@anchor{arm_save}
7ed4c4c5
NC
874@cindex @code{.save} directive, ARM
875@item .save @var{reglist}
876Generate unwinder annotations to restore the registers in @var{reglist}.
877The format of @var{reglist} is the same as the corresponding store-multiple
878instruction.
879
880@smallexample
881@exdent @emph{core registers}
882 .save @{r4, r5, r6, lr@}
883 stmfd sp!, @{r4, r5, r6, lr@}
884@exdent @emph{FPA registers}
885 .save f4, 2
886 sfmfd f4, 2, [sp]!
887@exdent @emph{VFP registers}
888 .save @{d8, d9, d10@}
fa073d69 889 fstmdx sp!, @{d8, d9, d10@}
7ed4c4c5
NC
890@exdent @emph{iWMMXt registers}
891 .save @{wr10, wr11@}
892 wstrd wr11, [sp, #-8]!
893 wstrd wr10, [sp, #-8]!
894or
895 .save wr11
896 wstrd wr11, [sp, #-8]!
897 .save wr10
898 wstrd wr10, [sp, #-8]!
899@end smallexample
900
7da4f750 901@anchor{arm_setfp}
7ed4c4c5
NC
902@cindex @code{.setfp} directive, ARM
903@item .setfp @var{fpreg}, @var{spreg} [, #@var{offset}]
4a6bc624 904Make all unwinder annotations relative to a frame pointer. Without this
7ed4c4c5
NC
905the unwinder will use offsets from the stack pointer.
906
a5b82cbe 907The syntax of this directive is the same as the @code{add} or @code{mov}
7ed4c4c5
NC
908instruction used to set the frame pointer. @var{spreg} must be either
909@code{sp} or mentioned in a previous @code{.movsp} directive.
910
911@smallexample
912.movsp ip
913mov ip, sp
914@dots{}
915.setfp fp, ip, #4
a5b82cbe 916add fp, ip, #4
7ed4c4c5
NC
917@end smallexample
918
4a6bc624
NS
919@cindex @code{.secrel32} directive, ARM
920@item .secrel32 @var{expression} [, @var{expression}]*
921This directive emits relocations that evaluate to the section-relative
922offset of each expression's symbol. This directive is only supported
923for PE targets.
924
cab7e4d9
NC
925@cindex @code{.syntax} directive, ARM
926@item .syntax [@code{unified} | @code{divided}]
927This directive sets the Instruction Set Syntax as described in the
928@ref{ARM-Instruction-Set} section.
929
4a6bc624
NS
930@c TTTTTTTTTTTTTTTTTTTTTTTTTT
931
932@cindex @code{.thumb} directive, ARM
933@item .thumb
934This performs the same action as @var{.code 16}.
935
936@cindex @code{.thumb_func} directive, ARM
937@item .thumb_func
938This directive specifies that the following symbol is the name of a
939Thumb encoded function. This information is necessary in order to allow
940the assembler and linker to generate correct code for interworking
941between Arm and Thumb instructions and should be used even if
942interworking is not going to be performed. The presence of this
943directive also implies @code{.thumb}
944
33eaf5de 945This directive is not necessary when generating EABI objects. On these
4a6bc624
NS
946targets the encoding is implicit when generating Thumb code.
947
948@cindex @code{.thumb_set} directive, ARM
949@item .thumb_set
950This performs the equivalent of a @code{.set} directive in that it
951creates a symbol which is an alias for another symbol (possibly not yet
952defined). This directive also has the added property in that it marks
953the aliased symbol as being a thumb function entry point, in the same
954way that the @code{.thumb_func} directive does.
955
0855e32b
NS
956@cindex @code{.tlsdescseq} directive, ARM
957@item .tlsdescseq @var{tls-variable}
958This directive is used to annotate parts of an inlined TLS descriptor
959trampoline. Normally the trampoline is provided by the linker, and
960this directive is not needed.
961
4a6bc624
NS
962@c UUUUUUUUUUUUUUUUUUUUUUUUUU
963
964@cindex @code{.unreq} directive, ARM
965@item .unreq @var{alias-name}
966This undefines a register alias which was previously defined using the
967@code{req}, @code{dn} or @code{qn} directives. For example:
968
969@smallexample
970 foo .req r0
971 .unreq foo
972@end smallexample
973
974An error occurs if the name is undefined. Note - this pseudo op can
975be used to delete builtin in register name aliases (eg 'r0'). This
976should only be done if it is really necessary.
977
7ed4c4c5 978@cindex @code{.unwind_raw} directive, ARM
4a6bc624 979@item .unwind_raw @var{offset}, @var{byte1}, @dots{}
33eaf5de 980Insert one of more arbitrary unwind opcode bytes, which are known to adjust
7ed4c4c5
NC
981the stack pointer by @var{offset} bytes.
982
983For example @code{.unwind_raw 4, 0xb1, 0x01} is equivalent to
984@code{.save @{r0@}}
985
4a6bc624 986@c VVVVVVVVVVVVVVVVVVVVVVVVVV
ee065d83 987
4a6bc624
NS
988@cindex @code{.vsave} directive, ARM
989@item .vsave @var{vfp-reglist}
990Generate unwinder annotations to restore the VFP registers in @var{vfp-reglist}
991using FLDMD. Also works for VFPv3 registers
992that are to be restored using VLDM.
993The format of @var{vfp-reglist} is the same as the corresponding store-multiple
994instruction.
ee065d83 995
4a6bc624
NS
996@smallexample
997@exdent @emph{VFP registers}
998 .vsave @{d8, d9, d10@}
999 fstmdd sp!, @{d8, d9, d10@}
1000@exdent @emph{VFPv3 registers}
1001 .vsave @{d15, d16, d17@}
1002 vstm sp!, @{d15, d16, d17@}
1003@end smallexample
e04befd0 1004
4a6bc624
NS
1005Since FLDMX and FSTMX are now deprecated, this directive should be
1006used in favour of @code{.save} for saving VFP registers for ARMv6 and above.
e04befd0 1007
4a6bc624
NS
1008@c WWWWWWWWWWWWWWWWWWWWWWWWWW
1009@c XXXXXXXXXXXXXXXXXXXXXXXXXX
1010@c YYYYYYYYYYYYYYYYYYYYYYYYYY
1011@c ZZZZZZZZZZZZZZZZZZZZZZZZZZ
ee065d83 1012
252b5132
RH
1013@end table
1014
1015@node ARM Opcodes
1016@section Opcodes
1017
1018@cindex ARM opcodes
1019@cindex opcodes for ARM
49a5575c
NC
1020@code{@value{AS}} implements all the standard ARM opcodes. It also
1021implements several pseudo opcodes, including several synthetic load
34bca508 1022instructions.
252b5132 1023
49a5575c
NC
1024@table @code
1025
1026@cindex @code{NOP} pseudo op, ARM
1027@item NOP
1028@smallexample
1029 nop
1030@end smallexample
252b5132 1031
49a5575c
NC
1032This pseudo op will always evaluate to a legal ARM instruction that does
1033nothing. Currently it will evaluate to MOV r0, r0.
252b5132 1034
49a5575c 1035@cindex @code{LDR reg,=<label>} pseudo op, ARM
34bca508 1036@item LDR
252b5132
RH
1037@smallexample
1038 ldr <register> , = <expression>
1039@end smallexample
1040
1041If expression evaluates to a numeric constant then a MOV or MVN
1042instruction will be used in place of the LDR instruction, if the
1043constant can be generated by either of these instructions. Otherwise
1044the constant will be placed into the nearest literal pool (if it not
1045already there) and a PC relative LDR instruction will be generated.
1046
49a5575c
NC
1047@cindex @code{ADR reg,<label>} pseudo op, ARM
1048@item ADR
1049@smallexample
1050 adr <register> <label>
1051@end smallexample
1052
1053This instruction will load the address of @var{label} into the indicated
1054register. The instruction will evaluate to a PC relative ADD or SUB
1055instruction depending upon where the label is located. If the label is
1056out of range, or if it is not defined in the same file (and section) as
1057the ADR instruction, then an error will be generated. This instruction
1058will not make use of the literal pool.
1059
1060@cindex @code{ADRL reg,<label>} pseudo op, ARM
34bca508 1061@item ADRL
49a5575c
NC
1062@smallexample
1063 adrl <register> <label>
1064@end smallexample
1065
1066This instruction will load the address of @var{label} into the indicated
a349d9dd 1067register. The instruction will evaluate to one or two PC relative ADD
49a5575c
NC
1068or SUB instructions depending upon where the label is located. If a
1069second instruction is not needed a NOP instruction will be generated in
1070its place, so that this instruction is always 8 bytes long.
1071
1072If the label is out of range, or if it is not defined in the same file
1073(and section) as the ADRL instruction, then an error will be generated.
1074This instruction will not make use of the literal pool.
1075
1076@end table
1077
252b5132
RH
1078For information on the ARM or Thumb instruction sets, see @cite{ARM
1079Software Development Toolkit Reference Manual}, Advanced RISC Machines
1080Ltd.
1081
6057a28f
NC
1082@node ARM Mapping Symbols
1083@section Mapping Symbols
1084
1085The ARM ELF specification requires that special symbols be inserted
1086into object files to mark certain features:
1087
1088@table @code
1089
1090@cindex @code{$a}
1091@item $a
1092At the start of a region of code containing ARM instructions.
1093
1094@cindex @code{$t}
1095@item $t
1096At the start of a region of code containing THUMB instructions.
1097
1098@cindex @code{$d}
1099@item $d
1100At the start of a region of data.
1101
1102@end table
1103
1104The assembler will automatically insert these symbols for you - there
1105is no need to code them yourself. Support for tagging symbols ($b,
1106$f, $p and $m) which is also mentioned in the current ARM ELF
1107specification is not implemented. This is because they have been
1108dropped from the new EABI and so tools cannot rely upon their
1109presence.
1110
7da4f750
MM
1111@node ARM Unwinding Tutorial
1112@section Unwinding
1113
1114The ABI for the ARM Architecture specifies a standard format for
1115exception unwind information. This information is used when an
1116exception is thrown to determine where control should be transferred.
1117In particular, the unwind information is used to determine which
1118function called the function that threw the exception, and which
1119function called that one, and so forth. This information is also used
1120to restore the values of callee-saved registers in the function
1121catching the exception.
1122
1123If you are writing functions in assembly code, and those functions
1124call other functions that throw exceptions, you must use assembly
1125pseudo ops to ensure that appropriate exception unwind information is
1126generated. Otherwise, if one of the functions called by your assembly
1127code throws an exception, the run-time library will be unable to
1128unwind the stack through your assembly code and your program will not
1129behave correctly.
1130
1131To illustrate the use of these pseudo ops, we will examine the code
1132that G++ generates for the following C++ input:
1133
1134@verbatim
1135void callee (int *);
1136
34bca508
L
1137int
1138caller ()
7da4f750
MM
1139{
1140 int i;
1141 callee (&i);
34bca508 1142 return i;
7da4f750
MM
1143}
1144@end verbatim
1145
1146This example does not show how to throw or catch an exception from
1147assembly code. That is a much more complex operation and should
1148always be done in a high-level language, such as C++, that directly
1149supports exceptions.
1150
1151The code generated by one particular version of G++ when compiling the
1152example above is:
1153
1154@verbatim
1155_Z6callerv:
1156 .fnstart
1157.LFB2:
1158 @ Function supports interworking.
1159 @ args = 0, pretend = 0, frame = 8
1160 @ frame_needed = 1, uses_anonymous_args = 0
1161 stmfd sp!, {fp, lr}
1162 .save {fp, lr}
1163.LCFI0:
1164 .setfp fp, sp, #4
1165 add fp, sp, #4
1166.LCFI1:
1167 .pad #8
1168 sub sp, sp, #8
1169.LCFI2:
1170 sub r3, fp, #8
1171 mov r0, r3
1172 bl _Z6calleePi
1173 ldr r3, [fp, #-8]
1174 mov r0, r3
1175 sub sp, fp, #4
1176 ldmfd sp!, {fp, lr}
1177 bx lr
1178.LFE2:
1179 .fnend
1180@end verbatim
1181
1182Of course, the sequence of instructions varies based on the options
1183you pass to GCC and on the version of GCC in use. The exact
1184instructions are not important since we are focusing on the pseudo ops
1185that are used to generate unwind information.
1186
1187An important assumption made by the unwinder is that the stack frame
1188does not change during the body of the function. In particular, since
1189we assume that the assembly code does not itself throw an exception,
1190the only point where an exception can be thrown is from a call, such
1191as the @code{bl} instruction above. At each call site, the same saved
1192registers (including @code{lr}, which indicates the return address)
1193must be located in the same locations relative to the frame pointer.
1194
1195The @code{.fnstart} (@pxref{arm_fnstart,,.fnstart pseudo op}) pseudo
1196op appears immediately before the first instruction of the function
1197while the @code{.fnend} (@pxref{arm_fnend,,.fnend pseudo op}) pseudo
1198op appears immediately after the last instruction of the function.
34bca508 1199These pseudo ops specify the range of the function.
7da4f750
MM
1200
1201Only the order of the other pseudos ops (e.g., @code{.setfp} or
1202@code{.pad}) matters; their exact locations are irrelevant. In the
1203example above, the compiler emits the pseudo ops with particular
1204instructions. That makes it easier to understand the code, but it is
1205not required for correctness. It would work just as well to emit all
1206of the pseudo ops other than @code{.fnend} in the same order, but
1207immediately after @code{.fnstart}.
1208
1209The @code{.save} (@pxref{arm_save,,.save pseudo op}) pseudo op
1210indicates registers that have been saved to the stack so that they can
1211be restored before the function returns. The argument to the
1212@code{.save} pseudo op is a list of registers to save. If a register
1213is ``callee-saved'' (as specified by the ABI) and is modified by the
1214function you are writing, then your code must save the value before it
1215is modified and restore the original value before the function
1216returns. If an exception is thrown, the run-time library restores the
1217values of these registers from their locations on the stack before
1218returning control to the exception handler. (Of course, if an
1219exception is not thrown, the function that contains the @code{.save}
1220pseudo op restores these registers in the function epilogue, as is
1221done with the @code{ldmfd} instruction above.)
1222
1223You do not have to save callee-saved registers at the very beginning
1224of the function and you do not need to use the @code{.save} pseudo op
1225immediately following the point at which the registers are saved.
1226However, if you modify a callee-saved register, you must save it on
1227the stack before modifying it and before calling any functions which
1228might throw an exception. And, you must use the @code{.save} pseudo
1229op to indicate that you have done so.
1230
1231The @code{.pad} (@pxref{arm_pad,,.pad}) pseudo op indicates a
1232modification of the stack pointer that does not save any registers.
1233The argument is the number of bytes (in decimal) that are subtracted
1234from the stack pointer. (On ARM CPUs, the stack grows downwards, so
1235subtracting from the stack pointer increases the size of the stack.)
1236
1237The @code{.setfp} (@pxref{arm_setfp,,.setfp pseudo op}) pseudo op
1238indicates the register that contains the frame pointer. The first
1239argument is the register that is set, which is typically @code{fp}.
1240The second argument indicates the register from which the frame
1241pointer takes its value. The third argument, if present, is the value
1242(in decimal) added to the register specified by the second argument to
1243compute the value of the frame pointer. You should not modify the
1244frame pointer in the body of the function.
1245
1246If you do not use a frame pointer, then you should not use the
1247@code{.setfp} pseudo op. If you do not use a frame pointer, then you
1248should avoid modifying the stack pointer outside of the function
1249prologue. Otherwise, the run-time library will be unable to find
1250saved registers when it is unwinding the stack.
1251
1252The pseudo ops described above are sufficient for writing assembly
1253code that calls functions which may throw exceptions. If you need to
1254know more about the object-file format used to represent unwind
1255information, you may consult the @cite{Exception Handling ABI for the
1256ARM Architecture} available from @uref{http://infocenter.arm.com}.
91f68a68 1257
This page took 0.777303 seconds and 4 git commands to generate.