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"