| 1 | @c Copyright (C) 1991-2019 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 VAX/VMS description enhanced and corrected by Klaus K"aempf, kkaempf@progis.de |
| 5 | @ifset GENERIC |
| 6 | @node Vax-Dependent |
| 7 | @chapter VAX Dependent Features |
| 8 | @cindex VAX support |
| 9 | |
| 10 | @end ifset |
| 11 | @ifclear GENERIC |
| 12 | @node Machine Dependencies |
| 13 | @chapter VAX Dependent Features |
| 14 | @cindex VAX support |
| 15 | |
| 16 | @end ifclear |
| 17 | |
| 18 | @menu |
| 19 | * VAX-Opts:: VAX Command-Line Options |
| 20 | * VAX-float:: VAX Floating Point |
| 21 | * VAX-directives:: Vax Machine Directives |
| 22 | * VAX-opcodes:: VAX Opcodes |
| 23 | * VAX-branch:: VAX Branch Improvement |
| 24 | * VAX-operands:: VAX Operands |
| 25 | * VAX-no:: Not Supported on VAX |
| 26 | * VAX-Syntax:: VAX Syntax |
| 27 | @end menu |
| 28 | |
| 29 | |
| 30 | @node VAX-Opts |
| 31 | @section VAX Command-Line Options |
| 32 | |
| 33 | @cindex command-line options ignored, VAX |
| 34 | @cindex VAX command-line options ignored |
| 35 | The Vax version of @code{@value{AS}} accepts any of the following options, |
| 36 | gives a warning message that the option was ignored and proceeds. |
| 37 | These options are for compatibility with scripts designed for other |
| 38 | people's assemblers. |
| 39 | |
| 40 | @table @code |
| 41 | @cindex @code{-D}, ignored on VAX |
| 42 | @cindex @code{-S}, ignored on VAX |
| 43 | @cindex @code{-T}, ignored on VAX |
| 44 | @item @code{-D} (Debug) |
| 45 | @itemx @code{-S} (Symbol Table) |
| 46 | @itemx @code{-T} (Token Trace) |
| 47 | These are obsolete options used to debug old assemblers. |
| 48 | |
| 49 | @cindex @code{-d}, VAX option |
| 50 | @item @code{-d} (Displacement size for JUMPs) |
| 51 | This option expects a number following the @samp{-d}. Like options |
| 52 | that expect filenames, the number may immediately follow the |
| 53 | @samp{-d} (old standard) or constitute the whole of the command-line |
| 54 | argument that follows @samp{-d} (@sc{gnu} standard). |
| 55 | |
| 56 | @cindex @code{-V}, redundant on VAX |
| 57 | @item @code{-V} (Virtualize Interpass Temporary File) |
| 58 | Some other assemblers use a temporary file. This option |
| 59 | commanded them to keep the information in active memory rather |
| 60 | than in a disk file. @code{@value{AS}} always does this, so this |
| 61 | option is redundant. |
| 62 | |
| 63 | @cindex @code{-J}, ignored on VAX |
| 64 | @item @code{-J} (JUMPify Longer Branches) |
| 65 | Many 32-bit computers permit a variety of branch instructions |
| 66 | to do the same job. Some of these instructions are short (and |
| 67 | fast) but have a limited range; others are long (and slow) but |
| 68 | can branch anywhere in virtual memory. Often there are 3 |
| 69 | flavors of branch: short, medium and long. Some other |
| 70 | assemblers would emit short and medium branches, unless told by |
| 71 | this option to emit short and long branches. |
| 72 | |
| 73 | @cindex @code{-t}, ignored on VAX |
| 74 | @item @code{-t} (Temporary File Directory) |
| 75 | Some other assemblers may use a temporary file, and this option |
| 76 | takes a filename being the directory to site the temporary |
| 77 | file. Since @code{@value{AS}} does not use a temporary disk file, this |
| 78 | option makes no difference. @samp{-t} needs exactly one |
| 79 | filename. |
| 80 | @end table |
| 81 | |
| 82 | @cindex VMS (VAX) options |
| 83 | @cindex options for VAX/VMS |
| 84 | @cindex VAX/VMS options |
| 85 | @cindex Vax-11 C compatibility |
| 86 | @cindex symbols with uppercase, VAX/VMS |
| 87 | The Vax version of the assembler accepts additional options when |
| 88 | compiled for VMS: |
| 89 | |
| 90 | @table @samp |
| 91 | @cindex @samp{-h} option, VAX/VMS |
| 92 | @item -h @var{n} |
| 93 | External symbol or section (used for global variables) names are not |
| 94 | case sensitive on VAX/VMS and always mapped to upper case. This is |
| 95 | contrary to the C language definition which explicitly distinguishes |
| 96 | upper and lower case. To implement a standard conforming C compiler, |
| 97 | names must be changed (mapped) to preserve the case information. The |
| 98 | default mapping is to convert all lower case characters to uppercase and |
| 99 | adding an underscore followed by a 6 digit hex value, representing a 24 |
| 100 | digit binary value. The one digits in the binary value represent which |
| 101 | characters are uppercase in the original symbol name. |
| 102 | |
| 103 | The @samp{-h @var{n}} option determines how we map names. This takes |
| 104 | several values. No @samp{-h} switch at all allows case hacking as |
| 105 | described above. A value of zero (@samp{-h0}) implies names should be |
| 106 | upper case, and inhibits the case hack. A value of 2 (@samp{-h2}) |
| 107 | implies names should be all lower case, with no case hack. A value of 3 |
| 108 | (@samp{-h3}) implies that case should be preserved. The value 1 is |
| 109 | unused. The @code{-H} option directs @code{@value{AS}} to display |
| 110 | every mapped symbol during assembly. |
| 111 | |
| 112 | Symbols whose names include a dollar sign @samp{$} are exceptions to the |
| 113 | general name mapping. These symbols are normally only used to reference |
| 114 | VMS library names. Such symbols are always mapped to upper case. |
| 115 | |
| 116 | @cindex @samp{-+} option, VAX/VMS |
| 117 | @item -+ |
| 118 | The @samp{-+} option causes @code{@value{AS}} to truncate any symbol |
| 119 | name larger than 31 characters. The @samp{-+} option also prevents some |
| 120 | code following the @samp{_main} symbol normally added to make the object |
| 121 | file compatible with Vax-11 "C". |
| 122 | |
| 123 | @cindex @samp{-1} option, VAX/VMS |
| 124 | @item -1 |
| 125 | This option is ignored for backward compatibility with @code{@value{AS}} |
| 126 | version 1.x. |
| 127 | |
| 128 | @cindex @samp{-H} option, VAX/VMS |
| 129 | @item -H |
| 130 | The @samp{-H} option causes @code{@value{AS}} to print every symbol |
| 131 | which was changed by case mapping. |
| 132 | @end table |
| 133 | |
| 134 | @node VAX-float |
| 135 | @section VAX Floating Point |
| 136 | |
| 137 | @cindex VAX floating point |
| 138 | @cindex floating point, VAX |
| 139 | Conversion of flonums to floating point is correct, and |
| 140 | compatible with previous assemblers. Rounding is |
| 141 | towards zero if the remainder is exactly half the least significant bit. |
| 142 | |
| 143 | @code{D}, @code{F}, @code{G} and @code{H} floating point formats |
| 144 | are understood. |
| 145 | |
| 146 | Immediate floating literals (@emph{e.g.} @samp{S`$6.9}) |
| 147 | are rendered correctly. Again, rounding is towards zero in the |
| 148 | boundary case. |
| 149 | |
| 150 | @cindex @code{float} directive, VAX |
| 151 | @cindex @code{double} directive, VAX |
| 152 | The @code{.float} directive produces @code{f} format numbers. |
| 153 | The @code{.double} directive produces @code{d} format numbers. |
| 154 | |
| 155 | @node VAX-directives |
| 156 | @section Vax Machine Directives |
| 157 | |
| 158 | @cindex machine directives, VAX |
| 159 | @cindex VAX machine directives |
| 160 | The Vax version of the assembler supports four directives for |
| 161 | generating Vax floating point constants. They are described in the |
| 162 | table below. |
| 163 | |
| 164 | @cindex wide floating point directives, VAX |
| 165 | @table @code |
| 166 | @cindex @code{dfloat} directive, VAX |
| 167 | @item .dfloat |
| 168 | This expects zero or more flonums, separated by commas, and |
| 169 | assembles Vax @code{d} format 64-bit floating point constants. |
| 170 | |
| 171 | @cindex @code{ffloat} directive, VAX |
| 172 | @item .ffloat |
| 173 | This expects zero or more flonums, separated by commas, and |
| 174 | assembles Vax @code{f} format 32-bit floating point constants. |
| 175 | |
| 176 | @cindex @code{gfloat} directive, VAX |
| 177 | @item .gfloat |
| 178 | This expects zero or more flonums, separated by commas, and |
| 179 | assembles Vax @code{g} format 64-bit floating point constants. |
| 180 | |
| 181 | @cindex @code{hfloat} directive, VAX |
| 182 | @item .hfloat |
| 183 | This expects zero or more flonums, separated by commas, and |
| 184 | assembles Vax @code{h} format 128-bit floating point constants. |
| 185 | |
| 186 | @end table |
| 187 | |
| 188 | @node VAX-opcodes |
| 189 | @section VAX Opcodes |
| 190 | |
| 191 | @cindex VAX opcode mnemonics |
| 192 | @cindex opcode mnemonics, VAX |
| 193 | @cindex mnemonics for opcodes, VAX |
| 194 | All DEC mnemonics are supported. Beware that @code{case@dots{}} |
| 195 | instructions have exactly 3 operands. The dispatch table that |
| 196 | follows the @code{case@dots{}} instruction should be made with |
| 197 | @code{.word} statements. This is compatible with all unix |
| 198 | assemblers we know of. |
| 199 | |
| 200 | @node VAX-branch |
| 201 | @section VAX Branch Improvement |
| 202 | |
| 203 | @cindex VAX branch improvement |
| 204 | @cindex branch improvement, VAX |
| 205 | @cindex pseudo-ops for branch, VAX |
| 206 | Certain pseudo opcodes are permitted. They are for branch |
| 207 | instructions. They expand to the shortest branch instruction that |
| 208 | reaches the target. Generally these mnemonics are made by |
| 209 | substituting @samp{j} for @samp{b} at the start of a DEC mnemonic. |
| 210 | This feature is included both for compatibility and to help |
| 211 | compilers. If you do not need this feature, avoid these |
| 212 | opcodes. Here are the mnemonics, and the code they can expand into. |
| 213 | |
| 214 | @table @code |
| 215 | @item jbsb |
| 216 | @samp{Jsb} is already an instruction mnemonic, so we chose @samp{jbsb}. |
| 217 | @table @asis |
| 218 | @item (byte displacement) |
| 219 | @kbd{bsbb @dots{}} |
| 220 | @item (word displacement) |
| 221 | @kbd{bsbw @dots{}} |
| 222 | @item (long displacement) |
| 223 | @kbd{jsb @dots{}} |
| 224 | @end table |
| 225 | @item jbr |
| 226 | @itemx jr |
| 227 | Unconditional branch. |
| 228 | @table @asis |
| 229 | @item (byte displacement) |
| 230 | @kbd{brb @dots{}} |
| 231 | @item (word displacement) |
| 232 | @kbd{brw @dots{}} |
| 233 | @item (long displacement) |
| 234 | @kbd{jmp @dots{}} |
| 235 | @end table |
| 236 | @item j@var{COND} |
| 237 | @var{COND} may be any one of the conditional branches |
| 238 | @code{neq}, @code{nequ}, @code{eql}, @code{eqlu}, @code{gtr}, |
| 239 | @code{geq}, @code{lss}, @code{gtru}, @code{lequ}, @code{vc}, @code{vs}, |
| 240 | @code{gequ}, @code{cc}, @code{lssu}, @code{cs}. |
| 241 | @var{COND} may also be one of the bit tests |
| 242 | @code{bs}, @code{bc}, @code{bss}, @code{bcs}, @code{bsc}, @code{bcc}, |
| 243 | @code{bssi}, @code{bcci}, @code{lbs}, @code{lbc}. |
| 244 | @var{NOTCOND} is the opposite condition to @var{COND}. |
| 245 | @table @asis |
| 246 | @item (byte displacement) |
| 247 | @kbd{b@var{COND} @dots{}} |
| 248 | @item (word displacement) |
| 249 | @kbd{b@var{NOTCOND} foo ; brw @dots{} ; foo:} |
| 250 | @item (long displacement) |
| 251 | @kbd{b@var{NOTCOND} foo ; jmp @dots{} ; foo:} |
| 252 | @end table |
| 253 | @item jacb@var{X} |
| 254 | @var{X} may be one of @code{b d f g h l w}. |
| 255 | @table @asis |
| 256 | @item (word displacement) |
| 257 | @kbd{@var{OPCODE} @dots{}} |
| 258 | @item (long displacement) |
| 259 | @example |
| 260 | @var{OPCODE} @dots{}, foo ; |
| 261 | brb bar ; |
| 262 | foo: jmp @dots{} ; |
| 263 | bar: |
| 264 | @end example |
| 265 | @end table |
| 266 | @item jaob@var{YYY} |
| 267 | @var{YYY} may be one of @code{lss leq}. |
| 268 | @item jsob@var{ZZZ} |
| 269 | @var{ZZZ} may be one of @code{geq gtr}. |
| 270 | @table @asis |
| 271 | @item (byte displacement) |
| 272 | @kbd{@var{OPCODE} @dots{}} |
| 273 | @item (word displacement) |
| 274 | @example |
| 275 | @var{OPCODE} @dots{}, foo ; |
| 276 | brb bar ; |
| 277 | foo: brw @var{destination} ; |
| 278 | bar: |
| 279 | @end example |
| 280 | @item (long displacement) |
| 281 | @example |
| 282 | @var{OPCODE} @dots{}, foo ; |
| 283 | brb bar ; |
| 284 | foo: jmp @var{destination} ; |
| 285 | bar: |
| 286 | @end example |
| 287 | @end table |
| 288 | @item aobleq |
| 289 | @itemx aoblss |
| 290 | @itemx sobgeq |
| 291 | @itemx sobgtr |
| 292 | @table @asis |
| 293 | @item (byte displacement) |
| 294 | @kbd{@var{OPCODE} @dots{}} |
| 295 | @item (word displacement) |
| 296 | @example |
| 297 | @var{OPCODE} @dots{}, foo ; |
| 298 | brb bar ; |
| 299 | foo: brw @var{destination} ; |
| 300 | bar: |
| 301 | @end example |
| 302 | @item (long displacement) |
| 303 | @example |
| 304 | @var{OPCODE} @dots{}, foo ; |
| 305 | brb bar ; |
| 306 | foo: jmp @var{destination} ; |
| 307 | bar: |
| 308 | @end example |
| 309 | @end table |
| 310 | @end table |
| 311 | |
| 312 | @node VAX-operands |
| 313 | @section VAX Operands |
| 314 | |
| 315 | @cindex VAX operand notation |
| 316 | @cindex operand notation, VAX |
| 317 | @cindex immediate character, VAX |
| 318 | @cindex VAX immediate character |
| 319 | The immediate character is @samp{$} for Unix compatibility, not |
| 320 | @samp{#} as DEC writes it. |
| 321 | |
| 322 | @cindex indirect character, VAX |
| 323 | @cindex VAX indirect character |
| 324 | The indirect character is @samp{*} for Unix compatibility, not |
| 325 | @samp{@@} as DEC writes it. |
| 326 | |
| 327 | @cindex displacement sizing character, VAX |
| 328 | @cindex VAX displacement sizing character |
| 329 | The displacement sizing character is @samp{`} (an accent grave) for |
| 330 | Unix compatibility, not @samp{^} as DEC writes it. The letter |
| 331 | preceding @samp{`} may have either case. @samp{G} is not |
| 332 | understood, but all other letters (@code{b i l s w}) are understood. |
| 333 | |
| 334 | @cindex register names, VAX |
| 335 | @cindex VAX register names |
| 336 | Register names understood are @code{r0 r1 r2 @dots{} r15 ap fp sp |
| 337 | pc}. Upper and lower case letters are equivalent. |
| 338 | |
| 339 | For instance |
| 340 | @smallexample |
| 341 | tstb *w`$4(r5) |
| 342 | @end smallexample |
| 343 | |
| 344 | Any expression is permitted in an operand. Operands are comma |
| 345 | separated. |
| 346 | |
| 347 | @c There is some bug to do with recognizing expressions |
| 348 | @c in operands, but I forget what it is. It is |
| 349 | @c a syntax clash because () is used as an address mode |
| 350 | @c and to encapsulate sub-expressions. |
| 351 | |
| 352 | @node VAX-no |
| 353 | @section Not Supported on VAX |
| 354 | |
| 355 | @cindex VAX bitfields not supported |
| 356 | @cindex bitfields, not supported on VAX |
| 357 | Vax bit fields can not be assembled with @code{@value{AS}}. Someone |
| 358 | can add the required code if they really need it. |
| 359 | |
| 360 | @node VAX-Syntax |
| 361 | @section VAX Syntax |
| 362 | @menu |
| 363 | * VAX-Chars:: Special Characters |
| 364 | @end menu |
| 365 | |
| 366 | @node VAX-Chars |
| 367 | @subsection Special Characters |
| 368 | |
| 369 | @cindex line comment character, VAX |
| 370 | @cindex VAX line comment character |
| 371 | The presence of a @samp{#} appearing anywhere on a line indicates the |
| 372 | start of a comment that extends to the end of that line. |
| 373 | |
| 374 | If a @samp{#} appears as the first character of a line then the whole |
| 375 | line is treated as a comment, but in this case the line can also be a |
| 376 | logical line number directive (@pxref{Comments}) or a preprocessor |
| 377 | control command (@pxref{Preprocessing}). |
| 378 | |
| 379 | @cindex line separator, VAX |
| 380 | @cindex statement separator, VAX |
| 381 | @cindex VAX line separator |
| 382 | The @samp{;} character can be used to separate statements on the same |
| 383 | line. |