In the Digital UNIX calling standard, a simple (not bound)
procedure value is
defined as the address of the first instruction of that procedure's entry
code. (See Section 3.2.6.)
A bound procedure value is defined as the address of the first instruction
of an instruction sequence that establishes the correct execution context
for the bound procedure.
Procedures in the Digital UNIX calling standard are associated with
a set of information called a procedure descriptor.
This information describes
various aspects of the procedure's code that are required for correct and
robust exception handling. The exception processing described by this standard
is based on the assumption that any given program counter value can be mapped
to an associated procedure descriptor that describes the currently active
procedure.
2.1 Address Representation
Values that represent addresses are 64 bits in size.2.2 Procedure Representation
One of the distinguishing
characteristics of any calling standard is how procedures are represented.
The term used to denote the value that uniquely identifies a procedure is
a procedure value.
If the value identifies
a bound procedure, it is called a bound procedure value.
2.3 Register Usage Conventions
This section describes the
usage of the Alpha hardware integer and floating-point registers.
2.3.1 Integer Registers
Table 2-1
describes the Alpha
hardware integer registers.
2.3.2 Floating-Point Registers
Table 2-2 describes the Alpha hardware
floating-point registers.
A hardware architecture in which instructions cannot contain full virtual
addresses can be referred to as a base register architecture.
The Alpha architecture is such
an architecture.
In a base register architecture, normal memory
references within a limited range from a given address are expressed by using
displacements relative to the contents of some register which contains that
address (usually referred to as a base register).
Base registers for external
program segments, either data or code, are usually loaded indirectly through
a program segment of address constants.
To optimize this base register access method, this standard requires
each image that makes up an executable program to have zero or one global offset table (GOT).
This global offset table can
be further divided into multiple GOT segments. Together, the linker and the
compilers arrange for various static data to be collected together into a
minimal number of these GOT segments (typically one per image). During program
execution, the GP (global pointer)
register will contain a pointer into
the appropriate GOT segment so that all references therein can utilize a single
base register. (For more information, see Section 3.2.2.)
During the compilation process, a compiler generates object language
to designate data as belonging in a GOT segment. No single procedure is allowed
to provide more than 64KB of data to a GOT segment. The linker pools these
contributions to form the GOT segments. Typically, routines in several compilation
units can share the same pointer into the GOT. In fact, if only one GOT segment
is needed and will not exceed the 64KB addressing maximum, all routines within
an image can use the same GOT pointer. Consequently, the GP register can
be loaded once and then used by many routines to improve performance.
2.4 Register Names
A few special register names
appear in uppercase letters. This register naming convention is not necessarily
followed by compiler or assembler tools that are used on Digital UNIX systems.
However, a simple name substitution can convert from the notation used here
to the appropriate convention. For example, the following code fragment might
be used in conjunction with the standard C preprocessor as a prelude to the
examples in this text:
#define FP $15
#define RA $26
#define PV $27
#define GP $29
#define SP $30
2.5 Program Image Layout
The Digital UNIX calling standard
defines only some aspects of an executable image. One basic concept that is
defined involves program image layout, which permits optimal access to static
data.