Intel 64 and IA-32 Architectures Software Developers Manual Volume 1, Basic Architecture

Vol. 1 4-9
DATA TYPES
When storing floating-point values in memory, single-precision values are stored in 4
consecutive bytes in memory; double-precision values are stored in 8 consecutive
bytes; and double extended-precision values are stored in 10 consecutive bytes.
The single-precision and double-precision floating-point data types are operated on
by x87 FPU, and SSE/SSE2/SSE3 instructions. The double-extended-precision
floating-point format is only operated on by the x87 FPU. See Section 11.6.8,
“Compatibility of SIMD and x87 FPU Floating-Point Data Types,” for a discussion of
the compatibility of single-precision and double-precision floating-point data types
between the x87 FPU and SSE/SSE2/SSE3 extensions.
4.3 POINTER DATA TYPES
Pointers are addresses of locations in memory.
In non-64-bit modes, the architecture defines two types of pointers: a near pointer
and a far pointer. A near pointer is a 32-bit (or 16-bit) offset (also called an effec-
tive address) within a segment. Near pointers are used for all memory references in
a flat memory model or for references in a segmented model where the identity of
the segment being accessed is implied.
A far pointer is a logical address, consisting of a 16-bit segment selector and a 32-bit
(or 16-bit) offset. Far pointers are used for memory references in a segmented
memory model where the identity of a segment being accessed must be specified
explicitly. Near and far pointers with 32-bit offsets are shown in Figure 4-4.
4.3.1 Pointer Data Types in 64-Bit Mode
In 64-bit mode (a sub-mode of IA-32e mode), a near pointer is 64 bits. This
equates to an effective address. Far pointers in 64-bit mode can be one of three
forms:
16-bit segment selector, 16-bit offset if the operand size is 32 bits
16-bit segment selector, 32-bit offset if the operand size is 32 bits
16-bit segment selector, 64-bit offset if the operand size is 64 bits
See Figure 4-5.
Figure 4-4. Pointer Data Types
047
Far Pointer or Logical Address
Segment Selector
32 31
Offset
Near Pointer
031
Offset