General-purpose registers can be assigned to a variety of functions by
the programmer. In some cases, general- purpose registers can be used for
addressing functions (e.g., register indirect, displacement).
In other cases, there is a partial or clean separation between data registers
and address registers.
Data registers may be used to hold only data and cannot be employed in the
calculation of an operand address.
Address registers may be somewhat general purpose, or they may be devoted
to a particular addressing mode. Examples include the following:
- Segment pointer: In a machine with segment addressing, a segment register holds the address of the base of the segment. There may be multiple registers, one for the code segment and one for the data segment.
- Index registers: These are used for indexed addressing and may be
autoindexed.
- Stack pointer: If there is user visible stack addressing, then typically
the stack is in memory and there is a dedicated register that points to the
top of the stack.
Condition Codes (also referred to as flags) are bits set by the CPU hardware
as the result of the operations. For example, an arithmatic operation may
produce a positive, negative, zero or overflow result. In addition to
the result itself beign stored in a register or memory, a condition code
is also set. The code may be subsequently be tested as part of a condition
branch operation. Condition code bits are collected into one or more
registers.