1 | This is as.info, produced by makeinfo version 4.3 from as.texinfo.
|
---|
2 |
|
---|
3 | START-INFO-DIR-ENTRY
|
---|
4 | * As: (as). The GNU assembler.
|
---|
5 | * Gas: (as). The GNU assembler.
|
---|
6 | END-INFO-DIR-ENTRY
|
---|
7 |
|
---|
8 | This file documents the GNU Assembler "as".
|
---|
9 |
|
---|
10 | Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002
|
---|
11 | Free Software Foundation, Inc.
|
---|
12 |
|
---|
13 | Permission is granted to copy, distribute and/or modify this document
|
---|
14 | under the terms of the GNU Free Documentation License, Version 1.1 or
|
---|
15 | any later version published by the Free Software Foundation; with no
|
---|
16 | Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
---|
17 | Texts. A copy of the license is included in the section entitled "GNU
|
---|
18 | Free Documentation License".
|
---|
19 |
|
---|
20 |
|
---|
21 | File: as.info, Node: Comments, Next: Symbol Intro, Prev: Whitespace, Up: Syntax
|
---|
22 |
|
---|
23 | Comments
|
---|
24 | ========
|
---|
25 |
|
---|
26 | There are two ways of rendering comments to `as'. In both cases the
|
---|
27 | comment is equivalent to one space.
|
---|
28 |
|
---|
29 | Anything from `/*' through the next `*/' is a comment. This means
|
---|
30 | you may not nest these comments.
|
---|
31 |
|
---|
32 | /*
|
---|
33 | The only way to include a newline ('\n') in a comment
|
---|
34 | is to use this sort of comment.
|
---|
35 | */
|
---|
36 |
|
---|
37 | /* This sort of comment does not nest. */
|
---|
38 |
|
---|
39 | Anything from the "line comment" character to the next newline is
|
---|
40 | considered a comment and is ignored. The line comment character is `;'
|
---|
41 | for the AMD 29K family; `;' on the ARC; `@' on the ARM; `;' for the
|
---|
42 | H8/300 family; `!' for the H8/500 family; `;' for the HPPA; `#' on the
|
---|
43 | i386 and x86-64; `#' on the i960; `;' for the PDP-11; `;' for picoJava;
|
---|
44 | `;' for Motorola PowerPC; `!' for the Renesas / SuperH SH; `!' on the
|
---|
45 | SPARC; `#' on the ip2k; `#' on the m32r; `|' on the 680x0; `#' on the
|
---|
46 | 68HC11 and 68HC12; `;' on the M880x0; `#' on the Vax; `!' for the Z8000;
|
---|
47 | `#' on the V850; `#' for Xtensa systems; see *Note Machine
|
---|
48 | Dependencies::.
|
---|
49 |
|
---|
50 | On some machines there are two different line comment characters.
|
---|
51 | One character only begins a comment if it is the first non-whitespace
|
---|
52 | character on a line, while the other always begins a comment.
|
---|
53 |
|
---|
54 | The V850 assembler also supports a double dash as starting a comment
|
---|
55 | that extends to the end of the line.
|
---|
56 |
|
---|
57 | `--';
|
---|
58 |
|
---|
59 | To be compatible with past assemblers, lines that begin with `#'
|
---|
60 | have a special interpretation. Following the `#' should be an absolute
|
---|
61 | expression (*note Expressions::): the logical line number of the _next_
|
---|
62 | line. Then a string (*note Strings: Strings.) is allowed: if present
|
---|
63 | it is a new logical file name. The rest of the line, if any, should be
|
---|
64 | whitespace.
|
---|
65 |
|
---|
66 | If the first non-whitespace characters on the line are not numeric,
|
---|
67 | the line is ignored. (Just like a comment.)
|
---|
68 |
|
---|
69 | # This is an ordinary comment.
|
---|
70 | # 42-6 "new_file_name" # New logical file name
|
---|
71 | # This is logical line # 36.
|
---|
72 | This feature is deprecated, and may disappear from future versions
|
---|
73 | of `as'.
|
---|
74 |
|
---|
75 |
|
---|
76 | File: as.info, Node: Symbol Intro, Next: Statements, Prev: Comments, Up: Syntax
|
---|
77 |
|
---|
78 | Symbols
|
---|
79 | =======
|
---|
80 |
|
---|
81 | A "symbol" is one or more characters chosen from the set of all
|
---|
82 | letters (both upper and lower case), digits and the three characters
|
---|
83 | `_.$'. On most machines, you can also use `$' in symbol names;
|
---|
84 | exceptions are noted in *Note Machine Dependencies::. No symbol may
|
---|
85 | begin with a digit. Case is significant. There is no length limit:
|
---|
86 | all characters are significant. Symbols are delimited by characters
|
---|
87 | not in that set, or by the beginning of a file (since the source
|
---|
88 | program must end with a newline, the end of a file is not a possible
|
---|
89 | symbol delimiter). *Note Symbols::.
|
---|
90 |
|
---|
91 |
|
---|
92 | File: as.info, Node: Statements, Next: Constants, Prev: Symbol Intro, Up: Syntax
|
---|
93 |
|
---|
94 | Statements
|
---|
95 | ==========
|
---|
96 |
|
---|
97 | A "statement" ends at a newline character (`\n') or line separator
|
---|
98 | character. (The line separator is usually `;', unless this conflicts
|
---|
99 | with the comment character; *note Machine Dependencies::.) The newline
|
---|
100 | or separator character is considered part of the preceding statement.
|
---|
101 | Newlines and separators within character constants are an exception:
|
---|
102 | they do not end statements.
|
---|
103 |
|
---|
104 | It is an error to end any statement with end-of-file: the last
|
---|
105 | character of any input file should be a newline.
|
---|
106 |
|
---|
107 | An empty statement is allowed, and may include whitespace. It is
|
---|
108 | ignored.
|
---|
109 |
|
---|
110 | A statement begins with zero or more labels, optionally followed by a
|
---|
111 | key symbol which determines what kind of statement it is. The key
|
---|
112 | symbol determines the syntax of the rest of the statement. If the
|
---|
113 | symbol begins with a dot `.' then the statement is an assembler
|
---|
114 | directive: typically valid for any computer. If the symbol begins with
|
---|
115 | a letter the statement is an assembly language "instruction": it
|
---|
116 | assembles into a machine language instruction. Different versions of
|
---|
117 | `as' for different computers recognize different instructions. In
|
---|
118 | fact, the same symbol may represent a different instruction in a
|
---|
119 | different computer's assembly language.
|
---|
120 |
|
---|
121 | A label is a symbol immediately followed by a colon (`:').
|
---|
122 | Whitespace before a label or after a colon is permitted, but you may not
|
---|
123 | have whitespace between a label's symbol and its colon. *Note Labels::.
|
---|
124 |
|
---|
125 | For HPPA targets, labels need not be immediately followed by a
|
---|
126 | colon, but the definition of a label must begin in column zero. This
|
---|
127 | also implies that only one label may be defined on each line.
|
---|
128 |
|
---|
129 | label: .directive followed by something
|
---|
130 | another_label: # This is an empty statement.
|
---|
131 | instruction operand_1, operand_2, ...
|
---|
132 |
|
---|
133 |
|
---|
134 | File: as.info, Node: Constants, Prev: Statements, Up: Syntax
|
---|
135 |
|
---|
136 | Constants
|
---|
137 | =========
|
---|
138 |
|
---|
139 | A constant is a number, written so that its value is known by
|
---|
140 | inspection, without knowing any context. Like this:
|
---|
141 | .byte 74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value.
|
---|
142 | .ascii "Ring the bell\7" # A string constant.
|
---|
143 | .octa 0x123456789abcdef0123456789ABCDEF0 # A bignum.
|
---|
144 | .float 0f-314159265358979323846264338327\
|
---|
145 | 95028841971.693993751E-40 # - pi, a flonum.
|
---|
146 |
|
---|
147 | * Menu:
|
---|
148 |
|
---|
149 | * Characters:: Character Constants
|
---|
150 | * Numbers:: Number Constants
|
---|
151 |
|
---|
152 |
|
---|
153 | File: as.info, Node: Characters, Next: Numbers, Up: Constants
|
---|
154 |
|
---|
155 | Character Constants
|
---|
156 | -------------------
|
---|
157 |
|
---|
158 | There are two kinds of character constants. A "character" stands
|
---|
159 | for one character in one byte and its value may be used in numeric
|
---|
160 | expressions. String constants (properly called string _literals_) are
|
---|
161 | potentially many bytes and their values may not be used in arithmetic
|
---|
162 | expressions.
|
---|
163 |
|
---|
164 | * Menu:
|
---|
165 |
|
---|
166 | * Strings:: Strings
|
---|
167 | * Chars:: Characters
|
---|
168 |
|
---|
169 |
|
---|
170 | File: as.info, Node: Strings, Next: Chars, Up: Characters
|
---|
171 |
|
---|
172 | Strings
|
---|
173 | .......
|
---|
174 |
|
---|
175 | A "string" is written between double-quotes. It may contain
|
---|
176 | double-quotes or null characters. The way to get special characters
|
---|
177 | into a string is to "escape" these characters: precede them with a
|
---|
178 | backslash `\' character. For example `\\' represents one backslash:
|
---|
179 | the first `\' is an escape which tells `as' to interpret the second
|
---|
180 | character literally as a backslash (which prevents `as' from
|
---|
181 | recognizing the second `\' as an escape character). The complete list
|
---|
182 | of escapes follows.
|
---|
183 |
|
---|
184 | `\b'
|
---|
185 | Mnemonic for backspace; for ASCII this is octal code 010.
|
---|
186 |
|
---|
187 | `\f'
|
---|
188 | Mnemonic for FormFeed; for ASCII this is octal code 014.
|
---|
189 |
|
---|
190 | `\n'
|
---|
191 | Mnemonic for newline; for ASCII this is octal code 012.
|
---|
192 |
|
---|
193 | `\r'
|
---|
194 | Mnemonic for carriage-Return; for ASCII this is octal code 015.
|
---|
195 |
|
---|
196 | `\t'
|
---|
197 | Mnemonic for horizontal Tab; for ASCII this is octal code 011.
|
---|
198 |
|
---|
199 | `\ DIGIT DIGIT DIGIT'
|
---|
200 | An octal character code. The numeric code is 3 octal digits. For
|
---|
201 | compatibility with other Unix systems, 8 and 9 are accepted as
|
---|
202 | digits: for example, `\008' has the value 010, and `\009' the
|
---|
203 | value 011.
|
---|
204 |
|
---|
205 | `\`x' HEX-DIGITS...'
|
---|
206 | A hex character code. All trailing hex digits are combined.
|
---|
207 | Either upper or lower case `x' works.
|
---|
208 |
|
---|
209 | `\\'
|
---|
210 | Represents one `\' character.
|
---|
211 |
|
---|
212 | `\"'
|
---|
213 | Represents one `"' character. Needed in strings to represent this
|
---|
214 | character, because an unescaped `"' would end the string.
|
---|
215 |
|
---|
216 | `\ ANYTHING-ELSE'
|
---|
217 | Any other character when escaped by `\' gives a warning, but
|
---|
218 | assembles as if the `\' was not present. The idea is that if you
|
---|
219 | used an escape sequence you clearly didn't want the literal
|
---|
220 | interpretation of the following character. However `as' has no
|
---|
221 | other interpretation, so `as' knows it is giving you the wrong
|
---|
222 | code and warns you of the fact.
|
---|
223 |
|
---|
224 | Which characters are escapable, and what those escapes represent,
|
---|
225 | varies widely among assemblers. The current set is what we think the
|
---|
226 | BSD 4.2 assembler recognizes, and is a subset of what most C compilers
|
---|
227 | recognize. If you are in doubt, do not use an escape sequence.
|
---|
228 |
|
---|
229 |
|
---|
230 | File: as.info, Node: Chars, Prev: Strings, Up: Characters
|
---|
231 |
|
---|
232 | Characters
|
---|
233 | ..........
|
---|
234 |
|
---|
235 | A single character may be written as a single quote immediately
|
---|
236 | followed by that character. The same escapes apply to characters as to
|
---|
237 | strings. So if you want to write the character backslash, you must
|
---|
238 | write `'\\' where the first `\' escapes the second `\'. As you can
|
---|
239 | see, the quote is an acute accent, not a grave accent. A newline
|
---|
240 | immediately following an acute accent is taken as a literal character
|
---|
241 | and does not count as the end of a statement. The value of a character
|
---|
242 | constant in a numeric expression is the machine's byte-wide code for
|
---|
243 | that character. `as' assumes your character code is ASCII: `'A' means
|
---|
244 | 65, `'B' means 66, and so on.
|
---|
245 |
|
---|
246 |
|
---|
247 | File: as.info, Node: Numbers, Prev: Characters, Up: Constants
|
---|
248 |
|
---|
249 | Number Constants
|
---|
250 | ----------------
|
---|
251 |
|
---|
252 | `as' distinguishes three kinds of numbers according to how they are
|
---|
253 | stored in the target machine. _Integers_ are numbers that would fit
|
---|
254 | into an `int' in the C language. _Bignums_ are integers, but they are
|
---|
255 | stored in more than 32 bits. _Flonums_ are floating point numbers,
|
---|
256 | described below.
|
---|
257 |
|
---|
258 | * Menu:
|
---|
259 |
|
---|
260 | * Integers:: Integers
|
---|
261 | * Bignums:: Bignums
|
---|
262 | * Flonums:: Flonums
|
---|
263 |
|
---|
264 |
|
---|
265 | File: as.info, Node: Integers, Next: Bignums, Up: Numbers
|
---|
266 |
|
---|
267 | Integers
|
---|
268 | ........
|
---|
269 |
|
---|
270 | A binary integer is `0b' or `0B' followed by zero or more of the
|
---|
271 | binary digits `01'.
|
---|
272 |
|
---|
273 | An octal integer is `0' followed by zero or more of the octal digits
|
---|
274 | (`01234567').
|
---|
275 |
|
---|
276 | A decimal integer starts with a non-zero digit followed by zero or
|
---|
277 | more digits (`0123456789').
|
---|
278 |
|
---|
279 | A hexadecimal integer is `0x' or `0X' followed by one or more
|
---|
280 | hexadecimal digits chosen from `0123456789abcdefABCDEF'.
|
---|
281 |
|
---|
282 | Integers have the usual values. To denote a negative integer, use
|
---|
283 | the prefix operator `-' discussed under expressions (*note Prefix
|
---|
284 | Operators: Prefix Ops.).
|
---|
285 |
|
---|
286 |
|
---|
287 | File: as.info, Node: Bignums, Next: Flonums, Prev: Integers, Up: Numbers
|
---|
288 |
|
---|
289 | Bignums
|
---|
290 | .......
|
---|
291 |
|
---|
292 | A "bignum" has the same syntax and semantics as an integer except
|
---|
293 | that the number (or its negative) takes more than 32 bits to represent
|
---|
294 | in binary. The distinction is made because in some places integers are
|
---|
295 | permitted while bignums are not.
|
---|
296 |
|
---|
297 |
|
---|
298 | File: as.info, Node: Flonums, Prev: Bignums, Up: Numbers
|
---|
299 |
|
---|
300 | Flonums
|
---|
301 | .......
|
---|
302 |
|
---|
303 | A "flonum" represents a floating point number. The translation is
|
---|
304 | indirect: a decimal floating point number from the text is converted by
|
---|
305 | `as' to a generic binary floating point number of more than sufficient
|
---|
306 | precision. This generic floating point number is converted to a
|
---|
307 | particular computer's floating point format (or formats) by a portion
|
---|
308 | of `as' specialized to that computer.
|
---|
309 |
|
---|
310 | A flonum is written by writing (in order)
|
---|
311 | * The digit `0'. (`0' is optional on the HPPA.)
|
---|
312 |
|
---|
313 | * A letter, to tell `as' the rest of the number is a flonum. `e' is
|
---|
314 | recommended. Case is not important.
|
---|
315 |
|
---|
316 | On the H8/300, H8/500, Renesas / SuperH SH, and AMD 29K
|
---|
317 | architectures, the letter must be one of the letters `DFPRSX' (in
|
---|
318 | upper or lower case).
|
---|
319 |
|
---|
320 | On the ARC, the letter must be one of the letters `DFRS' (in upper
|
---|
321 | or lower case).
|
---|
322 |
|
---|
323 | On the Intel 960 architecture, the letter must be one of the
|
---|
324 | letters `DFT' (in upper or lower case).
|
---|
325 |
|
---|
326 | On the HPPA architecture, the letter must be `E' (upper case only).
|
---|
327 |
|
---|
328 | * An optional sign: either `+' or `-'.
|
---|
329 |
|
---|
330 | * An optional "integer part": zero or more decimal digits.
|
---|
331 |
|
---|
332 | * An optional "fractional part": `.' followed by zero or more
|
---|
333 | decimal digits.
|
---|
334 |
|
---|
335 | * An optional exponent, consisting of:
|
---|
336 |
|
---|
337 | * An `E' or `e'.
|
---|
338 |
|
---|
339 | * Optional sign: either `+' or `-'.
|
---|
340 |
|
---|
341 | * One or more decimal digits.
|
---|
342 |
|
---|
343 |
|
---|
344 | At least one of the integer part or the fractional part must be
|
---|
345 | present. The floating point number has the usual base-10 value.
|
---|
346 |
|
---|
347 | `as' does all processing using integers. Flonums are computed
|
---|
348 | independently of any floating point hardware in the computer running
|
---|
349 | `as'.
|
---|
350 |
|
---|
351 |
|
---|
352 | File: as.info, Node: Sections, Next: Symbols, Prev: Syntax, Up: Top
|
---|
353 |
|
---|
354 | Sections and Relocation
|
---|
355 | ***********************
|
---|
356 |
|
---|
357 | * Menu:
|
---|
358 |
|
---|
359 | * Secs Background:: Background
|
---|
360 | * Ld Sections:: Linker Sections
|
---|
361 | * As Sections:: Assembler Internal Sections
|
---|
362 | * Sub-Sections:: Sub-Sections
|
---|
363 | * bss:: bss Section
|
---|
364 |
|
---|
365 |
|
---|
366 | File: as.info, Node: Secs Background, Next: Ld Sections, Up: Sections
|
---|
367 |
|
---|
368 | Background
|
---|
369 | ==========
|
---|
370 |
|
---|
371 | Roughly, a section is a range of addresses, with no gaps; all data
|
---|
372 | "in" those addresses is treated the same for some particular purpose.
|
---|
373 | For example there may be a "read only" section.
|
---|
374 |
|
---|
375 | The linker `ld' reads many object files (partial programs) and
|
---|
376 | combines their contents to form a runnable program. When `as' emits an
|
---|
377 | object file, the partial program is assumed to start at address 0.
|
---|
378 | `ld' assigns the final addresses for the partial program, so that
|
---|
379 | different partial programs do not overlap. This is actually an
|
---|
380 | oversimplification, but it suffices to explain how `as' uses sections.
|
---|
381 |
|
---|
382 | `ld' moves blocks of bytes of your program to their run-time
|
---|
383 | addresses. These blocks slide to their run-time addresses as rigid
|
---|
384 | units; their length does not change and neither does the order of bytes
|
---|
385 | within them. Such a rigid unit is called a _section_. Assigning
|
---|
386 | run-time addresses to sections is called "relocation". It includes the
|
---|
387 | task of adjusting mentions of object-file addresses so they refer to
|
---|
388 | the proper run-time addresses. For the H8/300 and H8/500, and for the
|
---|
389 | Renesas / SuperH SH, `as' pads sections if needed to ensure they end on
|
---|
390 | a word (sixteen bit) boundary.
|
---|
391 |
|
---|
392 | An object file written by `as' has at least three sections, any of
|
---|
393 | which may be empty. These are named "text", "data" and "bss" sections.
|
---|
394 |
|
---|
395 | When it generates COFF or ELF output, `as' can also generate
|
---|
396 | whatever other named sections you specify using the `.section'
|
---|
397 | directive (*note `.section': Section.). If you do not use any
|
---|
398 | directives that place output in the `.text' or `.data' sections, these
|
---|
399 | sections still exist, but are empty.
|
---|
400 |
|
---|
401 | When `as' generates SOM or ELF output for the HPPA, `as' can also
|
---|
402 | generate whatever other named sections you specify using the `.space'
|
---|
403 | and `.subspace' directives. See `HP9000 Series 800 Assembly Language
|
---|
404 | Reference Manual' (HP 92432-90001) for details on the `.space' and
|
---|
405 | `.subspace' assembler directives.
|
---|
406 |
|
---|
407 | Additionally, `as' uses different names for the standard text, data,
|
---|
408 | and bss sections when generating SOM output. Program text is placed
|
---|
409 | into the `$CODE$' section, data into `$DATA$', and BSS into `$BSS$'.
|
---|
410 |
|
---|
411 | Within the object file, the text section starts at address `0', the
|
---|
412 | data section follows, and the bss section follows the data section.
|
---|
413 |
|
---|
414 | When generating either SOM or ELF output files on the HPPA, the text
|
---|
415 | section starts at address `0', the data section at address `0x4000000',
|
---|
416 | and the bss section follows the data section.
|
---|
417 |
|
---|
418 | To let `ld' know which data changes when the sections are relocated,
|
---|
419 | and how to change that data, `as' also writes to the object file
|
---|
420 | details of the relocation needed. To perform relocation `ld' must
|
---|
421 | know, each time an address in the object file is mentioned:
|
---|
422 | * Where in the object file is the beginning of this reference to an
|
---|
423 | address?
|
---|
424 |
|
---|
425 | * How long (in bytes) is this reference?
|
---|
426 |
|
---|
427 | * Which section does the address refer to? What is the numeric
|
---|
428 | value of
|
---|
429 | (ADDRESS) - (START-ADDRESS OF SECTION)?
|
---|
430 |
|
---|
431 | * Is the reference to an address "Program-Counter relative"?
|
---|
432 |
|
---|
433 | In fact, every address `as' ever uses is expressed as
|
---|
434 | (SECTION) + (OFFSET INTO SECTION)
|
---|
435 |
|
---|
436 | Further, most expressions `as' computes have this section-relative
|
---|
437 | nature. (For some object formats, such as SOM for the HPPA, some
|
---|
438 | expressions are symbol-relative instead.)
|
---|
439 |
|
---|
440 | In this manual we use the notation {SECNAME N} to mean "offset N
|
---|
441 | into section SECNAME."
|
---|
442 |
|
---|
443 | Apart from text, data and bss sections you need to know about the
|
---|
444 | "absolute" section. When `ld' mixes partial programs, addresses in the
|
---|
445 | absolute section remain unchanged. For example, address `{absolute 0}'
|
---|
446 | is "relocated" to run-time address 0 by `ld'. Although the linker
|
---|
447 | never arranges two partial programs' data sections with overlapping
|
---|
448 | addresses after linking, _by definition_ their absolute sections must
|
---|
449 | overlap. Address `{absolute 239}' in one part of a program is always
|
---|
450 | the same address when the program is running as address `{absolute
|
---|
451 | 239}' in any other part of the program.
|
---|
452 |
|
---|
453 | The idea of sections is extended to the "undefined" section. Any
|
---|
454 | address whose section is unknown at assembly time is by definition
|
---|
455 | rendered {undefined U}--where U is filled in later. Since numbers are
|
---|
456 | always defined, the only way to generate an undefined address is to
|
---|
457 | mention an undefined symbol. A reference to a named common block would
|
---|
458 | be such a symbol: its value is unknown at assembly time so it has
|
---|
459 | section _undefined_.
|
---|
460 |
|
---|
461 | By analogy the word _section_ is used to describe groups of sections
|
---|
462 | in the linked program. `ld' puts all partial programs' text sections
|
---|
463 | in contiguous addresses in the linked program. It is customary to
|
---|
464 | refer to the _text section_ of a program, meaning all the addresses of
|
---|
465 | all partial programs' text sections. Likewise for data and bss
|
---|
466 | sections.
|
---|
467 |
|
---|
468 | Some sections are manipulated by `ld'; others are invented for use
|
---|
469 | of `as' and have no meaning except during assembly.
|
---|
470 |
|
---|
471 |
|
---|
472 | File: as.info, Node: Ld Sections, Next: As Sections, Prev: Secs Background, Up: Sections
|
---|
473 |
|
---|
474 | Linker Sections
|
---|
475 | ===============
|
---|
476 |
|
---|
477 | `ld' deals with just four kinds of sections, summarized below.
|
---|
478 |
|
---|
479 | *named sections*
|
---|
480 | *text section*
|
---|
481 | *data section*
|
---|
482 | These sections hold your program. `as' and `ld' treat them as
|
---|
483 | separate but equal sections. Anything you can say of one section
|
---|
484 | is true of another. When the program is running, however, it is
|
---|
485 | customary for the text section to be unalterable. The text
|
---|
486 | section is often shared among processes: it contains instructions,
|
---|
487 | constants and the like. The data section of a running program is
|
---|
488 | usually alterable: for example, C variables would be stored in the
|
---|
489 | data section.
|
---|
490 |
|
---|
491 | *bss section*
|
---|
492 | This section contains zeroed bytes when your program begins
|
---|
493 | running. It is used to hold uninitialized variables or common
|
---|
494 | storage. The length of each partial program's bss section is
|
---|
495 | important, but because it starts out containing zeroed bytes there
|
---|
496 | is no need to store explicit zero bytes in the object file. The
|
---|
497 | bss section was invented to eliminate those explicit zeros from
|
---|
498 | object files.
|
---|
499 |
|
---|
500 | *absolute section*
|
---|
501 | Address 0 of this section is always "relocated" to runtime address
|
---|
502 | 0. This is useful if you want to refer to an address that `ld'
|
---|
503 | must not change when relocating. In this sense we speak of
|
---|
504 | absolute addresses being "unrelocatable": they do not change
|
---|
505 | during relocation.
|
---|
506 |
|
---|
507 | *undefined section*
|
---|
508 | This "section" is a catch-all for address references to objects
|
---|
509 | not in the preceding sections.
|
---|
510 |
|
---|
511 | An idealized example of three relocatable sections follows. The
|
---|
512 | example uses the traditional section names `.text' and `.data'. Memory
|
---|
513 | addresses are on the horizontal axis.
|
---|
514 |
|
---|
515 | +-----+----+--+
|
---|
516 | partial program # 1: |ttttt|dddd|00|
|
---|
517 | +-----+----+--+
|
---|
518 |
|
---|
519 | text data bss
|
---|
520 | seg. seg. seg.
|
---|
521 |
|
---|
522 | +---+---+---+
|
---|
523 | partial program # 2: |TTT|DDD|000|
|
---|
524 | +---+---+---+
|
---|
525 |
|
---|
526 | +--+---+-----+--+----+---+-----+~~
|
---|
527 | linked program: | |TTT|ttttt| |dddd|DDD|00000|
|
---|
528 | +--+---+-----+--+----+---+-----+~~
|
---|
529 |
|
---|
530 | addresses: 0 ...
|
---|
531 |
|
---|
532 |
|
---|
533 | File: as.info, Node: As Sections, Next: Sub-Sections, Prev: Ld Sections, Up: Sections
|
---|
534 |
|
---|
535 | Assembler Internal Sections
|
---|
536 | ===========================
|
---|
537 |
|
---|
538 | These sections are meant only for the internal use of `as'. They
|
---|
539 | have no meaning at run-time. You do not really need to know about these
|
---|
540 | sections for most purposes; but they can be mentioned in `as' warning
|
---|
541 | messages, so it might be helpful to have an idea of their meanings to
|
---|
542 | `as'. These sections are used to permit the value of every expression
|
---|
543 | in your assembly language program to be a section-relative address.
|
---|
544 |
|
---|
545 | ASSEMBLER-INTERNAL-LOGIC-ERROR!
|
---|
546 | An internal assembler logic error has been found. This means
|
---|
547 | there is a bug in the assembler.
|
---|
548 |
|
---|
549 | expr section
|
---|
550 | The assembler stores complex expression internally as combinations
|
---|
551 | of symbols. When it needs to represent an expression as a symbol,
|
---|
552 | it puts it in the expr section.
|
---|
553 |
|
---|
554 |
|
---|
555 | File: as.info, Node: Sub-Sections, Next: bss, Prev: As Sections, Up: Sections
|
---|
556 |
|
---|
557 | Sub-Sections
|
---|
558 | ============
|
---|
559 |
|
---|
560 | Assembled bytes conventionally fall into two sections: text and data.
|
---|
561 | You may have separate groups of data in named sections that you want to
|
---|
562 | end up near to each other in the object file, even though they are not
|
---|
563 | contiguous in the assembler source. `as' allows you to use
|
---|
564 | "subsections" for this purpose. Within each section, there can be
|
---|
565 | numbered subsections with values from 0 to 8192. Objects assembled
|
---|
566 | into the same subsection go into the object file together with other
|
---|
567 | objects in the same subsection. For example, a compiler might want to
|
---|
568 | store constants in the text section, but might not want to have them
|
---|
569 | interspersed with the program being assembled. In this case, the
|
---|
570 | compiler could issue a `.text 0' before each section of code being
|
---|
571 | output, and a `.text 1' before each group of constants being output.
|
---|
572 |
|
---|
573 | Subsections are optional. If you do not use subsections, everything
|
---|
574 | goes in subsection number zero.
|
---|
575 |
|
---|
576 | Each subsection is zero-padded up to a multiple of four bytes.
|
---|
577 | (Subsections may be padded a different amount on different flavors of
|
---|
578 | `as'.)
|
---|
579 |
|
---|
580 | Subsections appear in your object file in numeric order, lowest
|
---|
581 | numbered to highest. (All this to be compatible with other people's
|
---|
582 | assemblers.) The object file contains no representation of
|
---|
583 | subsections; `ld' and other programs that manipulate object files see
|
---|
584 | no trace of them. They just see all your text subsections as a text
|
---|
585 | section, and all your data subsections as a data section.
|
---|
586 |
|
---|
587 | To specify which subsection you want subsequent statements assembled
|
---|
588 | into, use a numeric argument to specify it, in a `.text EXPRESSION' or
|
---|
589 | a `.data EXPRESSION' statement. When generating COFF or ELF output, you
|
---|
590 | can also use an extra subsection argument with arbitrary named
|
---|
591 | sections: `.section NAME, EXPRESSION'. EXPRESSION should be an
|
---|
592 | absolute expression. (*Note Expressions::.) If you just say `.text'
|
---|
593 | then `.text 0' is assumed. Likewise `.data' means `.data 0'. Assembly
|
---|
594 | begins in `text 0'. For instance:
|
---|
595 | .text 0 # The default subsection is text 0 anyway.
|
---|
596 | .ascii "This lives in the first text subsection. *"
|
---|
597 | .text 1
|
---|
598 | .ascii "But this lives in the second text subsection."
|
---|
599 | .data 0
|
---|
600 | .ascii "This lives in the data section,"
|
---|
601 | .ascii "in the first data subsection."
|
---|
602 | .text 0
|
---|
603 | .ascii "This lives in the first text section,"
|
---|
604 | .ascii "immediately following the asterisk (*)."
|
---|
605 |
|
---|
606 | Each section has a "location counter" incremented by one for every
|
---|
607 | byte assembled into that section. Because subsections are merely a
|
---|
608 | convenience restricted to `as' there is no concept of a subsection
|
---|
609 | location counter. There is no way to directly manipulate a location
|
---|
610 | counter--but the `.align' directive changes it, and any label
|
---|
611 | definition captures its current value. The location counter of the
|
---|
612 | section where statements are being assembled is said to be the "active"
|
---|
613 | location counter.
|
---|
614 |
|
---|
615 |
|
---|
616 | File: as.info, Node: bss, Prev: Sub-Sections, Up: Sections
|
---|
617 |
|
---|
618 | bss Section
|
---|
619 | ===========
|
---|
620 |
|
---|
621 | The bss section is used for local common variable storage. You may
|
---|
622 | allocate address space in the bss section, but you may not dictate data
|
---|
623 | to load into it before your program executes. When your program starts
|
---|
624 | running, all the contents of the bss section are zeroed bytes.
|
---|
625 |
|
---|
626 | The `.lcomm' pseudo-op defines a symbol in the bss section; see
|
---|
627 | *Note `.lcomm': Lcomm.
|
---|
628 |
|
---|
629 | The `.comm' pseudo-op may be used to declare a common symbol, which
|
---|
630 | is another form of uninitialized symbol; see *Note `.comm': Comm.
|
---|
631 |
|
---|
632 | When assembling for a target which supports multiple sections, such
|
---|
633 | as ELF or COFF, you may switch into the `.bss' section and define
|
---|
634 | symbols as usual; see *Note `.section': Section. You may only assemble
|
---|
635 | zero values into the section. Typically the section will only contain
|
---|
636 | symbol definitions and `.skip' directives (*note `.skip': Skip.).
|
---|
637 |
|
---|
638 |
|
---|
639 | File: as.info, Node: Symbols, Next: Expressions, Prev: Sections, Up: Top
|
---|
640 |
|
---|
641 | Symbols
|
---|
642 | *******
|
---|
643 |
|
---|
644 | Symbols are a central concept: the programmer uses symbols to name
|
---|
645 | things, the linker uses symbols to link, and the debugger uses symbols
|
---|
646 | to debug.
|
---|
647 |
|
---|
648 | _Warning:_ `as' does not place symbols in the object file in the
|
---|
649 | same order they were declared. This may break some debuggers.
|
---|
650 |
|
---|
651 | * Menu:
|
---|
652 |
|
---|
653 | * Labels:: Labels
|
---|
654 | * Setting Symbols:: Giving Symbols Other Values
|
---|
655 | * Symbol Names:: Symbol Names
|
---|
656 | * Dot:: The Special Dot Symbol
|
---|
657 | * Symbol Attributes:: Symbol Attributes
|
---|
658 |
|
---|
659 |
|
---|
660 | File: as.info, Node: Labels, Next: Setting Symbols, Up: Symbols
|
---|
661 |
|
---|
662 | Labels
|
---|
663 | ======
|
---|
664 |
|
---|
665 | A "label" is written as a symbol immediately followed by a colon
|
---|
666 | `:'. The symbol then represents the current value of the active
|
---|
667 | location counter, and is, for example, a suitable instruction operand.
|
---|
668 | You are warned if you use the same symbol to represent two different
|
---|
669 | locations: the first definition overrides any other definitions.
|
---|
670 |
|
---|
671 | On the HPPA, the usual form for a label need not be immediately
|
---|
672 | followed by a colon, but instead must start in column zero. Only one
|
---|
673 | label may be defined on a single line. To work around this, the HPPA
|
---|
674 | version of `as' also provides a special directive `.label' for defining
|
---|
675 | labels more flexibly.
|
---|
676 |
|
---|
677 |
|
---|
678 | File: as.info, Node: Setting Symbols, Next: Symbol Names, Prev: Labels, Up: Symbols
|
---|
679 |
|
---|
680 | Giving Symbols Other Values
|
---|
681 | ===========================
|
---|
682 |
|
---|
683 | A symbol can be given an arbitrary value by writing a symbol,
|
---|
684 | followed by an equals sign `=', followed by an expression (*note
|
---|
685 | Expressions::). This is equivalent to using the `.set' directive.
|
---|
686 | *Note `.set': Set.
|
---|
687 |
|
---|
688 |
|
---|
689 | File: as.info, Node: Symbol Names, Next: Dot, Prev: Setting Symbols, Up: Symbols
|
---|
690 |
|
---|
691 | Symbol Names
|
---|
692 | ============
|
---|
693 |
|
---|
694 | Symbol names begin with a letter or with one of `._'. On most
|
---|
695 | machines, you can also use `$' in symbol names; exceptions are noted in
|
---|
696 | *Note Machine Dependencies::. That character may be followed by any
|
---|
697 | string of digits, letters, dollar signs (unless otherwise noted in
|
---|
698 | *Note Machine Dependencies::), and underscores. For the AMD 29K
|
---|
699 | family, `?' is also allowed in the body of a symbol name, though not at
|
---|
700 | its beginning.
|
---|
701 |
|
---|
702 | Case of letters is significant: `foo' is a different symbol name
|
---|
703 | than `Foo'.
|
---|
704 |
|
---|
705 | Each symbol has exactly one name. Each name in an assembly language
|
---|
706 | program refers to exactly one symbol. You may use that symbol name any
|
---|
707 | number of times in a program.
|
---|
708 |
|
---|
709 | Local Symbol Names
|
---|
710 | ------------------
|
---|
711 |
|
---|
712 | Local symbols help compilers and programmers use names temporarily.
|
---|
713 | They create symbols which are guaranteed to be unique over the entire
|
---|
714 | scope of the input source code and which can be referred to by a simple
|
---|
715 | notation. To define a local symbol, write a label of the form `N:'
|
---|
716 | (where N represents any positive integer). To refer to the most recent
|
---|
717 | previous definition of that symbol write `Nb', using the same number as
|
---|
718 | when you defined the label. To refer to the next definition of a local
|
---|
719 | label, write `Nf'-- The `b' stands for"backwards" and the `f' stands
|
---|
720 | for "forwards".
|
---|
721 |
|
---|
722 | There is no restriction on how you can use these labels, and you can
|
---|
723 | reuse them too. So that it is possible to repeatedly define the same
|
---|
724 | local label (using the same number `N'), although you can only refer to
|
---|
725 | the most recently defined local label of that number (for a backwards
|
---|
726 | reference) or the next definition of a specific local label for a
|
---|
727 | forward reference. It is also worth noting that the first 10 local
|
---|
728 | labels (`0:'...`9:') are implemented in a slightly more efficient
|
---|
729 | manner than the others.
|
---|
730 |
|
---|
731 | Here is an example:
|
---|
732 |
|
---|
733 | 1: branch 1f
|
---|
734 | 2: branch 1b
|
---|
735 | 1: branch 2f
|
---|
736 | 2: branch 1b
|
---|
737 |
|
---|
738 | Which is the equivalent of:
|
---|
739 |
|
---|
740 | label_1: branch label_3
|
---|
741 | label_2: branch label_1
|
---|
742 | label_3: branch label_4
|
---|
743 | label_4: branch label_3
|
---|
744 |
|
---|
745 | Local symbol names are only a notational device. They are
|
---|
746 | immediately transformed into more conventional symbol names before the
|
---|
747 | assembler uses them. The symbol names stored in the symbol table,
|
---|
748 | appearing in error messages and optionally emitted to the object file.
|
---|
749 | The names are constructed using these parts:
|
---|
750 |
|
---|
751 | `L'
|
---|
752 | All local labels begin with `L'. Normally both `as' and `ld'
|
---|
753 | forget symbols that start with `L'. These labels are used for
|
---|
754 | symbols you are never intended to see. If you use the `-L' option
|
---|
755 | then `as' retains these symbols in the object file. If you also
|
---|
756 | instruct `ld' to retain these symbols, you may use them in
|
---|
757 | debugging.
|
---|
758 |
|
---|
759 | `NUMBER'
|
---|
760 | This is the number that was used in the local label definition.
|
---|
761 | So if the label is written `55:' then the number is `55'.
|
---|
762 |
|
---|
763 | `C-B'
|
---|
764 | This unusual character is included so you do not accidentally
|
---|
765 | invent a symbol of the same name. The character has ASCII value
|
---|
766 | of `\002' (control-B).
|
---|
767 |
|
---|
768 | `_ordinal number_'
|
---|
769 | This is a serial number to keep the labels distinct. The first
|
---|
770 | definition of `0:' gets the number `1'. The 15th definition of
|
---|
771 | `0:' gets the number `15', and so on. Likewise the first
|
---|
772 | definition of `1:' gets the number `1' and its 15th defintion gets
|
---|
773 | `15' as well.
|
---|
774 |
|
---|
775 | So for example, the first `1:' is named `L1C-B1', the 44th `3:' is
|
---|
776 | named `L3C-B44'.
|
---|
777 |
|
---|
778 | Dollar Local Labels
|
---|
779 | -------------------
|
---|
780 |
|
---|
781 | `as' also supports an even more local form of local labels called
|
---|
782 | dollar labels. These labels go out of scope (ie they become undefined)
|
---|
783 | as soon as a non-local label is defined. Thus they remain valid for
|
---|
784 | only a small region of the input source code. Normal local labels, by
|
---|
785 | contrast, remain in scope for the entire file, or until they are
|
---|
786 | redefined by another occurrence of the same local label.
|
---|
787 |
|
---|
788 | Dollar labels are defined in exactly the same way as ordinary local
|
---|
789 | labels, except that instead of being terminated by a colon, they are
|
---|
790 | terminated by a dollar sign. eg `55$'.
|
---|
791 |
|
---|
792 | They can also be distinguished from ordinary local labels by their
|
---|
793 | transformed name which uses ASCII character `\001' (control-A) as the
|
---|
794 | magic character to distinguish them from ordinary labels. Thus the 5th
|
---|
795 | defintion of `6$' is named `L6C-A5'.
|
---|
796 |
|
---|
797 |
|
---|
798 | File: as.info, Node: Dot, Next: Symbol Attributes, Prev: Symbol Names, Up: Symbols
|
---|
799 |
|
---|
800 | The Special Dot Symbol
|
---|
801 | ======================
|
---|
802 |
|
---|
803 | The special symbol `.' refers to the current address that `as' is
|
---|
804 | assembling into. Thus, the expression `melvin: .long .' defines
|
---|
805 | `melvin' to contain its own address. Assigning a value to `.' is
|
---|
806 | treated the same as a `.org' directive. Thus, the expression `.=.+4'
|
---|
807 | is the same as saying `.space 4'.
|
---|
808 |
|
---|
809 |
|
---|
810 | File: as.info, Node: Symbol Attributes, Prev: Dot, Up: Symbols
|
---|
811 |
|
---|
812 | Symbol Attributes
|
---|
813 | =================
|
---|
814 |
|
---|
815 | Every symbol has, as well as its name, the attributes "Value" and
|
---|
816 | "Type". Depending on output format, symbols can also have auxiliary
|
---|
817 | attributes.
|
---|
818 |
|
---|
819 | If you use a symbol without defining it, `as' assumes zero for all
|
---|
820 | these attributes, and probably won't warn you. This makes the symbol
|
---|
821 | an externally defined symbol, which is generally what you would want.
|
---|
822 |
|
---|
823 | * Menu:
|
---|
824 |
|
---|
825 | * Symbol Value:: Value
|
---|
826 | * Symbol Type:: Type
|
---|
827 |
|
---|
828 |
|
---|
829 | * a.out Symbols:: Symbol Attributes: `a.out'
|
---|
830 |
|
---|
831 | * COFF Symbols:: Symbol Attributes for COFF
|
---|
832 |
|
---|
833 | * SOM Symbols:: Symbol Attributes for SOM
|
---|
834 |
|
---|
835 |
|
---|
836 | File: as.info, Node: Symbol Value, Next: Symbol Type, Up: Symbol Attributes
|
---|
837 |
|
---|
838 | Value
|
---|
839 | -----
|
---|
840 |
|
---|
841 | The value of a symbol is (usually) 32 bits. For a symbol which
|
---|
842 | labels a location in the text, data, bss or absolute sections the value
|
---|
843 | is the number of addresses from the start of that section to the label.
|
---|
844 | Naturally for text, data and bss sections the value of a symbol changes
|
---|
845 | as `ld' changes section base addresses during linking. Absolute
|
---|
846 | symbols' values do not change during linking: that is why they are
|
---|
847 | called absolute.
|
---|
848 |
|
---|
849 | The value of an undefined symbol is treated in a special way. If it
|
---|
850 | is 0 then the symbol is not defined in this assembler source file, and
|
---|
851 | `ld' tries to determine its value from other files linked into the same
|
---|
852 | program. You make this kind of symbol simply by mentioning a symbol
|
---|
853 | name without defining it. A non-zero value represents a `.comm' common
|
---|
854 | declaration. The value is how much common storage to reserve, in bytes
|
---|
855 | (addresses). The symbol refers to the first address of the allocated
|
---|
856 | storage.
|
---|
857 |
|
---|
858 |
|
---|
859 | File: as.info, Node: Symbol Type, Next: a.out Symbols, Prev: Symbol Value, Up: Symbol Attributes
|
---|
860 |
|
---|
861 | Type
|
---|
862 | ----
|
---|
863 |
|
---|
864 | The type attribute of a symbol contains relocation (section)
|
---|
865 | information, any flag settings indicating that a symbol is external, and
|
---|
866 | (optionally), other information for linkers and debuggers. The exact
|
---|
867 | format depends on the object-code output format in use.
|
---|
868 |
|
---|
869 |
|
---|
870 | File: as.info, Node: a.out Symbols, Next: COFF Symbols, Prev: Symbol Type, Up: Symbol Attributes
|
---|
871 |
|
---|
872 | Symbol Attributes: `a.out'
|
---|
873 | --------------------------
|
---|
874 |
|
---|
875 | * Menu:
|
---|
876 |
|
---|
877 | * Symbol Desc:: Descriptor
|
---|
878 | * Symbol Other:: Other
|
---|
879 |
|
---|
880 |
|
---|
881 | File: as.info, Node: Symbol Desc, Next: Symbol Other, Up: a.out Symbols
|
---|
882 |
|
---|
883 | Descriptor
|
---|
884 | ..........
|
---|
885 |
|
---|
886 | This is an arbitrary 16-bit value. You may establish a symbol's
|
---|
887 | descriptor value by using a `.desc' statement (*note `.desc': Desc.).
|
---|
888 | A descriptor value means nothing to `as'.
|
---|
889 |
|
---|
890 |
|
---|
891 | File: as.info, Node: Symbol Other, Prev: Symbol Desc, Up: a.out Symbols
|
---|
892 |
|
---|
893 | Other
|
---|
894 | .....
|
---|
895 |
|
---|
896 | This is an arbitrary 8-bit value. It means nothing to `as'.
|
---|
897 |
|
---|
898 |
|
---|
899 | File: as.info, Node: COFF Symbols, Next: SOM Symbols, Prev: a.out Symbols, Up: Symbol Attributes
|
---|
900 |
|
---|
901 | Symbol Attributes for COFF
|
---|
902 | --------------------------
|
---|
903 |
|
---|
904 | The COFF format supports a multitude of auxiliary symbol attributes;
|
---|
905 | like the primary symbol attributes, they are set between `.def' and
|
---|
906 | `.endef' directives.
|
---|
907 |
|
---|
908 | Primary Attributes
|
---|
909 | ..................
|
---|
910 |
|
---|
911 | The symbol name is set with `.def'; the value and type,
|
---|
912 | respectively, with `.val' and `.type'.
|
---|
913 |
|
---|
914 | Auxiliary Attributes
|
---|
915 | ....................
|
---|
916 |
|
---|
917 | The `as' directives `.dim', `.line', `.scl', `.size', and `.tag' can
|
---|
918 | generate auxiliary symbol table information for COFF.
|
---|
919 |
|
---|
920 |
|
---|
921 | File: as.info, Node: SOM Symbols, Prev: COFF Symbols, Up: Symbol Attributes
|
---|
922 |
|
---|
923 | Symbol Attributes for SOM
|
---|
924 | -------------------------
|
---|
925 |
|
---|
926 | The SOM format for the HPPA supports a multitude of symbol
|
---|
927 | attributes set with the `.EXPORT' and `.IMPORT' directives.
|
---|
928 |
|
---|
929 | The attributes are described in `HP9000 Series 800 Assembly Language
|
---|
930 | Reference Manual' (HP 92432-90001) under the `IMPORT' and `EXPORT'
|
---|
931 | assembler directive documentation.
|
---|
932 |
|
---|
933 |
|
---|
934 | File: as.info, Node: Expressions, Next: Pseudo Ops, Prev: Symbols, Up: Top
|
---|
935 |
|
---|
936 | Expressions
|
---|
937 | ***********
|
---|
938 |
|
---|
939 | An "expression" specifies an address or numeric value. Whitespace
|
---|
940 | may precede and/or follow an expression.
|
---|
941 |
|
---|
942 | The result of an expression must be an absolute number, or else an
|
---|
943 | offset into a particular section. If an expression is not absolute,
|
---|
944 | and there is not enough information when `as' sees the expression to
|
---|
945 | know its section, a second pass over the source program might be
|
---|
946 | necessary to interpret the expression--but the second pass is currently
|
---|
947 | not implemented. `as' aborts with an error message in this situation.
|
---|
948 |
|
---|
949 | * Menu:
|
---|
950 |
|
---|
951 | * Empty Exprs:: Empty Expressions
|
---|
952 | * Integer Exprs:: Integer Expressions
|
---|
953 |
|
---|
954 |
|
---|
955 | File: as.info, Node: Empty Exprs, Next: Integer Exprs, Up: Expressions
|
---|
956 |
|
---|
957 | Empty Expressions
|
---|
958 | =================
|
---|
959 |
|
---|
960 | An empty expression has no value: it is just whitespace or null.
|
---|
961 | Wherever an absolute expression is required, you may omit the
|
---|
962 | expression, and `as' assumes a value of (absolute) 0. This is
|
---|
963 | compatible with other assemblers.
|
---|
964 |
|
---|
965 |
|
---|
966 | File: as.info, Node: Integer Exprs, Prev: Empty Exprs, Up: Expressions
|
---|
967 |
|
---|
968 | Integer Expressions
|
---|
969 | ===================
|
---|
970 |
|
---|
971 | An "integer expression" is one or more _arguments_ delimited by
|
---|
972 | _operators_.
|
---|
973 |
|
---|
974 | * Menu:
|
---|
975 |
|
---|
976 | * Arguments:: Arguments
|
---|
977 | * Operators:: Operators
|
---|
978 | * Prefix Ops:: Prefix Operators
|
---|
979 | * Infix Ops:: Infix Operators
|
---|
980 |
|
---|
981 |
|
---|
982 | File: as.info, Node: Arguments, Next: Operators, Up: Integer Exprs
|
---|
983 |
|
---|
984 | Arguments
|
---|
985 | ---------
|
---|
986 |
|
---|
987 | "Arguments" are symbols, numbers or subexpressions. In other
|
---|
988 | contexts arguments are sometimes called "arithmetic operands". In this
|
---|
989 | manual, to avoid confusing them with the "instruction operands" of the
|
---|
990 | machine language, we use the term "argument" to refer to parts of
|
---|
991 | expressions only, reserving the word "operand" to refer only to machine
|
---|
992 | instruction operands.
|
---|
993 |
|
---|
994 | Symbols are evaluated to yield {SECTION NNN} where SECTION is one of
|
---|
995 | text, data, bss, absolute, or undefined. NNN is a signed, 2's
|
---|
996 | complement 32 bit integer.
|
---|
997 |
|
---|
998 | Numbers are usually integers.
|
---|
999 |
|
---|
1000 | A number can be a flonum or bignum. In this case, you are warned
|
---|
1001 | that only the low order 32 bits are used, and `as' pretends these 32
|
---|
1002 | bits are an integer. You may write integer-manipulating instructions
|
---|
1003 | that act on exotic constants, compatible with other assemblers.
|
---|
1004 |
|
---|
1005 | Subexpressions are a left parenthesis `(' followed by an integer
|
---|
1006 | expression, followed by a right parenthesis `)'; or a prefix operator
|
---|
1007 | followed by an argument.
|
---|
1008 |
|
---|
1009 |
|
---|
1010 | File: as.info, Node: Operators, Next: Prefix Ops, Prev: Arguments, Up: Integer Exprs
|
---|
1011 |
|
---|
1012 | Operators
|
---|
1013 | ---------
|
---|
1014 |
|
---|
1015 | "Operators" are arithmetic functions, like `+' or `%'. Prefix
|
---|
1016 | operators are followed by an argument. Infix operators appear between
|
---|
1017 | their arguments. Operators may be preceded and/or followed by
|
---|
1018 | whitespace.
|
---|
1019 |
|
---|
1020 |
|
---|
1021 | File: as.info, Node: Prefix Ops, Next: Infix Ops, Prev: Operators, Up: Integer Exprs
|
---|
1022 |
|
---|
1023 | Prefix Operator
|
---|
1024 | ---------------
|
---|
1025 |
|
---|
1026 | `as' has the following "prefix operators". They each take one
|
---|
1027 | argument, which must be absolute.
|
---|
1028 |
|
---|
1029 | `-'
|
---|
1030 | "Negation". Two's complement negation.
|
---|
1031 |
|
---|
1032 | `~'
|
---|
1033 | "Complementation". Bitwise not.
|
---|
1034 |
|
---|
1035 |
|
---|
1036 | File: as.info, Node: Infix Ops, Prev: Prefix Ops, Up: Integer Exprs
|
---|
1037 |
|
---|
1038 | Infix Operators
|
---|
1039 | ---------------
|
---|
1040 |
|
---|
1041 | "Infix operators" take two arguments, one on either side. Operators
|
---|
1042 | have precedence, but operations with equal precedence are performed left
|
---|
1043 | to right. Apart from `+' or `-', both arguments must be absolute, and
|
---|
1044 | the result is absolute.
|
---|
1045 |
|
---|
1046 | 1. Highest Precedence
|
---|
1047 |
|
---|
1048 | `*'
|
---|
1049 | "Multiplication".
|
---|
1050 |
|
---|
1051 | `/'
|
---|
1052 | "Division". Truncation is the same as the C operator `/'
|
---|
1053 |
|
---|
1054 | `%'
|
---|
1055 | "Remainder".
|
---|
1056 |
|
---|
1057 | `<'
|
---|
1058 | `<<'
|
---|
1059 | "Shift Left". Same as the C operator `<<'.
|
---|
1060 |
|
---|
1061 | `>'
|
---|
1062 | `>>'
|
---|
1063 | "Shift Right". Same as the C operator `>>'.
|
---|
1064 |
|
---|
1065 | 2. Intermediate precedence
|
---|
1066 |
|
---|
1067 | `|'
|
---|
1068 | "Bitwise Inclusive Or".
|
---|
1069 |
|
---|
1070 | `&'
|
---|
1071 | "Bitwise And".
|
---|
1072 |
|
---|
1073 | `^'
|
---|
1074 | "Bitwise Exclusive Or".
|
---|
1075 |
|
---|
1076 | `!'
|
---|
1077 | "Bitwise Or Not".
|
---|
1078 |
|
---|
1079 | 3. Low Precedence
|
---|
1080 |
|
---|
1081 | `+'
|
---|
1082 | "Addition". If either argument is absolute, the result has
|
---|
1083 | the section of the other argument. You may not add together
|
---|
1084 | arguments from different sections.
|
---|
1085 |
|
---|
1086 | `-'
|
---|
1087 | "Subtraction". If the right argument is absolute, the result
|
---|
1088 | has the section of the left argument. If both arguments are
|
---|
1089 | in the same section, the result is absolute. You may not
|
---|
1090 | subtract arguments from different sections.
|
---|
1091 |
|
---|
1092 | `=='
|
---|
1093 | "Is Equal To"
|
---|
1094 |
|
---|
1095 | `<>'
|
---|
1096 | "Is Not Equal To"
|
---|
1097 |
|
---|
1098 | `<'
|
---|
1099 | "Is Less Than"
|
---|
1100 |
|
---|
1101 | `>'
|
---|
1102 | "Is Greater Than"
|
---|
1103 |
|
---|
1104 | `>='
|
---|
1105 | "Is Greater Than Or Equal To"
|
---|
1106 |
|
---|
1107 | `<='
|
---|
1108 | "Is Less Than Or Equal To"
|
---|
1109 |
|
---|
1110 | The comparison operators can be used as infix operators. A
|
---|
1111 | true results has a value of -1 whereas a false result has a
|
---|
1112 | value of 0. Note, these operators perform signed
|
---|
1113 | comparisons.
|
---|
1114 |
|
---|
1115 | 4. Lowest Precedence
|
---|
1116 |
|
---|
1117 | `&&'
|
---|
1118 | "Logical And".
|
---|
1119 |
|
---|
1120 | `||'
|
---|
1121 | "Logical Or".
|
---|
1122 |
|
---|
1123 | These two logical operations can be used to combine the
|
---|
1124 | results of sub expressions. Note, unlike the comparison
|
---|
1125 | operators a true result returns a value of 1 but a false
|
---|
1126 | results does still return 0. Also note that the logical or
|
---|
1127 | operator has a slightly lower precedence than logical and.
|
---|
1128 |
|
---|
1129 |
|
---|
1130 | In short, it's only meaningful to add or subtract the _offsets_ in an
|
---|
1131 | address; you can only have a defined section in one of the two
|
---|
1132 | arguments.
|
---|
1133 |
|
---|
1134 |
|
---|
1135 | File: as.info, Node: Pseudo Ops, Next: Machine Dependencies, Prev: Expressions, Up: Top
|
---|
1136 |
|
---|
1137 | Assembler Directives
|
---|
1138 | ********************
|
---|
1139 |
|
---|
1140 | All assembler directives have names that begin with a period (`.').
|
---|
1141 | The rest of the name is letters, usually in lower case.
|
---|
1142 |
|
---|
1143 | This chapter discusses directives that are available regardless of
|
---|
1144 | the target machine configuration for the GNU assembler. Some machine
|
---|
1145 | configurations provide additional directives. *Note Machine
|
---|
1146 | Dependencies::.
|
---|
1147 |
|
---|
1148 | * Menu:
|
---|
1149 |
|
---|
1150 | * Abort:: `.abort'
|
---|
1151 |
|
---|
1152 | * ABORT:: `.ABORT'
|
---|
1153 |
|
---|
1154 | * Align:: `.align ABS-EXPR , ABS-EXPR'
|
---|
1155 | * Ascii:: `.ascii "STRING"'...
|
---|
1156 | * Asciz:: `.asciz "STRING"'...
|
---|
1157 | * Balign:: `.balign ABS-EXPR , ABS-EXPR'
|
---|
1158 | * Byte:: `.byte EXPRESSIONS'
|
---|
1159 | * Comm:: `.comm SYMBOL , LENGTH '
|
---|
1160 | * Data:: `.data SUBSECTION'
|
---|
1161 |
|
---|
1162 | * Def:: `.def NAME'
|
---|
1163 |
|
---|
1164 | * Desc:: `.desc SYMBOL, ABS-EXPRESSION'
|
---|
1165 |
|
---|
1166 | * Dim:: `.dim'
|
---|
1167 |
|
---|
1168 | * Double:: `.double FLONUMS'
|
---|
1169 | * Eject:: `.eject'
|
---|
1170 | * Else:: `.else'
|
---|
1171 | * Elseif:: `.elseif'
|
---|
1172 | * End:: `.end'
|
---|
1173 |
|
---|
1174 | * Endef:: `.endef'
|
---|
1175 |
|
---|
1176 | * Endfunc:: `.endfunc'
|
---|
1177 | * Endif:: `.endif'
|
---|
1178 | * Equ:: `.equ SYMBOL, EXPRESSION'
|
---|
1179 | * Equiv:: `.equiv SYMBOL, EXPRESSION'
|
---|
1180 | * Err:: `.err'
|
---|
1181 | * Exitm:: `.exitm'
|
---|
1182 | * Extern:: `.extern'
|
---|
1183 | * Fail:: `.fail'
|
---|
1184 |
|
---|
1185 | * File:: `.file STRING'
|
---|
1186 |
|
---|
1187 | * Fill:: `.fill REPEAT , SIZE , VALUE'
|
---|
1188 | * Float:: `.float FLONUMS'
|
---|
1189 | * Func:: `.func'
|
---|
1190 | * Global:: `.global SYMBOL', `.globl SYMBOL'
|
---|
1191 |
|
---|
1192 | * Hidden:: `.hidden NAMES'
|
---|
1193 |
|
---|
1194 | * hword:: `.hword EXPRESSIONS'
|
---|
1195 | * Ident:: `.ident'
|
---|
1196 | * If:: `.if ABSOLUTE EXPRESSION'
|
---|
1197 | * Incbin:: `.incbin "FILE"[,SKIP[,COUNT]]'
|
---|
1198 | * Include:: `.include "FILE"'
|
---|
1199 | * Int:: `.int EXPRESSIONS'
|
---|
1200 |
|
---|
1201 | * Internal:: `.internal NAMES'
|
---|
1202 |
|
---|
1203 | * Irp:: `.irp SYMBOL,VALUES'...
|
---|
1204 | * Irpc:: `.irpc SYMBOL,VALUES'...
|
---|
1205 | * Lcomm:: `.lcomm SYMBOL , LENGTH'
|
---|
1206 | * Lflags:: `.lflags'
|
---|
1207 |
|
---|
1208 | * Line:: `.line LINE-NUMBER'
|
---|
1209 |
|
---|
1210 | * Ln:: `.ln LINE-NUMBER'
|
---|
1211 | * Linkonce:: `.linkonce [TYPE]'
|
---|
1212 | * List:: `.list'
|
---|
1213 | * Long:: `.long EXPRESSIONS'
|
---|
1214 |
|
---|
1215 | * Macro:: `.macro NAME ARGS'...
|
---|
1216 | * MRI:: `.mri VAL'
|
---|
1217 | * Nolist:: `.nolist'
|
---|
1218 | * Octa:: `.octa BIGNUMS'
|
---|
1219 | * Org:: `.org NEW-LC , FILL'
|
---|
1220 | * P2align:: `.p2align ABS-EXPR , ABS-EXPR'
|
---|
1221 |
|
---|
1222 | * PopSection:: `.popsection'
|
---|
1223 | * Previous:: `.previous'
|
---|
1224 |
|
---|
1225 | * Print:: `.print STRING'
|
---|
1226 |
|
---|
1227 | * Protected:: `.protected NAMES'
|
---|
1228 |
|
---|
1229 | * Psize:: `.psize LINES, COLUMNS'
|
---|
1230 | * Purgem:: `.purgem NAME'
|
---|
1231 |
|
---|
1232 | * PushSection:: `.pushsection NAME'
|
---|
1233 |
|
---|
1234 | * Quad:: `.quad BIGNUMS'
|
---|
1235 | * Rept:: `.rept COUNT'
|
---|
1236 | * Sbttl:: `.sbttl "SUBHEADING"'
|
---|
1237 |
|
---|
1238 | * Scl:: `.scl CLASS'
|
---|
1239 |
|
---|
1240 | * Section:: `.section NAME'
|
---|
1241 |
|
---|
1242 | * Set:: `.set SYMBOL, EXPRESSION'
|
---|
1243 | * Short:: `.short EXPRESSIONS'
|
---|
1244 | * Single:: `.single FLONUMS'
|
---|
1245 |
|
---|
1246 | * Size:: `.size [NAME , EXPRESSION]'
|
---|
1247 |
|
---|
1248 | * Skip:: `.skip SIZE , FILL'
|
---|
1249 | * Sleb128:: `.sleb128 EXPRESSIONS'
|
---|
1250 | * Space:: `.space SIZE , FILL'
|
---|
1251 |
|
---|
1252 | * Stab:: `.stabd, .stabn, .stabs'
|
---|
1253 |
|
---|
1254 | * String:: `.string "STR"'
|
---|
1255 | * Struct:: `.struct EXPRESSION'
|
---|
1256 |
|
---|
1257 | * SubSection:: `.subsection'
|
---|
1258 | * Symver:: `.symver NAME,NAME2@NODENAME'
|
---|
1259 |
|
---|
1260 |
|
---|
1261 | * Tag:: `.tag STRUCTNAME'
|
---|
1262 |
|
---|
1263 | * Text:: `.text SUBSECTION'
|
---|
1264 | * Title:: `.title "HEADING"'
|
---|
1265 |
|
---|
1266 | * Type:: `.type <INT | NAME , TYPE DESCRIPTION>'
|
---|
1267 |
|
---|
1268 | * Uleb128:: `.uleb128 EXPRESSIONS'
|
---|
1269 |
|
---|
1270 | * Val:: `.val ADDR'
|
---|
1271 |
|
---|
1272 |
|
---|
1273 | * Version:: `.version "STRING"'
|
---|
1274 | * VTableEntry:: `.vtable_entry TABLE, OFFSET'
|
---|
1275 | * VTableInherit:: `.vtable_inherit CHILD, PARENT'
|
---|
1276 | * Weak:: `.weak NAMES'
|
---|
1277 |
|
---|
1278 | * Word:: `.word EXPRESSIONS'
|
---|
1279 | * Deprecated:: Deprecated Directives
|
---|
1280 |
|
---|
1281 |
|
---|
1282 | File: as.info, Node: Abort, Next: ABORT, Up: Pseudo Ops
|
---|
1283 |
|
---|
1284 | `.abort'
|
---|
1285 | ========
|
---|
1286 |
|
---|
1287 | This directive stops the assembly immediately. It is for
|
---|
1288 | compatibility with other assemblers. The original idea was that the
|
---|
1289 | assembly language source would be piped into the assembler. If the
|
---|
1290 | sender of the source quit, it could use this directive tells `as' to
|
---|
1291 | quit also. One day `.abort' will not be supported.
|
---|
1292 |
|
---|
1293 |
|
---|
1294 | File: as.info, Node: ABORT, Next: Align, Prev: Abort, Up: Pseudo Ops
|
---|
1295 |
|
---|
1296 | `.ABORT'
|
---|
1297 | ========
|
---|
1298 |
|
---|
1299 | When producing COFF output, `as' accepts this directive as a synonym
|
---|
1300 | for `.abort'.
|
---|
1301 |
|
---|
1302 | When producing `b.out' output, `as' accepts this directive, but
|
---|
1303 | ignores it.
|
---|
1304 |
|
---|
1305 |
|
---|
1306 | File: as.info, Node: Align, Next: Ascii, Prev: ABORT, Up: Pseudo Ops
|
---|
1307 |
|
---|
1308 | `.align ABS-EXPR, ABS-EXPR, ABS-EXPR'
|
---|
1309 | =====================================
|
---|
1310 |
|
---|
1311 | Pad the location counter (in the current subsection) to a particular
|
---|
1312 | storage boundary. The first expression (which must be absolute) is the
|
---|
1313 | alignment required, as described below.
|
---|
1314 |
|
---|
1315 | The second expression (also absolute) gives the fill value to be
|
---|
1316 | stored in the padding bytes. It (and the comma) may be omitted. If it
|
---|
1317 | is omitted, the padding bytes are normally zero. However, on some
|
---|
1318 | systems, if the section is marked as containing code and the fill value
|
---|
1319 | is omitted, the space is filled with no-op instructions.
|
---|
1320 |
|
---|
1321 | The third expression is also absolute, and is also optional. If it
|
---|
1322 | is present, it is the maximum number of bytes that should be skipped by
|
---|
1323 | this alignment directive. If doing the alignment would require
|
---|
1324 | skipping more bytes than the specified maximum, then the alignment is
|
---|
1325 | not done at all. You can omit the fill value (the second argument)
|
---|
1326 | entirely by simply using two commas after the required alignment; this
|
---|
1327 | can be useful if you want the alignment to be filled with no-op
|
---|
1328 | instructions when appropriate.
|
---|
1329 |
|
---|
1330 | The way the required alignment is specified varies from system to
|
---|
1331 | system. For the a29k, hppa, m68k, m88k, w65, sparc, Xtensa, and
|
---|
1332 | Renesas / SuperH SH, and i386 using ELF format, the first expression is
|
---|
1333 | the alignment request in bytes. For example `.align 8' advances the
|
---|
1334 | location counter until it is a multiple of 8. If the location counter
|
---|
1335 | is already a multiple of 8, no change is needed.
|
---|
1336 |
|
---|
1337 | For other systems, including the i386 using a.out format, and the
|
---|
1338 | arm and strongarm, it is the number of low-order zero bits the location
|
---|
1339 | counter must have after advancement. For example `.align 3' advances
|
---|
1340 | the location counter until it a multiple of 8. If the location counter
|
---|
1341 | is already a multiple of 8, no change is needed.
|
---|
1342 |
|
---|
1343 | This inconsistency is due to the different behaviors of the various
|
---|
1344 | native assemblers for these systems which GAS must emulate. GAS also
|
---|
1345 | provides `.balign' and `.p2align' directives, described later, which
|
---|
1346 | have a consistent behavior across all architectures (but are specific
|
---|
1347 | to GAS).
|
---|
1348 |
|
---|
1349 |
|
---|
1350 | File: as.info, Node: Ascii, Next: Asciz, Prev: Align, Up: Pseudo Ops
|
---|
1351 |
|
---|
1352 | `.ascii "STRING"'...
|
---|
1353 | ====================
|
---|
1354 |
|
---|
1355 | `.ascii' expects zero or more string literals (*note Strings::)
|
---|
1356 | separated by commas. It assembles each string (with no automatic
|
---|
1357 | trailing zero byte) into consecutive addresses.
|
---|
1358 |
|
---|
1359 |
|
---|
1360 | File: as.info, Node: Asciz, Next: Balign, Prev: Ascii, Up: Pseudo Ops
|
---|
1361 |
|
---|
1362 | `.asciz "STRING"'...
|
---|
1363 | ====================
|
---|
1364 |
|
---|
1365 | `.asciz' is just like `.ascii', but each string is followed by a
|
---|
1366 | zero byte. The "z" in `.asciz' stands for "zero".
|
---|
1367 |
|
---|