<<<    Index    >>>
5-9
DATA TYPES AND ADDRESSING MODES
5.3.3.2.SPECIFYING AN OFFSET
The offset part of a memory address can be specified either directly as an static value (called a
displacement) or through an address computation made up of one or more of the following
components:
•
Displacement—An 8-, 16-, or 32-bit value.
•
Base—The value in a general-purpose register.
•
Index—The value in a general-purpose register.
•
Scale factor—A value of 2, 4, or 8 that is multiplied by the index value.
The offset which results from adding these components is called an effective address. Each of
these components can have either a positive or negative (2s complement) value, with the excep-
tion of the scaling factor. Figure 5-6 shows all the possible ways that these components can be
combined to create an effective address in the selected segment.
The uses of general-purpose registers as base or index components are restricted in the following
manner:
•
The ESP register cannot be used as an index register.
•
When the ESP or EBP register is used as the base, the SS segment is the default segment.
In all other cases, the DS segment is the default segment.
The base, index, and displacement components can be used in any combination, and any of these
components can be null. A scale factor may be used only when an index also is used. Each
possible combination is useful for data structures commonly used by programmers in high-level
languages and assembly language. The following addressing modes suggest uses for common
combinations of address components.
Displacement
A displacement alone represents a direct (uncomputed) offset to the operand. Because the
displacement is encoded in the instruction, this form of an address is sometimes called an abso-
lute or static address. It is commonly used to access a statically allocated scalar operand.
Figure 5-6.  Offset (or Effective Address) Computation
Offset = Base + (Index 
?
 Scale) + Displacement
Base
EAX
EBX
ECX
EDX
ESP
EBP
ESI
EDI
EAX
EBX
ECX
EDX
EBP
ESI
EDI
1
None
2
3
4
8-bit
16-bit
32-bit
IndexScaleDisplacement
*
+
+
<<<    Index    >>>