Mercurial > hg > index.cgi
comparison docs/manual/x555.html @ 324:b30091890d62
Add documentation of the new hex output formats.
Thanks to text contributed by Tom LeMense, the manual now includes
documentation of the hex formats he contributed. This also includes some
updated text on the ORG directive. Only minor editorial changes vary the
text from Tom's original.
author | William Astle <lost@l-w.ca> |
---|---|
date | Tue, 04 Mar 2014 23:10:13 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
323:ba9a0434b115 | 324:b30091890d62 |
---|---|
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> | |
2 <HTML | |
3 ><HEAD | |
4 ><TITLE | |
5 >Object Files and Sections</TITLE | |
6 ><META | |
7 NAME="GENERATOR" | |
8 CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK | |
9 REL="HOME" | |
10 TITLE="LW Tool Chain" | |
11 HREF="index.html"><LINK | |
12 REL="UP" | |
13 TITLE="LWASM" | |
14 HREF="c62.html"><LINK | |
15 REL="PREVIOUS" | |
16 TITLE="Structures" | |
17 HREF="x534.html"><LINK | |
18 REL="NEXT" | |
19 TITLE="Assembler Modes and Pragmas" | |
20 HREF="x619.html"></HEAD | |
21 ><BODY | |
22 CLASS="SECTION" | |
23 BGCOLOR="#FFFFFF" | |
24 TEXT="#000000" | |
25 LINK="#0000FF" | |
26 VLINK="#840084" | |
27 ALINK="#0000FF" | |
28 ><DIV | |
29 CLASS="NAVHEADER" | |
30 ><TABLE | |
31 SUMMARY="Header navigation table" | |
32 WIDTH="100%" | |
33 BORDER="0" | |
34 CELLPADDING="0" | |
35 CELLSPACING="0" | |
36 ><TR | |
37 ><TH | |
38 COLSPAN="3" | |
39 ALIGN="center" | |
40 >LW Tool Chain</TH | |
41 ></TR | |
42 ><TR | |
43 ><TD | |
44 WIDTH="10%" | |
45 ALIGN="left" | |
46 VALIGN="bottom" | |
47 ><A | |
48 HREF="x534.html" | |
49 ACCESSKEY="P" | |
50 >Prev</A | |
51 ></TD | |
52 ><TD | |
53 WIDTH="80%" | |
54 ALIGN="center" | |
55 VALIGN="bottom" | |
56 >Chapter 3. LWASM</TD | |
57 ><TD | |
58 WIDTH="10%" | |
59 ALIGN="right" | |
60 VALIGN="bottom" | |
61 ><A | |
62 HREF="x619.html" | |
63 ACCESSKEY="N" | |
64 >Next</A | |
65 ></TD | |
66 ></TR | |
67 ></TABLE | |
68 ><HR | |
69 ALIGN="LEFT" | |
70 WIDTH="100%"></DIV | |
71 ><DIV | |
72 CLASS="SECTION" | |
73 ><H1 | |
74 CLASS="SECTION" | |
75 ><A | |
76 NAME="AEN555" | |
77 >3.9. Object Files and Sections</A | |
78 ></H1 | |
79 ><P | |
80 >The object file target is very useful for large project because it allows | |
81 multiple files to be assembled independently and then linked into the final | |
82 binary at a later time. It allows only the small portion of the project | |
83 that was modified to be re-assembled rather than requiring the entire set | |
84 of source code to be available to the assembler in a single assembly process. | |
85 This can be particularly important if there are a large number of macros, | |
86 symbol definitions, or other metadata that uses resources at assembly time. | |
87 By far the largest benefit, however, is keeping the source files small enough | |
88 for a mere mortal to find things in them.</P | |
89 ><P | |
90 >With multi-file projects, there needs to be a means of resolving references to | |
91 symbols in other source files. These are known as external references. The | |
92 addresses of these symbols cannot be known until the linker joins all the | |
93 object files into a single binary. This means that the assembler must be | |
94 able to output the object code without knowing the value of the symbol. This | |
95 places some restrictions on the code generated by the assembler. For | |
96 example, the assembler cannot generate direct page addressing for instructions | |
97 that reference external symbols because the address of the symbol may not | |
98 be in the direct page. Similarly, relative branches and PC relative addressing | |
99 cannot be used in their eight bit forms. Everything that must be resolved | |
100 by the linker must be assembled to use the largest address size possible to | |
101 allow the linker to fill in the correct value at link time. Note that the | |
102 same problem applies to absolute address references as well, even those in | |
103 the same source file, because the address is not known until link time.</P | |
104 ><P | |
105 >It is often desired in multi-file projects to have code of various types grouped | |
106 together in the final binary generated by the linker as well. The same applies | |
107 to data. In order for the linker to do that, the bits that are to be grouped | |
108 must be tagged in some manner. This is where the concept of sections comes in. | |
109 Each chunk of code or data is part of a section in the object file. Then, | |
110 when the linker reads all the object files, it coalesces all sections of the | |
111 same name into a single section and then considers it as a unit.</P | |
112 ><P | |
113 >The existence of sections, however, raises a problem for symbols even | |
114 within the same source file. Thus, the assembler must treat symbols from | |
115 different sections within the same source file in the same manner as external | |
116 symbols. That is, it must leave them for the linker to resolve at link time, | |
117 with all the limitations that entails.</P | |
118 ><P | |
119 >In the object file target mode, LWASM requires all source lines that | |
120 cause bytes to be output to be inside a section. Any directives that do | |
121 not cause any bytes to be output can appear outside of a section. This includes | |
122 such things as EQU or RMB. Even ORG can appear outside a section. ORG, however, | |
123 makes no sense within a section because it is the linker that determines | |
124 the starting address of the section's code, not the assembler.</P | |
125 ><P | |
126 >All symbols defined globally in the assembly process are local to the | |
127 source file and cannot be exported. All symbols defined within a section are | |
128 considered local to the source file unless otherwise explicitly exported. | |
129 Symbols referenced from external source files must be declared external, | |
130 either explicitly or by asking the assembler to assume that all undefined | |
131 symbols are external.</P | |
132 ><P | |
133 >It is often handy to define a number of memory addresses that will be | |
134 used for data at run-time but which need not be included in the binary file. | |
135 These memory addresses are not initialized until run-time, either by the | |
136 program itself or by the program loader, depending on the operating environment. | |
137 Such sections are often known as BSS sections. LWASM supports generating | |
138 sections with a BSS attribute set which causes the section definition including | |
139 symbols exported from that section and those symbols required to resolve | |
140 references from the local file, but with no actual code in the object file. | |
141 It is illegal for any source lines within a BSS flagged section to cause any | |
142 bytes to be output.</P | |
143 ><P | |
144 >The following directives apply to section handling.</P | |
145 ><P | |
146 ></P | |
147 ><DIV | |
148 CLASS="VARIABLELIST" | |
149 ><DL | |
150 ><DT | |
151 >SECTION <CODE | |
152 CLASS="PARAMETER" | |
153 >name[,flags]</CODE | |
154 >, SECT <CODE | |
155 CLASS="PARAMETER" | |
156 >name[,flags]</CODE | |
157 >, .AREA <CODE | |
158 CLASS="PARAMETER" | |
159 >name[,flags]</CODE | |
160 ></DT | |
161 ><DD | |
162 ><P | |
163 >Instructs the assembler that the code following this directive is to be | |
164 considered part of the section <CODE | |
165 CLASS="PARAMETER" | |
166 >name</CODE | |
167 >. A section name | |
168 may appear multiple times in which case it is as though all the code from | |
169 all the instances of that section appeared adjacent within the source file. | |
170 However, <CODE | |
171 CLASS="PARAMETER" | |
172 >flags</CODE | |
173 > may only be specified on the first | |
174 instance of the section.</P | |
175 ><P | |
176 ><CODE | |
177 CLASS="PARAMETER" | |
178 >flags</CODE | |
179 > is a comma separated list of flags. If a | |
180 flag is "bss", the section will be treated as a BSS section and no | |
181 statements that generate output are permitted.</P | |
182 ><P | |
183 >If the flag is "constant", | |
184 the same restrictions apply as for BSS sections. Additionally, all symbols | |
185 defined in a constant section define absolute values and will not be | |
186 adjusted by the linker at link time. Constant sections cannot define | |
187 complex expressions for symbols; the value must be fully defined at assembly | |
188 time. Additionally, multiple instances of a constant section do not | |
189 coalesce into a single addressing unit; each instance starts again at offset | |
190 0.</P | |
191 ><P | |
192 >If the section name is "bss" or ".bss" in any combination of upper and | |
193 lower case, the section is assumed to be a BSS section. In that case, | |
194 the flag <CODE | |
195 CLASS="PARAMETER" | |
196 >!bss</CODE | |
197 > can be used to override this assumption.</P | |
198 ><P | |
199 > If the section name is "_constants" or "_constant", in any | |
200 combination of upper and lower case, the section is assumed to be a constant | |
201 section. This assumption can be overridden with the "!constant" | |
202 flag.</P | |
203 ><P | |
204 >If assembly is already happening within a section, the section is implicitly | |
205 ended and the new section started. This is not considered an error although | |
206 it is recommended that all sections be explicitly closed.</P | |
207 ></DD | |
208 ><DT | |
209 >ENDSECTION, ENDSECT</DT | |
210 ><DD | |
211 ><P | |
212 >This directive ends the current section. This puts assembly outside of any | |
213 sections until the next SECTION directive. ENDSECTION is the preferred form. | |
214 Prior to version 3.0 of LWASM, ENDS could also be used to end a section but | |
215 as of version 3.0, it is now an alias for ENDSTRUCT instead.</P | |
216 ></DD | |
217 ><DT | |
218 ><CODE | |
219 CLASS="PARAMETER" | |
220 >sym</CODE | |
221 > EXTERN, <CODE | |
222 CLASS="PARAMETER" | |
223 >sym</CODE | |
224 > EXTERNAL, <CODE | |
225 CLASS="PARAMETER" | |
226 >sym</CODE | |
227 > IMPORT</DT | |
228 ><DD | |
229 ><P | |
230 >This directive defines <CODE | |
231 CLASS="PARAMETER" | |
232 >sym</CODE | |
233 > as an external symbol. | |
234 This directive may occur at any point in the source code. EXTERN definitions | |
235 are resolved on the first pass so an EXTERN definition anywhere in the | |
236 source file is valid for the entire file. The use of this directive is | |
237 optional when the assembler is instructed to assume that all undefined | |
238 symbols are external. In fact, in that mode, if the symbol is referenced | |
239 before the EXTERN directive, an error will occur.</P | |
240 ></DD | |
241 ><DT | |
242 ><CODE | |
243 CLASS="PARAMETER" | |
244 >sym</CODE | |
245 > EXPORT, <CODE | |
246 CLASS="PARAMETER" | |
247 >sym</CODE | |
248 > .GLOBL, EXPORT <CODE | |
249 CLASS="PARAMETER" | |
250 >sym</CODE | |
251 >, .GLOBL <CODE | |
252 CLASS="PARAMETER" | |
253 >sym</CODE | |
254 ></DT | |
255 ><DD | |
256 ><P | |
257 >This directive defines <CODE | |
258 CLASS="PARAMETER" | |
259 >sym</CODE | |
260 > as an exported symbol. | |
261 This directive may occur at any point in the source code, even before the | |
262 definition of the exported symbol.</P | |
263 ><P | |
264 >Note that <CODE | |
265 CLASS="PARAMETER" | |
266 >sym</CODE | |
267 > may appear as the operand or as the | |
268 statement's symbol. If there is a symbol on the statement, that will | |
269 take precedence over any operand that is present.</P | |
270 ></DD | |
271 ><DT | |
272 ><CODE | |
273 CLASS="PARAMETER" | |
274 >sym</CODE | |
275 > EXTDEP</DT | |
276 ><DD | |
277 ><P | |
278 >This directive forces an external dependency on | |
279 <CODE | |
280 CLASS="PARAMETER" | |
281 >sym</CODE | |
282 >, even if it is never referenced anywhere else in | |
283 this file.</P | |
284 ></DD | |
285 ></DL | |
286 ></DIV | |
287 ></DIV | |
288 ><DIV | |
289 CLASS="NAVFOOTER" | |
290 ><HR | |
291 ALIGN="LEFT" | |
292 WIDTH="100%"><TABLE | |
293 SUMMARY="Footer navigation table" | |
294 WIDTH="100%" | |
295 BORDER="0" | |
296 CELLPADDING="0" | |
297 CELLSPACING="0" | |
298 ><TR | |
299 ><TD | |
300 WIDTH="33%" | |
301 ALIGN="left" | |
302 VALIGN="top" | |
303 ><A | |
304 HREF="x534.html" | |
305 ACCESSKEY="P" | |
306 >Prev</A | |
307 ></TD | |
308 ><TD | |
309 WIDTH="34%" | |
310 ALIGN="center" | |
311 VALIGN="top" | |
312 ><A | |
313 HREF="index.html" | |
314 ACCESSKEY="H" | |
315 >Home</A | |
316 ></TD | |
317 ><TD | |
318 WIDTH="33%" | |
319 ALIGN="right" | |
320 VALIGN="top" | |
321 ><A | |
322 HREF="x619.html" | |
323 ACCESSKEY="N" | |
324 >Next</A | |
325 ></TD | |
326 ></TR | |
327 ><TR | |
328 ><TD | |
329 WIDTH="33%" | |
330 ALIGN="left" | |
331 VALIGN="top" | |
332 >Structures</TD | |
333 ><TD | |
334 WIDTH="34%" | |
335 ALIGN="center" | |
336 VALIGN="top" | |
337 ><A | |
338 HREF="c62.html" | |
339 ACCESSKEY="U" | |
340 >Up</A | |
341 ></TD | |
342 ><TD | |
343 WIDTH="33%" | |
344 ALIGN="right" | |
345 VALIGN="top" | |
346 >Assembler Modes and Pragmas</TD | |
347 ></TR | |
348 ></TABLE | |
349 ></DIV | |
350 ></BODY | |
351 ></HTML | |
352 > |