Next: HPPA Opcodes, Previous: HPPA Floating Point, Up: HPPA-Dependent
as
for the HPPA supports many additional directives for
compatibility with the native assembler. This section describes them only
briefly. For detailed information on HPPA-specific assembler directives, see
HP9000 Series 800 Assembly Language Reference Manual (HP 92432-90001).
as
does not support the following assembler directives
described in the HP manual:
.endm .liston .enter .locct .leave .macro .listoff
Beyond those implemented for compatibility, as
supports one
additional assembler directive for the HPPA: .param
. It conveys
register argument locations for static functions. Its syntax closely follows
the .export
directive.
These are the additional directives in as
for the HPPA:
.block
n.blockz
n.call
.callinfo [
param=
value, ... ] [
flag, ... ]
param may be any of `frame' (frame size), `entry_gr' (end of general register range), `entry_fr' (end of float register range), `entry_sr' (end of space register range).
The values for flag are `calls' or `caller' (proc has
subroutines), `no_calls' (proc does not call subroutines), `save_rp'
(preserve return pointer), `save_sp' (proc preserves stack pointer),
`no_unwind' (do not unwind this proc), `hpux_int' (proc is interrupt
routine).
.code
.copyright "
string"
.copyright "
string"
.enter
.entry
.exit
.export
name [ ,
typ ] [ ,
param=
r ]
param, if present, provides either relocation information for the
procedure arguments and result, or a privilege level. param may be
`argwn' (where n ranges from 0
to 3
, and
indicates one of four one-word arguments); `rtnval' (the procedure's
result); or `priv_lev' (privilege level). For arguments or the result,
r specifies how to relocate, and must be one of `no' (not
relocatable), `gr' (argument is in general register), `fr' (in
floating point register), or `fu' (upper half of float register).
For `priv_lev', r is an integer.
.half
nas
directive .short
.
.import
name [ ,
typ ]
.export
; make a procedure available to call. The arguments
use the same conventions as the first two arguments for .export
.
.label
name.leave
.origin
lcas
portable directive .org
.
.param
name [ ,
typ ] [ ,
param=
r ]
.export
, but used for static procedures.
.proc
.procend
.reg
expr.equ
; define label with the absolute expression
expr as its value.
.space
secname [ ,
params ]
If specified, the list params declares attributes of the section,
identified by keywords. The keywords recognized are `spnum=exp'
(identify this section by the number exp, an absolute expression),
`sort=exp' (order sections according to this sort key when linking;
exp is an absolute expression), `unloadable' (section contains no
loadable data), `notdefined' (this section defined elsewhere), and
`private' (data in this section not available to other programs).
.spnum
secnam.space
directive.)
.string "
str"
as
strings.
Warning! The HPPA version of .string
differs from the
usual as
definition: it does not write a zero byte
after copying str.
.stringz "
str"
.string
, but appends a zero byte after copying str to object
file.
.subspa
name [ ,
params ]
.nsubspa
name [ ,
params ]
.space
, but selects a subsection name within the
current section. You may only specify params when you create a
subsection (in the first instance of .subspa
for this name).
If specified, the list params declares attributes of the subsection, identified by keywords. The keywords recognized are `quad=expr' (“quadrant” for this subsection), `align=expr' (alignment for beginning of this subsection; a power of two), `access=expr' (value for “access rights” field), `sort=expr' (sorting order for this subspace in link), `code_only' (subsection contains only code), `unloadable' (subsection cannot be loaded into memory), `comdat' (subsection is comdat), `common' (subsection is common block), `dup_comm' (subsection may have duplicate names), or `zero' (subsection is all zeros, do not write in object file).
.nsubspa
always creates a new subspace with the given name, even
if one with the same name already exists.
`comdat', `common' and `dup_comm' can be used to implement various flavors of one-only support when using the SOM linker. The SOM linker only supports specific combinations of these flags. The details are not documented. A brief description is provided here.
`comdat' provides a form of linkonce support. It is useful for both code and data subspaces. A `comdat' subspace has a key symbol marked by the `is_comdat' flag or `ST_COMDAT'. Only the first subspace for any given key is selected. The key symbol becomes universal in shared links. This is similar to the behavior of `secondary_def' symbols.
`common' provides Fortran named common support. It is only useful for data subspaces. Symbols with the flag `is_common' retain this flag in shared links. Referencing a `is_common' symbol in a shared library from outside the library doesn't work. Thus, `is_common' symbols must be output whenever they are needed.
`common' and `dup_comm' together provide Cobol common support. The subspaces in this case must all be the same length. Otherwise, this support is similar to the Fortran common support.
`dup_comm' by itself provides a type of one-only support for code. Only the first `dup_comm' subspace is selected. There is a rather complex algorithm to compare subspaces. Code symbols marked with the `dup_common' flag are hidden. This support was intended for "C++ duplicate inlines".
A simplified technique is used to mark the flags of symbols based on
the flags of their subspace. A symbol with the scope SS_UNIVERSAL and
type ST_ENTRY, ST_CODE or ST_DATA is marked with the corresponding
settings of `comdat', `common' and `dup_comm' from the
subspace, respectively. This avoids having to introduce additional
directives to mark these symbols. The HP assembler sets `is_common'
from `common'. However, it doesn't set the `dup_common' from
`dup_comm'. It doesn't have `comdat' support.
.version "
str"