These registers were originally implicitly used in repetitive instructions, for instance MOVSB
, which copies a byte from DS:SI
(DataSegment:SourceIndex) to ES:DI
(ExtraSegment:DestinationIndex), at the time of the 16-bits computers with segmented memory in real mode. And also as index registers in 16-bit addressing modes like [bx + si]
.
Right now, these registers are for example used to transmit the first two (integer) function parameters in UNIX’s x86_64 ABI, far from their original purpose. (See also What are the calling conventions for UNIX & Linux system calls (and user-space functions) on i386 and x86-64)
The names of the new rXX
64-bit registers clearly show that old register names are only here for familiarity and retro-compatibility.
But note that some instructions do still only work with some registers, for example rep movsb
only works as a memcpy(rdi, rsi, rcx)
, and is in fact why RDI and RSI were chosen as the first 2 arg-passing registers in the x86-64 System V ABI: Some functions call memset
or memcpy
with their first 1 or 2 args, so inlining rep movsb/d
is cheaper in that case.