In section 4.3 of Intel 64® and IA-32 Architectures Software Developer’s Manual. Volume 1: Basic Architecture, it says:
A near pointer is a 32-bit offset … 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.
This leads me to wondering: how is the implied segment register determined?
I know that (%eip) and displaced (%eip) (e.g. -4(%eip)) addresses use %cs by default, and that (%esp) and displaced (%esp) addresses use %ss, but what about (%eax), (%edx), (%edi), (%ebp) etc., and can the implicit segment register depend also on the instruction that the memory address operand appears in?
Other than
CSandSSregister accesses that you mentioned, most other accesses will use theDSsegment register. A couple exceptions that I can recall:ESfor the ‘destination’ (implicitly addressed by theEDIregister) segment registerEBPregister as a ‘base address’ register will use theSSsegment register. However, if theEBPregister is used as a scaled index register, the segment used will beDS(unless the base address register isESP)