]>
Commit | Line | Data |
---|---|---|
aa820537 | 1 | @c Copyright 2001, 2002, 2003, 2006 Free Software Foundation, Inc. |
3c3bdf30 NC |
2 | @c This is part of the GAS manual. |
3 | @c For copying conditions, see the file as.texinfo. | |
4 | @c MMIX description by Hans-Peter Nilsson, [email protected] | |
5 | @ifset GENERIC | |
6 | @page | |
7 | @node MMIX-Dependent | |
8 | @chapter MMIX Dependent Features | |
9 | @end ifset | |
10 | @ifclear GENERIC | |
11 | @node Machine Dependencies | |
12 | @chapter MMIX Dependent Features | |
13 | @end ifclear | |
14 | ||
15 | @cindex MMIX support | |
16 | @menu | |
17 | * MMIX-Opts:: Command-line Options | |
18 | * MMIX-Expand:: Instruction expansion | |
19 | * MMIX-Syntax:: Syntax | |
20 | * MMIX-mmixal:: Differences to @code{mmixal} syntax and semantics | |
21 | @end menu | |
22 | ||
23 | @node MMIX-Opts | |
24 | @section Command-line Options | |
25 | ||
26 | @cindex options, MMIX | |
27 | @cindex MMIX options | |
28 | The MMIX version of @code{@value{AS}} has some machine-dependent options. | |
29 | ||
30 | @cindex @samp{--fixed-special-register-names} command line option, MMIX | |
31 | When @samp{--fixed-special-register-names} is specified, only the register | |
32 | names specified in @ref{MMIX-Regs} are recognized in the instructions | |
33 | @code{PUT} and @code{GET}. | |
34 | ||
35 | @cindex @samp{--globalize-symbols} command line option, MMIX | |
36 | You can use the @samp{--globalize-symbols} to make all symbols global. | |
37 | This option is useful when splitting up a @code{mmixal} program into | |
38 | several files. | |
39 | ||
40 | @cindex @samp{--gnu-syntax} command line option, MMIX | |
41 | The @samp{--gnu-syntax} turns off most syntax compatibility with | |
42 | @code{mmixal}. Its usability is currently doubtful. | |
43 | ||
44 | @cindex @samp{--relax} command line option, MMIX | |
45 | The @samp{--relax} option is not fully supported, but will eventually make | |
46 | the object file prepared for linker relaxation. | |
47 | ||
48 | @cindex @samp{--no-predefined-syms} command line option, MMIX | |
49 | If you want to avoid inadvertently calling a predefined symbol and would | |
50 | rather get an error, for example when using @code{@value{AS}} with a | |
51 | compiler or other machine-generated code, specify | |
52 | @samp{--no-predefined-syms}. This turns off built-in predefined | |
53 | definitions of all such symbols, including rounding-mode symbols, segment | |
54 | symbols, @samp{BIT} symbols, and @code{TRAP} symbols used in @code{mmix} | |
55 | ``system calls''. It also turns off predefined special-register names, | |
56 | except when used in @code{PUT} and @code{GET} instructions. | |
57 | ||
58 | @cindex @samp{--no-expand} command line option, MMIX | |
59 | By default, some instructions are expanded to fit the size of the operand | |
60 | or an external symbol (@pxref{MMIX-Expand}). By passing | |
61 | @samp{--no-expand}, no such expansion will be done, instead causing errors | |
62 | at link time if the operand does not fit. | |
63 | ||
64 | @cindex @samp{--no-merge-gregs} command line option, MMIX | |
13f7ad58 HPN |
65 | The @code{mmixal} documentation (@pxref{mmixsite}) specifies that global |
66 | registers allocated with the @samp{GREG} directive (@pxref{MMIX-greg}) and | |
3c3bdf30 | 67 | initialized to the same non-zero value, will refer to the same global |
062b7c0c | 68 | register. This isn't strictly enforceable in @code{@value{AS}} since the |
3c3bdf30 NC |
69 | final addresses aren't known until link-time, but it will do an effort |
70 | unless the @samp{--no-merge-gregs} option is specified. (Register merging | |
71 | isn't yet implemented in @code{@value{LD}}.) | |
72 | ||
73 | @cindex @samp{-x} command line option, MMIX | |
74 | @code{@value{AS}} will warn every time it expands an instruction to fit an | |
75 | operand unless the option @samp{-x} is specified. It is believed that | |
76 | this behaviour is more useful than just mimicking @code{mmixal}'s | |
77 | behaviour, in which instructions are only expanded if the @samp{-x} option | |
78 | is specified, and assembly fails otherwise, when an instruction needs to | |
79 | be expanded. It needs to be kept in mind that @code{mmixal} is both an | |
80 | assembler and linker, while @code{@value{AS}} will expand instructions | |
81 | that at link stage can be contracted. (Though linker relaxation isn't yet | |
973eb340 HPN |
82 | implemented in @code{@value{LD}}.) The option @samp{-x} also imples |
83 | @samp{--linker-allocated-gregs}. | |
84 | ||
88fc725d HPN |
85 | @cindex @samp{--no-pushj-stubs} command line option, MMIX |
86 | @cindex @samp{--no-stubs} command line option, MMIX | |
87 | If instruction expansion is enabled, @code{@value{AS}} can expand a | |
88 | @samp{PUSHJ} instruction into a series of instructions. The shortest | |
89 | expansion is to not expand it, but just mark the call as redirectable to a | |
90 | stub, which @code{@value{LD}} creates at link-time, but only if the | |
91 | original @samp{PUSHJ} instruction is found not to reach the target. The | |
92 | stub consists of the necessary instructions to form a jump to the target. | |
93 | This happens if @code{@value{AS}} can assert that the @samp{PUSHJ} | |
94 | instruction can reach such a stub. The option @samp{--no-pushj-stubs} | |
95 | disables this shorter expansion, and the longer series of instructions is | |
96 | then created at assembly-time. The option @samp{--no-stubs} is a synonym, | |
97 | intended for compatibility with future releases, where generation of stubs | |
98 | for other instructions may be implemented. | |
99 | ||
973eb340 HPN |
100 | @cindex @samp{--linker-allocated-gregs} command line option, MMIX |
101 | Usually a two-operand-expression (@pxref{GREG-base}) without a matching | |
102 | @samp{GREG} directive is treated as an error by @code{@value{AS}}. When | |
103 | the option @samp{--linker-allocated-gregs} is in effect, they are instead | |
104 | passed through to the linker, which will allocate as many global registers | |
105 | as is needed. | |
3c3bdf30 NC |
106 | |
107 | @node MMIX-Expand | |
108 | @section Instruction expansion | |
109 | ||
110 | @cindex instruction expansion, MMIX | |
111 | When @code{@value{AS}} encounters an instruction with an operand that is | |
112 | either not known or does not fit the operand size of the instruction, | |
113 | @code{@value{AS}} (and @code{@value{LD}}) will expand the instruction into | |
114 | a sequence of instructions semantically equivalent to the operand fitting | |
115 | the instruction. Expansion will take place for the following | |
116 | instructions: | |
117 | ||
118 | @table @asis | |
119 | @item @samp{GETA} | |
120 | Expands to a sequence of four instructions: @code{SETL}, @code{INCML}, | |
121 | @code{INCMH} and @code{INCH}. The operand must be a multiple of four. | |
122 | @item Conditional branches | |
123 | A branch instruction is turned into a branch with the complemented | |
124 | condition and prediction bit over five instructions; four instructions | |
125 | setting @code{$255} to the operand value, which like with @code{GETA} must | |
126 | be a multiple of four, and a final @code{GO $255,$255,0}. | |
127 | @item @samp{PUSHJ} | |
128 | Similar to expansion for conditional branches; four instructions set | |
129 | @code{$255} to the operand value, followed by a @code{PUSHGO $255,$255,0}. | |
130 | @item @samp{JMP} | |
131 | Similar to conditional branches and @code{PUSHJ}. The final instruction | |
132 | is @code{GO $255,$255,0}. | |
133 | @end table | |
134 | ||
135 | The linker @code{@value{LD}} is expected to shrink these expansions for | |
136 | code assembled with @samp{--relax} (though not currently implemented). | |
137 | ||
138 | @node MMIX-Syntax | |
139 | @section Syntax | |
140 | ||
141 | The assembly syntax is supposed to be upward compatible with that | |
142 | described in Sections 1.3 and 1.4 of @samp{The Art of Computer | |
143 | Programming, Volume 1}. Draft versions of those chapters as well as other | |
144 | MMIX information is located at | |
13f7ad58 | 145 | @anchor{mmixsite}@url{http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html}. |
3c3bdf30 NC |
146 | Most code examples from the mmixal package located there should work |
147 | unmodified when assembled and linked as single files, with a few | |
148 | noteworthy exceptions (@pxref{MMIX-mmixal}). | |
149 | ||
150 | Before an instruction is emitted, the current location is aligned to the | |
151 | next four-byte boundary. If a label is defined at the beginning of the | |
152 | line, its value will be the aligned value. | |
153 | ||
154 | In addition to the traditional hex-prefix @samp{0x}, a hexadecimal number | |
155 | can also be specified by the prefix character @samp{#}. | |
156 | ||
157 | After all operands to an MMIX instruction or directive have been | |
158 | specified, the rest of the line is ignored, treated as a comment. | |
159 | ||
160 | @menu | |
161 | * MMIX-Chars:: Special Characters | |
162 | * MMIX-Symbols:: Symbols | |
163 | * MMIX-Regs:: Register Names | |
164 | * MMIX-Pseudos:: Assembler Directives | |
165 | @end menu | |
166 | ||
167 | @node MMIX-Chars | |
168 | @subsection Special Characters | |
169 | @cindex line comment characters, MMIX | |
170 | @cindex MMIX line comment characters | |
171 | ||
172 | The characters @samp{*} and @samp{#} are line comment characters; each | |
173 | start a comment at the beginning of a line, but only at the beginning of a | |
174 | line. A @samp{#} prefixes a hexadecimal number if found elsewhere on a | |
175 | line. | |
176 | ||
177 | Two other characters, @samp{%} and @samp{!}, each start a comment anywhere | |
178 | on the line. Thus you can't use the @samp{modulus} and @samp{not} | |
179 | operators in expressions normally associated with these two characters. | |
180 | ||
181 | A @samp{;} is a line separator, treated as a new-line, so separate | |
182 | instructions can be specified on a single line. | |
183 | ||
184 | @node MMIX-Symbols | |
185 | @subsection Symbols | |
186 | The character @samp{:} is permitted in identifiers. There are two | |
187 | exceptions to it being treated as any other symbol character: if a symbol | |
188 | begins with @samp{:}, it means that the symbol is in the global namespace | |
189 | and that the current prefix should not be prepended to that symbol | |
13f7ad58 | 190 | (@pxref{MMIX-prefix}). The @samp{:} is then not considered part of the |
3c3bdf30 NC |
191 | symbol. For a symbol in the label position (first on a line), a @samp{:} |
192 | at the end of a symbol is silently stripped off. A label is permitted, | |
193 | but not required, to be followed by a @samp{:}, as with many other | |
194 | assembly formats. | |
195 | ||
196 | The character @samp{@@} in an expression, is a synonym for @samp{.}, the | |
197 | current location. | |
198 | ||
199 | In addition to the common forward and backward local symbol formats | |
200 | (@pxref{Symbol Names}), they can be specified with upper-case @samp{B} and | |
201 | @samp{F}, as in @samp{8B} and @samp{9F}. A local label defined for the | |
202 | current position is written with a @samp{H} appended to the number: | |
203 | @smallexample | |
204 | 3H LDB $0,$1,2 | |
205 | @end smallexample | |
206 | This and traditional local-label formats cannot be mixed: a label must be | |
207 | defined and referred to using the same format. | |
208 | ||
209 | There's a minor caveat: just as for the ordinary local symbols, the local | |
210 | symbols are translated into ordinary symbols using control characters are | |
211 | to hide the ordinal number of the symbol. Unfortunately, these symbols | |
212 | are not translated back in error messages. Thus you may see confusing | |
213 | error messages when local symbols are used. Control characters | |
214 | @samp{\003} (control-C) and @samp{\004} (control-D) are used for the | |
215 | MMIX-specific local-symbol syntax. | |
216 | ||
217 | The symbol @samp{Main} is handled specially; it is always global. | |
218 | ||
219 | By defining the symbols @samp{__.MMIX.start..text} and | |
220 | @samp{__.MMIX.start..data}, the address of respectively the @samp{.text} | |
221 | and @samp{.data} segments of the final program can be defined, though when | |
222 | linking more than one object file, the code or data in the object file | |
223 | containing the symbol is not guaranteed to be start at that position; just | |
13f7ad58 | 224 | the final executable. @xref{MMIX-loc}. |
3c3bdf30 NC |
225 | |
226 | @node MMIX-Regs | |
227 | @subsection Register names | |
228 | @cindex register names, MMIX | |
229 | @cindex MMIX register names | |
230 | ||
231 | Local and global registers are specified as @samp{$0} to @samp{$255}. | |
232 | The recognized special register names are @samp{rJ}, @samp{rA}, @samp{rB}, | |
233 | @samp{rC}, @samp{rD}, @samp{rE}, @samp{rF}, @samp{rG}, @samp{rH}, | |
234 | @samp{rI}, @samp{rK}, @samp{rL}, @samp{rM}, @samp{rN}, @samp{rO}, | |
235 | @samp{rP}, @samp{rQ}, @samp{rR}, @samp{rS}, @samp{rT}, @samp{rU}, | |
236 | @samp{rV}, @samp{rW}, @samp{rX}, @samp{rY}, @samp{rZ}, @samp{rBB}, | |
237 | @samp{rTT}, @samp{rWW}, @samp{rXX}, @samp{rYY} and @samp{rZZ}. A leading | |
238 | @samp{:} is optional for special register names. | |
239 | ||
240 | Local and global symbols can be equated to register names and used in | |
241 | place of ordinary registers. | |
242 | ||
243 | Similarly for special registers, local and global symbols can be used. | |
244 | Also, symbols equated from numbers and constant expressions are allowed in | |
245 | place of a special register, except when either of the options | |
246 | @code{--no-predefined-syms} and @code{--fixed-special-register-names} are | |
247 | specified. Then only the special register names above are allowed for the | |
248 | instructions having a special register operand; @code{GET} and @code{PUT}. | |
249 | ||
250 | @node MMIX-Pseudos | |
251 | @subsection Assembler Directives | |
252 | @cindex assembler directives, MMIX | |
253 | @cindex pseudo-ops, MMIX | |
254 | @cindex MMIX assembler directives | |
255 | @cindex MMIX pseudo-ops | |
256 | ||
257 | @table @code | |
258 | @item LOC | |
259 | @cindex assembler directive LOC, MMIX | |
260 | @cindex pseudo-op LOC, MMIX | |
261 | @cindex MMIX assembler directive LOC | |
262 | @cindex MMIX pseudo-op LOC | |
263 | ||
13f7ad58 | 264 | @anchor{MMIX-loc} |
3c3bdf30 NC |
265 | The @code{LOC} directive sets the current location to the value of the |
266 | operand field, which may include changing sections. If the operand is a | |
267 | constant, the section is set to either @code{.data} if the value is | |
268 | @code{0x2000000000000000} or larger, else it is set to @code{.text}. | |
269 | Within a section, the current location may only be changed to | |
270 | monotonically higher addresses. A LOC expression must be a previously | |
271 | defined symbol or a ``pure'' constant. | |
272 | ||
273 | An example, which sets the label @var{prev} to the current location, and | |
274 | updates the current location to eight bytes forward: | |
275 | @smallexample | |
276 | prev LOC @@+8 | |
277 | @end smallexample | |
278 | ||
279 | When a LOC has a constant as its operand, a symbol | |
280 | @code{__.MMIX.start..text} or @code{__.MMIX.start..data} is defined | |
281 | depending on the address as mentioned above. Each such symbol is | |
282 | interpreted as special by the linker, locating the section at that | |
283 | address. Note that if multiple files are linked, the first object file | |
284 | with that section will be mapped to that address (not necessarily the file | |
285 | with the LOC definition). | |
286 | ||
287 | @item LOCAL | |
288 | @cindex assembler directive LOCAL, MMIX | |
289 | @cindex pseudo-op LOCAL, MMIX | |
290 | @cindex MMIX assembler directive LOCAL | |
291 | @cindex MMIX pseudo-op LOCAL | |
292 | ||
13f7ad58 | 293 | @anchor{MMIX-local} |
3c3bdf30 NC |
294 | Example: |
295 | @smallexample | |
296 | LOCAL external_symbol | |
297 | LOCAL 42 | |
298 | .local asymbol | |
299 | @end smallexample | |
300 | ||
301 | This directive-operation generates a link-time assertion that the operand | |
302 | does not correspond to a global register. The operand is an expression | |
303 | that at link-time resolves to a register symbol or a number. A number is | |
304 | treated as the register having that number. There is one restriction on | |
305 | the use of this directive: the pseudo-directive must be placed in a | |
306 | section with contents, code or data. | |
307 | ||
308 | @item IS | |
309 | @cindex assembler directive IS, MMIX | |
310 | @cindex pseudo-op IS, MMIX | |
311 | @cindex MMIX assembler directive IS | |
312 | @cindex MMIX pseudo-op IS | |
313 | ||
13f7ad58 | 314 | @anchor{MMIX-is} |
3c3bdf30 NC |
315 | The @code{IS} directive: |
316 | @smallexample | |
317 | asymbol IS an_expression | |
318 | @end smallexample | |
319 | sets the symbol @samp{asymbol} to @samp{an_expression}. A symbol may not | |
320 | be set more than once using this directive. Local labels may be set using | |
321 | this directive, for example: | |
322 | @smallexample | |
323 | 5H IS @@+4 | |
324 | @end smallexample | |
325 | ||
326 | @item GREG | |
327 | @cindex assembler directive GREG, MMIX | |
328 | @cindex pseudo-op GREG, MMIX | |
329 | @cindex MMIX assembler directive GREG | |
330 | @cindex MMIX pseudo-op GREG | |
331 | ||
13f7ad58 | 332 | @anchor{MMIX-greg} |
3c3bdf30 NC |
333 | This directive reserves a global register, gives it an initial value and |
334 | optionally gives it a symbolic name. Some examples: | |
335 | ||
336 | @smallexample | |
337 | areg GREG | |
338 | breg GREG data_value | |
339 | GREG data_buffer | |
340 | .greg creg, another_data_value | |
341 | @end smallexample | |
342 | ||
343 | The symbolic register name can be used in place of a (non-special) | |
344 | register. If a value isn't provided, it defaults to zero. Unless the | |
345 | option @samp{--no-merge-gregs} is specified, non-zero registers allocated | |
346 | with this directive may be eliminated by @code{@value{AS}}; another | |
347 | register with the same value used in its place. | |
348 | Any of the instructions | |
349 | @samp{CSWAP}, | |
350 | @samp{GO}, | |
351 | @samp{LDA}, | |
352 | @samp{LDBU}, | |
353 | @samp{LDB}, | |
354 | @samp{LDHT}, | |
355 | @samp{LDOU}, | |
356 | @samp{LDO}, | |
357 | @samp{LDSF}, | |
358 | @samp{LDTU}, | |
359 | @samp{LDT}, | |
360 | @samp{LDUNC}, | |
361 | @samp{LDVTS}, | |
362 | @samp{LDWU}, | |
363 | @samp{LDW}, | |
364 | @samp{PREGO}, | |
365 | @samp{PRELD}, | |
366 | @samp{PREST}, | |
367 | @samp{PUSHGO}, | |
368 | @samp{STBU}, | |
369 | @samp{STB}, | |
370 | @samp{STCO}, | |
371 | @samp{STHT}, | |
372 | @samp{STOU}, | |
373 | @samp{STSF}, | |
374 | @samp{STTU}, | |
375 | @samp{STT}, | |
376 | @samp{STUNC}, | |
377 | @samp{SYNCD}, | |
378 | @samp{SYNCID}, | |
13f7ad58 | 379 | can have a value nearby @anchor{GREG-base}an initial value in place of its |
3c3bdf30 NC |
380 | second and third operands. Here, ``nearby'' is defined as within the |
381 | range 0@dots{}255 from the initial value of such an allocated register. | |
382 | ||
383 | @smallexample | |
384 | buffer1 BYTE 0,0,0,0,0 | |
385 | buffer2 BYTE 0,0,0,0,0 | |
386 | @dots{} | |
387 | GREG buffer1 | |
388 | LDOU $42,buffer2 | |
389 | @end smallexample | |
390 | In the example above, the @samp{Y} field of the @code{LDOUI} instruction | |
391 | (LDOU with a constant Z) will be replaced with the global register | |
392 | allocated for @samp{buffer1}, and the @samp{Z} field will have the value | |
393 | 5, the offset from @samp{buffer1} to @samp{buffer2}. The result is | |
394 | equivalent to this code: | |
395 | @smallexample | |
396 | buffer1 BYTE 0,0,0,0,0 | |
397 | buffer2 BYTE 0,0,0,0,0 | |
398 | @dots{} | |
399 | tmpreg GREG buffer1 | |
400 | LDOU $42,tmpreg,(buffer2-buffer1) | |
401 | @end smallexample | |
402 | ||
403 | Global registers allocated with this directive are allocated in order | |
404 | higher-to-lower within a file. Other than that, the exact order of | |
405 | register allocation and elimination is undefined. For example, the order | |
406 | is undefined when more than one file with such directives are linked | |
973eb340 HPN |
407 | together. With the options @samp{-x} and @samp{--linker-allocated-gregs}, |
408 | @samp{GREG} directives for two-operand cases like the one mentioned above | |
409 | can be omitted. Sufficient global registers will then be allocated by the | |
410 | linker. | |
3c3bdf30 NC |
411 | |
412 | @item BYTE | |
413 | @cindex assembler directive BYTE, MMIX | |
414 | @cindex pseudo-op BYTE, MMIX | |
415 | @cindex MMIX assembler directive BYTE | |
416 | @cindex MMIX pseudo-op BYTE | |
417 | ||
13f7ad58 | 418 | @anchor{MMIX-byte} |
3c3bdf30 NC |
419 | The @samp{BYTE} directive takes a series of operands separated by a comma. |
420 | If an operand is a string (@pxref{Strings}), each character of that string | |
421 | is emitted as a byte. Other operands must be constant expressions without | |
422 | forward references, in the range 0@dots{}255. If you need operands having | |
423 | expressions with forward references, use @samp{.byte} (@pxref{Byte}). An | |
424 | operand can be omitted, defaulting to a zero value. | |
425 | ||
426 | @item WYDE | |
427 | @itemx TETRA | |
428 | @itemx OCTA | |
429 | @cindex assembler directive WYDE, MMIX | |
430 | @cindex pseudo-op WYDE, MMIX | |
431 | @cindex MMIX assembler directive WYDE | |
432 | @cindex MMIX pseudo-op WYDE | |
433 | @cindex assembler directive TETRA, MMIX | |
434 | @cindex pseudo-op TETRA, MMIX | |
435 | @cindex MMIX assembler directive TETRA | |
436 | @cindex MMIX pseudo-op TETRA | |
437 | @cindex assembler directive OCTA, MMIX | |
438 | @cindex pseudo-op OCTA, MMIX | |
439 | @cindex MMIX assembler directive OCTA | |
440 | @cindex MMIX pseudo-op OCTA | |
441 | ||
13f7ad58 | 442 | @anchor{MMIX-constants} |
3c3bdf30 NC |
443 | The directives @samp{WYDE}, @samp{TETRA} and @samp{OCTA} emit constants of |
444 | two, four and eight bytes size respectively. Before anything else happens | |
445 | for the directive, the current location is aligned to the respective | |
60493797 | 446 | constant-size boundary. If a label is defined at the beginning of the |
3c3bdf30 NC |
447 | line, its value will be that after the alignment. A single operand can be |
448 | omitted, defaulting to a zero value emitted for the directive. Operands | |
449 | can be expressed as strings (@pxref{Strings}), in which case each | |
450 | character in the string is emitted as a separate constant of the size | |
451 | indicated by the directive. | |
452 | ||
453 | @item PREFIX | |
454 | @cindex assembler directive PREFIX, MMIX | |
455 | @cindex pseudo-op PREFIX, MMIX | |
456 | @cindex MMIX assembler directive PREFIX | |
457 | @cindex MMIX pseudo-op PREFIX | |
458 | ||
13f7ad58 | 459 | @anchor{MMIX-prefix} |
3c3bdf30 NC |
460 | The @samp{PREFIX} directive sets a symbol name prefix to be prepended to |
461 | all symbols (except local symbols, @pxref{MMIX-Symbols}), that are not | |
462 | prefixed with @samp{:}, until the next @samp{PREFIX} directive. Such | |
463 | prefixes accumulate. For example, | |
464 | @smallexample | |
465 | PREFIX a | |
466 | PREFIX b | |
467 | c IS 0 | |
468 | @end smallexample | |
469 | defines a symbol @samp{abc} with the value 0. | |
470 | ||
471 | @item BSPEC | |
472 | @itemx ESPEC | |
473 | @cindex assembler directive BSPEC, MMIX | |
474 | @cindex pseudo-op BSPEC, MMIX | |
475 | @cindex MMIX assembler directive BSPEC | |
476 | @cindex MMIX pseudo-op BSPEC | |
477 | @cindex assembler directive ESPEC, MMIX | |
478 | @cindex pseudo-op ESPEC, MMIX | |
479 | @cindex MMIX assembler directive ESPEC | |
480 | @cindex MMIX pseudo-op ESPEC | |
481 | ||
13f7ad58 | 482 | @anchor{MMIX-spec} |
3c3bdf30 NC |
483 | A pair of @samp{BSPEC} and @samp{ESPEC} directives delimit a section of |
484 | special contents (without specified semantics). Example: | |
485 | @smallexample | |
486 | BSPEC 42 | |
487 | TETRA 1,2,3 | |
488 | ESPEC | |
489 | @end smallexample | |
490 | The single operand to @samp{BSPEC} must be number in the range | |
491 | 0@dots{}255. The @samp{BSPEC} number 80 is used by the GNU binutils | |
492 | implementation. | |
493 | @end table | |
494 | ||
495 | @node MMIX-mmixal | |
496 | @section Differences to @code{mmixal} | |
497 | @cindex mmixal differences | |
498 | @cindex differences, mmixal | |
499 | ||
500 | The binutils @code{@value{AS}} and @code{@value{LD}} combination has a few | |
13f7ad58 | 501 | differences in function compared to @code{mmixal} (@pxref{mmixsite}). |
3c3bdf30 NC |
502 | |
503 | The replacement of a symbol with a GREG-allocated register | |
13f7ad58 | 504 | (@pxref{GREG-base}) is not handled the exactly same way in |
3c3bdf30 NC |
505 | @code{@value{AS}} as in @code{mmixal}. This is apparent in the |
506 | @code{mmixal} example file @code{inout.mms}, where different registers | |
507 | with different offsets, eventually yielding the same address, are used in | |
508 | the first instruction. This type of difference should however not affect | |
509 | the function of any program unless it has specific assumptions about the | |
510 | allocated register number. | |
511 | ||
512 | Line numbers (in the @samp{mmo} object format) are currently not | |
513 | supported. | |
514 | ||
515 | Expression operator precedence is not that of mmixal: operator precedence | |
516 | is that of the C programming language. It's recommended to use | |
517 | parentheses to explicitly specify wanted operator precedence whenever more | |
518 | than one type of operators are used. | |
519 | ||
520 | The serialize unary operator @code{&}, the fractional division operator | |
521 | @samp{//}, the logical not operator @code{!} and the modulus operator | |
522 | @samp{%} are not available. | |
523 | ||
524 | Symbols are not global by default, unless the option | |
525 | @samp{--globalize-symbols} is passed. Use the @samp{.global} directive to | |
526 | globalize symbols (@pxref{Global}). | |
527 | ||
528 | Operand syntax is a bit stricter with @code{@value{AS}} than | |
529 | @code{mmixal}. For example, you can't say @code{addu 1,2,3}, instead you | |
530 | must write @code{addu $1,$2,3}. | |
531 | ||
532 | You can't LOC to a lower address than those already visited | |
b45619c0 | 533 | (i.e., ``backwards''). |
3c3bdf30 NC |
534 | |
535 | A LOC directive must come before any emitted code. | |
536 | ||
537 | Predefined symbols are visible as file-local symbols after use. (In the | |
538 | ELF file, that is---the linked mmo file has no notion of a file-local | |
539 | symbol.) | |
540 | ||
541 | Some mapping of constant expressions to sections in LOC expressions is | |
542 | attempted, but that functionality is easily confused and should be avoided | |
543 | unless compatibility with @code{mmixal} is required. A LOC expression to | |
544 | @samp{0x2000000000000000} or higher, maps to the @samp{.data} section and | |
13f7ad58 | 545 | lower addresses map to the @samp{.text} section (@pxref{MMIX-loc}). |
3c3bdf30 NC |
546 | |
547 | The code and data areas are each contiguous. Sparse programs with | |
548 | far-away LOC directives will take up the same amount of space as a | |
549 | contiguous program with zeros filled in the gaps between the LOC | |
550 | directives. If you need sparse programs, you might try and get the wanted | |
551 | effect with a linker script and splitting up the code parts into sections | |
552 | (@pxref{Section}). Assembly code for this, to be compatible with | |
553 | @code{mmixal}, would look something like: | |
554 | @smallexample | |
555 | .if 0 | |
556 | LOC away_expression | |
557 | .else | |
558 | .section away,"ax" | |
559 | .fi | |
560 | @end smallexample | |
561 | @code{@value{AS}} will not execute the LOC directive and @code{mmixal} | |
562 | ignores the lines with @code{.}. This construct can be used generally to | |
563 | help compatibility. | |
564 | ||
565 | Symbols can't be defined twice--not even to the same value. | |
566 | ||
567 | Instruction mnemonics are recognized case-insensitive, though the | |
568 | @samp{IS} and @samp{GREG} pseudo-operations must be specified in | |
569 | upper-case characters. | |
570 | ||
571 | There's no unicode support. | |
572 | ||
973eb340 HPN |
573 | The following is a list of programs in @samp{mmix.tar.gz}, available at |
574 | @url{http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html}, last | |
575 | checked with the version dated 2001-08-25 (md5sum | |
576 | c393470cfc86fac040487d22d2bf0172) that assemble with @code{mmixal} but do | |
577 | not assemble with @code{@value{AS}}: | |
3c3bdf30 NC |
578 | |
579 | @table @code | |
580 | @item silly.mms | |
581 | LOC to a previous address. | |
582 | @item sim.mms | |
583 | Redefines symbol @samp{Done}. | |
584 | @item test.mms | |
585 | Uses the serial operator @samp{&}. | |
586 | @end table |