138 lines
5.2 KiB
Plaintext
138 lines
5.2 KiB
Plaintext
.SN 6
|
|
.BP
|
|
.S1 "TYPE REPRESENTATIONS"
|
|
The representations used for typed objects are not precisely
|
|
specified by EM.
|
|
Sometimes we only specify that a typed object occupies a
|
|
certain amount of space and state no further restrictions.
|
|
If one wants to have a different representation of the value of
|
|
an object on the stack one has to use a convert instruction
|
|
in most cases.
|
|
We do specify some relations between the representations of
|
|
types.
|
|
This allows some intermixed use of operators for different types
|
|
on the same object(s).
|
|
For example, the instruction ZER pushes signed and
|
|
unsigned integers with the value zero and empty sets.
|
|
ZER has as only argument the size of the object.
|
|
.A
|
|
The representation of floating point numbers is a good example,
|
|
it allows widely varying implementations.
|
|
The only ways to create floating point numbers are via
|
|
initialization and via conversions from integer numbers.
|
|
Only by using conversions to integers and comparing
|
|
two floating point numbers with each other, can these numbers
|
|
be converted to human readable output.
|
|
Implementations may use base 10, base 2 or any other
|
|
base for exponents, and have freedom in choosing the range of
|
|
exponent and mantissa.
|
|
.A
|
|
Other types are more precisely described.
|
|
In the following paragraphs a description will be given of the
|
|
restrictions imposed on the representation of the types used.
|
|
A number \fBn\fP used in these paragraphs indicates the size of
|
|
the object in \fIbits\fP.
|
|
.S2 "Unsigned integers"
|
|
The range of unsigned integers is 0..
|
|
.Ex 2 "\fBn\fP" -1.
|
|
A binary representation is assumed.
|
|
The order of the bits within an object is knowingly left
|
|
unspecified.
|
|
Discussing bit order within each 8-bit byte is academic,
|
|
so the only real freedom of this specification lies in the byte
|
|
order.
|
|
We really do not care whether an implementation of a 4-byte
|
|
integer has its bytes in a particular order of significance.
|
|
This of course means that some sequences of instructions have
|
|
unpredictable effects.
|
|
For example:
|
|
.DS
|
|
LOC 258 ; STL 0 ; LAL 0 ; LOI 1 ( wordsize >=2 )
|
|
.DE
|
|
The value on the stack after executing this sequence
|
|
can be anything,
|
|
but will most likely be 1 or 2.
|
|
.A
|
|
Conversion between unsigned integers of different sizes have to
|
|
be done with explicit convert instructions.
|
|
One cannot simply pad an unsigned integer with zero's at either end
|
|
and expect a correct result.
|
|
.A
|
|
We assume existence of at least single word unsigned arithmetic
|
|
in any implementation.
|
|
.S2 "Signed Integers"
|
|
The range of signed integers is
|
|
.Ex \-2 "\fBn\fP\-1" ~..
|
|
.Ex 2 "\fBn\fP\-1" \-1,
|
|
in other words the range of signed integers of \fBn\fP bits
|
|
using two's complement arithmetic.
|
|
The representation is the same as for unsigned integers except the range
|
|
.Ex 2 "\fBn\fP\-1" ~..
|
|
.Ex 2 "\fBn\fP" \-1
|
|
is mapped on the
|
|
range
|
|
.Ex \-2 "\fBn\fP\-1" ~..~\-1.
|
|
In other words, the most significant bit is used as sign bit.
|
|
The convert instructions between signed and unsigned integers
|
|
of the same size can be used to catch errors.
|
|
.A
|
|
The value
|
|
.Ex \-2 "\fBn\fP\-1"
|
|
is used for undefined
|
|
signed integers.
|
|
EM implementations should trap when this value is used in an
|
|
operation on signed integers.
|
|
The instruction mask, accessed with SIM and LIM \-~see chapter 9~\- ,
|
|
can be used to disable such traps.
|
|
.A
|
|
We assume existence of at least single word signed arithmetic
|
|
in any implementation.
|
|
.S2 "Floating point values"
|
|
Floating point values must have a signed mantissa and a signed
|
|
exponent.
|
|
Although no base is specified, base 2 is the normal choice,
|
|
because the FEF instruction pushes the exponent in base 2.
|
|
.A
|
|
The implementation of floating point arithmetic is optional.
|
|
The compilers currently in use have runtime parameters for the
|
|
size of the floating point values they should use.
|
|
Common choices are 4 and/or 8 bytes.
|
|
.S2 Pointers
|
|
EM has two kinds of pointers: for instruction and for data
|
|
space.
|
|
Each kind can only be used for its own space, conversion between
|
|
these two subtypes is impossible.
|
|
We assume that pointers have a range from 0 upwards.
|
|
Any implementation may have holes in the pointer range between
|
|
fragments.
|
|
One can of course not expect to be able to address two megabyte
|
|
of memory using a 2-byte pointer.
|
|
Normally, a 2-byte pointer allows up to 65536 bytes of
|
|
addressable memory.
|
|
.A
|
|
Pointer representation has one restriction.
|
|
The pointer with the same representation as the integer zero of
|
|
the same size should be invalid.
|
|
Some languages and/or runtime systems represent the nil
|
|
pointer as zero.
|
|
.S2 "Bit sets"
|
|
All bit sets of size \fBn\fP are subsets of the set
|
|
{~i~|~i>=0,~i<\fBn\fP~}.
|
|
A bit set contains a bit for each element showing its
|
|
presence or absence.
|
|
Bit sets are subdivided into words.
|
|
The word with the lowest EM address governs the subset
|
|
{~i~|~i>=0,~i<\fBm\fP~}, where \fBm\fP is the number of bits in
|
|
a word.
|
|
The next higher words each govern the next higher \fBm\fP set elements.
|
|
The relation between a set with size of
|
|
a word and an unsigned integer word is that
|
|
the value of the unsigned integer is the summation of the
|
|
2\v'-0.5m'i\v'0.5m' where i is in the set.
|
|
.A
|
|
Example: a 2-word bit set (wordsize 2) containing the
|
|
elements 1, 6, 8, 15, 18, 21, 27 and 28 is composed of two
|
|
integers, e.g. at addresses 40 and 42.
|
|
The word at 40 contains the value 33090 (or~\-32446),
|
|
the word at 42 contains the value 6180.
|