|  | @c Copyright (C) 1991-2023 Free Software Foundation, Inc. | 
|  | @c This is part of the GAS manual. | 
|  | @c For copying conditions, see the file as.texinfo. | 
|  | @c VAX/VMS description enhanced and corrected by Klaus K"aempf, kkaempf@progis.de | 
|  | @ifset GENERIC | 
|  | @node Vax-Dependent | 
|  | @chapter VAX Dependent Features | 
|  | @cindex VAX support | 
|  |  | 
|  | @end ifset | 
|  | @ifclear GENERIC | 
|  | @node Machine Dependencies | 
|  | @chapter VAX Dependent Features | 
|  | @cindex VAX support | 
|  |  | 
|  | @end ifclear | 
|  |  | 
|  | @menu | 
|  | * VAX-Opts::                    VAX Command-Line Options | 
|  | * VAX-float::                   VAX Floating Point | 
|  | * VAX-directives::              Vax Machine Directives | 
|  | * VAX-opcodes::                 VAX Opcodes | 
|  | * VAX-branch::                  VAX Branch Improvement | 
|  | * VAX-operands::                VAX Operands | 
|  | * VAX-no::                      Not Supported on VAX | 
|  | * VAX-Syntax::                  VAX Syntax | 
|  | @end menu | 
|  |  | 
|  |  | 
|  | @node VAX-Opts | 
|  | @section VAX Command-Line Options | 
|  |  | 
|  | @cindex command-line options ignored, VAX | 
|  | @cindex VAX command-line options ignored | 
|  | The Vax version of @code{@value{AS}} accepts any of the following options, | 
|  | gives a warning message that the option was ignored and proceeds. | 
|  | These options are for compatibility with scripts designed for other | 
|  | people's assemblers. | 
|  |  | 
|  | @table @code | 
|  | @cindex @code{-D}, ignored on VAX | 
|  | @cindex @code{-S}, ignored on VAX | 
|  | @cindex @code{-T}, ignored on VAX | 
|  | @item @code{-D} (Debug) | 
|  | @itemx @code{-S} (Symbol Table) | 
|  | @itemx @code{-T} (Token Trace) | 
|  | These are obsolete options used to debug old assemblers. | 
|  |  | 
|  | @cindex @code{-d}, VAX option | 
|  | @item @code{-d} (Displacement size for JUMPs) | 
|  | This option expects a number following the @samp{-d}.  Like options | 
|  | that expect filenames, the number may immediately follow the | 
|  | @samp{-d} (old standard) or constitute the whole of the command-line | 
|  | argument that follows @samp{-d} (@sc{gnu} standard). | 
|  |  | 
|  | @cindex @code{-V}, redundant on VAX | 
|  | @item @code{-V} (Virtualize Interpass Temporary File) | 
|  | Some other assemblers use a temporary file.  This option | 
|  | commanded them to keep the information in active memory rather | 
|  | than in a disk file.  @code{@value{AS}} always does this, so this | 
|  | option is redundant. | 
|  |  | 
|  | @cindex @code{-J}, ignored on VAX | 
|  | @item @code{-J} (JUMPify Longer Branches) | 
|  | Many 32-bit computers permit a variety of branch instructions | 
|  | to do the same job.  Some of these instructions are short (and | 
|  | fast) but have a limited range; others are long (and slow) but | 
|  | can branch anywhere in virtual memory.  Often there are 3 | 
|  | flavors of branch: short, medium and long.  Some other | 
|  | assemblers would emit short and medium branches, unless told by | 
|  | this option to emit short and long branches. | 
|  |  | 
|  | @cindex @code{-t}, ignored on VAX | 
|  | @item @code{-t} (Temporary File Directory) | 
|  | Some other assemblers may use a temporary file, and this option | 
|  | takes a filename being the directory to site the temporary | 
|  | file.  Since @code{@value{AS}} does not use a temporary disk file, this | 
|  | option makes no difference.  @samp{-t} needs exactly one | 
|  | filename. | 
|  | @end table | 
|  |  | 
|  | @cindex VMS (VAX) options | 
|  | @cindex options for VAX/VMS | 
|  | @cindex VAX/VMS options | 
|  | @cindex Vax-11 C compatibility | 
|  | @cindex symbols with uppercase, VAX/VMS | 
|  | The Vax version of the assembler accepts additional options when | 
|  | compiled for VMS: | 
|  |  | 
|  | @table @samp | 
|  | @cindex @samp{-h} option, VAX/VMS | 
|  | @item -h @var{n} | 
|  | External symbol or section (used for global variables) names are not | 
|  | case sensitive on VAX/VMS and always mapped to upper case.  This is | 
|  | contrary to the C language definition which explicitly distinguishes | 
|  | upper and lower case.  To implement a standard conforming C compiler, | 
|  | names must be changed (mapped) to preserve the case information.  The | 
|  | default mapping is to convert all lower case characters to uppercase and | 
|  | adding an underscore followed by a 6 digit hex value, representing a 24 | 
|  | digit binary value.  The one digits in the binary value represent which | 
|  | characters are uppercase in the original symbol name. | 
|  |  | 
|  | The @samp{-h @var{n}} option determines how we map names.  This takes | 
|  | several values.  No @samp{-h} switch at all allows case hacking as | 
|  | described above.  A value of zero (@samp{-h0}) implies names should be | 
|  | upper case, and inhibits the case hack.  A value of 2 (@samp{-h2}) | 
|  | implies names should be all lower case, with no case hack.  A value of 3 | 
|  | (@samp{-h3}) implies that case should be preserved.  The value 1 is | 
|  | unused.  The @code{-H} option directs @code{@value{AS}} to display | 
|  | every mapped symbol during assembly. | 
|  |  | 
|  | Symbols whose names include a dollar sign @samp{$} are exceptions to the | 
|  | general name mapping.  These symbols are normally only used to reference | 
|  | VMS library names.  Such symbols are always mapped to upper case. | 
|  |  | 
|  | @cindex @samp{-+} option, VAX/VMS | 
|  | @item -+ | 
|  | The @samp{-+} option causes @code{@value{AS}} to truncate any symbol | 
|  | name larger than 31 characters.  The @samp{-+} option also prevents some | 
|  | code following the @samp{_main} symbol normally added to make the object | 
|  | file compatible with Vax-11 "C". | 
|  |  | 
|  | @cindex @samp{-1} option, VAX/VMS | 
|  | @item -1 | 
|  | This option is ignored for backward compatibility with @code{@value{AS}} | 
|  | version 1.x. | 
|  |  | 
|  | @cindex @samp{-H} option, VAX/VMS | 
|  | @item -H | 
|  | The @samp{-H} option causes @code{@value{AS}} to print every symbol | 
|  | which was changed by case mapping. | 
|  | @end table | 
|  |  | 
|  | @node VAX-float | 
|  | @section VAX Floating Point | 
|  |  | 
|  | @cindex VAX floating point | 
|  | @cindex floating point, VAX | 
|  | Conversion of flonums to floating point is correct, and | 
|  | compatible with previous assemblers.  Rounding is | 
|  | towards zero if the remainder is exactly half the least significant bit. | 
|  |  | 
|  | @code{D}, @code{F}, @code{G} and @code{H} floating point formats | 
|  | are understood. | 
|  |  | 
|  | Immediate floating literals (@emph{e.g.} @samp{S`$6.9}) | 
|  | are rendered correctly.  Again, rounding is towards zero in the | 
|  | boundary case. | 
|  |  | 
|  | @cindex @code{float} directive, VAX | 
|  | @cindex @code{double} directive, VAX | 
|  | The @code{.float} directive produces @code{f} format numbers. | 
|  | The @code{.double} directive produces @code{d} format numbers. | 
|  |  | 
|  | @node VAX-directives | 
|  | @section Vax Machine Directives | 
|  |  | 
|  | @cindex machine directives, VAX | 
|  | @cindex VAX machine directives | 
|  | The Vax version of the assembler supports four directives for | 
|  | generating Vax floating point constants.  They are described in the | 
|  | table below. | 
|  |  | 
|  | @cindex wide floating point directives, VAX | 
|  | @table @code | 
|  | @cindex @code{dfloat} directive, VAX | 
|  | @item .dfloat | 
|  | This expects zero or more flonums, separated by commas, and | 
|  | assembles Vax @code{d} format 64-bit floating point constants. | 
|  |  | 
|  | @cindex @code{ffloat} directive, VAX | 
|  | @item .ffloat | 
|  | This expects zero or more flonums, separated by commas, and | 
|  | assembles Vax @code{f} format 32-bit floating point constants. | 
|  |  | 
|  | @cindex @code{gfloat} directive, VAX | 
|  | @item .gfloat | 
|  | This expects zero or more flonums, separated by commas, and | 
|  | assembles Vax @code{g} format 64-bit floating point constants. | 
|  |  | 
|  | @cindex @code{hfloat} directive, VAX | 
|  | @item .hfloat | 
|  | This expects zero or more flonums, separated by commas, and | 
|  | assembles Vax @code{h} format 128-bit floating point constants. | 
|  |  | 
|  | @end table | 
|  |  | 
|  | @node VAX-opcodes | 
|  | @section VAX Opcodes | 
|  |  | 
|  | @cindex VAX opcode mnemonics | 
|  | @cindex opcode mnemonics, VAX | 
|  | @cindex mnemonics for opcodes, VAX | 
|  | All DEC mnemonics are supported.  Beware that @code{case@dots{}} | 
|  | instructions have exactly 3 operands.  The dispatch table that | 
|  | follows the @code{case@dots{}} instruction should be made with | 
|  | @code{.word} statements.  This is compatible with all unix | 
|  | assemblers we know of. | 
|  |  | 
|  | @node VAX-branch | 
|  | @section VAX Branch Improvement | 
|  |  | 
|  | @cindex VAX branch improvement | 
|  | @cindex branch improvement, VAX | 
|  | @cindex pseudo-ops for branch, VAX | 
|  | Certain pseudo opcodes are permitted.  They are for branch | 
|  | instructions.  They expand to the shortest branch instruction that | 
|  | reaches the target.  Generally these mnemonics are made by | 
|  | substituting @samp{j} for @samp{b} at the start of a DEC mnemonic. | 
|  | This feature is included both for compatibility and to help | 
|  | compilers.  If you do not need this feature, avoid these | 
|  | opcodes.  Here are the mnemonics, and the code they can expand into. | 
|  |  | 
|  | @table @code | 
|  | @item jbsb | 
|  | @samp{Jsb} is already an instruction mnemonic, so we chose @samp{jbsb}. | 
|  | @table @asis | 
|  | @item (byte displacement) | 
|  | @kbd{bsbb @dots{}} | 
|  | @item (word displacement) | 
|  | @kbd{bsbw @dots{}} | 
|  | @item (long displacement) | 
|  | @kbd{jsb @dots{}} | 
|  | @end table | 
|  | @item jbr | 
|  | @itemx jr | 
|  | Unconditional branch. | 
|  | @table @asis | 
|  | @item (byte displacement) | 
|  | @kbd{brb @dots{}} | 
|  | @item (word displacement) | 
|  | @kbd{brw @dots{}} | 
|  | @item (long displacement) | 
|  | @kbd{jmp @dots{}} | 
|  | @end table | 
|  | @item j@var{COND} | 
|  | @var{COND} may be any one of the conditional branches | 
|  | @code{neq}, @code{nequ}, @code{eql}, @code{eqlu}, @code{gtr}, | 
|  | @code{geq}, @code{lss}, @code{gtru}, @code{lequ}, @code{vc}, @code{vs}, | 
|  | @code{gequ}, @code{cc}, @code{lssu}, @code{cs}. | 
|  | @var{COND} may also be one of the bit tests | 
|  | @code{bs}, @code{bc}, @code{bss}, @code{bcs}, @code{bsc}, @code{bcc}, | 
|  | @code{bssi}, @code{bcci}, @code{lbs}, @code{lbc}. | 
|  | @var{NOTCOND} is the opposite condition to @var{COND}. | 
|  | @table @asis | 
|  | @item (byte displacement) | 
|  | @kbd{b@var{COND} @dots{}} | 
|  | @item (word displacement) | 
|  | @kbd{b@var{NOTCOND} foo ; brw @dots{} ; foo:} | 
|  | @item (long displacement) | 
|  | @kbd{b@var{NOTCOND} foo ; jmp @dots{} ; foo:} | 
|  | @end table | 
|  | @item jacb@var{X} | 
|  | @var{X} may be one of @code{b d f g h l w}. | 
|  | @table @asis | 
|  | @item (word displacement) | 
|  | @kbd{@var{OPCODE} @dots{}} | 
|  | @item (long displacement) | 
|  | @example | 
|  | @var{OPCODE} @dots{}, foo ; | 
|  | brb bar ; | 
|  | foo: jmp @dots{} ; | 
|  | bar: | 
|  | @end example | 
|  | @end table | 
|  | @item jaob@var{YYY} | 
|  | @var{YYY} may be one of @code{lss leq}. | 
|  | @item jsob@var{ZZZ} | 
|  | @var{ZZZ} may be one of @code{geq gtr}. | 
|  | @table @asis | 
|  | @item (byte displacement) | 
|  | @kbd{@var{OPCODE} @dots{}} | 
|  | @item (word displacement) | 
|  | @example | 
|  | @var{OPCODE} @dots{}, foo ; | 
|  | brb bar ; | 
|  | foo: brw @var{destination} ; | 
|  | bar: | 
|  | @end example | 
|  | @item (long displacement) | 
|  | @example | 
|  | @var{OPCODE} @dots{}, foo ; | 
|  | brb bar ; | 
|  | foo: jmp @var{destination} ; | 
|  | bar: | 
|  | @end example | 
|  | @end table | 
|  | @item aobleq | 
|  | @itemx aoblss | 
|  | @itemx sobgeq | 
|  | @itemx sobgtr | 
|  | @table @asis | 
|  | @item (byte displacement) | 
|  | @kbd{@var{OPCODE} @dots{}} | 
|  | @item (word displacement) | 
|  | @example | 
|  | @var{OPCODE} @dots{}, foo ; | 
|  | brb bar ; | 
|  | foo: brw @var{destination} ; | 
|  | bar: | 
|  | @end example | 
|  | @item (long displacement) | 
|  | @example | 
|  | @var{OPCODE} @dots{}, foo ; | 
|  | brb bar ; | 
|  | foo: jmp @var{destination} ; | 
|  | bar: | 
|  | @end example | 
|  | @end table | 
|  | @end table | 
|  |  | 
|  | @node VAX-operands | 
|  | @section VAX Operands | 
|  |  | 
|  | @cindex VAX operand notation | 
|  | @cindex operand notation, VAX | 
|  | @cindex immediate character, VAX | 
|  | @cindex VAX immediate character | 
|  | The immediate character is @samp{$} for Unix compatibility, not | 
|  | @samp{#} as DEC writes it. | 
|  |  | 
|  | @cindex indirect character, VAX | 
|  | @cindex VAX indirect character | 
|  | The indirect character is @samp{*} for Unix compatibility, not | 
|  | @samp{@@} as DEC writes it. | 
|  |  | 
|  | @cindex displacement sizing character, VAX | 
|  | @cindex VAX displacement sizing character | 
|  | The displacement sizing character is @samp{`} (an accent grave) for | 
|  | Unix compatibility, not @samp{^} as DEC writes it.  The letter | 
|  | preceding @samp{`} may have either case.  @samp{G} is not | 
|  | understood, but all other letters (@code{b i l s w}) are understood. | 
|  |  | 
|  | @cindex register names, VAX | 
|  | @cindex VAX register names | 
|  | Register names understood are @code{r0 r1 r2 @dots{} r15 ap fp sp | 
|  | pc}.  Upper and lower case letters are equivalent. | 
|  |  | 
|  | For instance | 
|  | @smallexample | 
|  | tstb *w`$4(r5) | 
|  | @end smallexample | 
|  |  | 
|  | Any expression is permitted in an operand.  Operands are comma | 
|  | separated. | 
|  |  | 
|  | @c There is some bug to do with recognizing expressions | 
|  | @c in operands, but I forget what it is.  It is | 
|  | @c a syntax clash because () is used as an address mode | 
|  | @c and to encapsulate sub-expressions. | 
|  |  | 
|  | @node VAX-no | 
|  | @section Not Supported on VAX | 
|  |  | 
|  | @cindex VAX bitfields not supported | 
|  | @cindex bitfields, not supported on VAX | 
|  | Vax bit fields can not be assembled with @code{@value{AS}}.  Someone | 
|  | can add the required code if they really need it. | 
|  |  | 
|  | @node VAX-Syntax | 
|  | @section VAX Syntax | 
|  | @menu | 
|  | * VAX-Chars::                Special Characters | 
|  | @end menu | 
|  |  | 
|  | @node VAX-Chars | 
|  | @subsection Special Characters | 
|  |  | 
|  | @cindex line comment character, VAX | 
|  | @cindex VAX line comment character | 
|  | The presence of a @samp{#} appearing anywhere on a line indicates the | 
|  | start of a comment that extends to the end of that line. | 
|  |  | 
|  | If a @samp{#} appears as the first character of a line then the whole | 
|  | line is treated as a comment, but in this case the line can also be a | 
|  | logical line number directive (@pxref{Comments}) or a preprocessor | 
|  | control command (@pxref{Preprocessing}). | 
|  |  | 
|  | @cindex line separator, VAX | 
|  | @cindex statement separator, VAX | 
|  | @cindex VAX line separator | 
|  | The @samp{;} character can be used to separate statements on the same | 
|  | line. |