When Intel defined the original 8086, it was a 16-bit processor with a 20-bit address bus (see below). They defined 8 general-purpose 16-bit registers - but gave them specific roles for certain instructions:
AXThe Accumulator register.
DXThe Data register.
AX- for example, as the result of a multiply.
CXThe Count register.
LOOPNE(loop if not equal) and
BXThe Base register.
SIThe Source Index register.
DIThe Destination Index register.
SPThe Stack Pointer register.
POPoperations, implicitly for
RETwith subroutines, and VERY implicitly during interrupts. As such, using it for anything else was hazardous to your program!
BPThe Base Pointer register.
BPcould be used to hold the current stack frame, and then when a new subroutine was called it coould be saved on the stack, the new stack frame created and used, and on return from the inner subroutine the old stack frame value could be restored.
The first three registers cannot be used for indexing into memory.
DI by default index into the current Data Segment (see below).
MOV AX, [BX+5] ; Point into Data Segment MOV AX, ES:[DI+5] ; Override into Extra Segment
DI, when used in memory-to-memory operations such as
CMPS, solely uses the Extra Segment (see below). This cannot be overridden.
BP use the Stack Segment (see below) by default.