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