Skip to content

Latest commit

 

History

History
105 lines (88 loc) · 3.4 KB

explained.md

File metadata and controls

105 lines (88 loc) · 3.4 KB

CS.D stands for the "default operation size" field of the segment descriptor associated with the current Code Segment. This controls the default size of addresses and operands, and can be set to default to 16 or 32 bit operand-size.

In 64-bit aka long mode (CS.L=1), the only valid setting for CS.D = 32-bit, so a REX prefix with the W bit cleared leaves the default operand size at 32-bit. (An operand-size prefix can override the operand-size down to 16).

The default address size in long mode is 64-bit (an address-size prefix on an instruction overrides it to 32).

Segment descriptors are described in detail in Volume 3A - System Programming Guide, Part 1, chapter 3.4.5 Segment Descriptors.

The effects of the D field are also discussed in Volume 1 - Basic Architecture, chapter 3.6 Operand-size and address-size attributes.

ModR/M field

Instruction Prefix 0 or 1 Byte Address-Size Prefix 0 or 1 Byte Operand-Size Prefix 0 or 1 Byte Segment Prefix 0 or 1 Byte Opcode 1 or 2 Byte Mod R/M 0 or 1 Byte SIB, Scale Index Base (386+) 0 or 1 Byte Displacement 0, 1, 2 or 4 Byte (4 only 386+) Immediate 0, 1, 2 or 4 Byte (4 only 386+)

Format of Postbyte(Mod R/M byte from Intel-manual)

MM RRR MMM

MM - Memory addressing mode RRR - Register operand address MMM - Memory operand address

RRR Register Names Filds 8bit 16bit 32bit 000 AL AX EAX 001 CL CX ECX 010 DL DX EDX 011 Bl BX EBX 100 AH SP ESP 101 CH BP EBP 110 DH SI ESI 111 BH DI EDI


16bit memory (No 32 bit memory address prefix) MMM Default MM Field Field Sreg 00 01 10 11=MMM is reg 000 DS [BX+SI] [BX+SI+o8] [BX+SI+o16] 001 DS [BX+DI] [BX+DI+o8] [BX+DI+o16] 010 SS [BP+SI] [BP+SI+o8] [BP+SI+o16] 011 SS [BP+DI] [BP+DI+o8] [BP+DI+o16] 100 DS [SI] [SI+o8] [SI+o16] 101 DS [DI] [DI+o8] [SI+o16] 110 SS [o16] [BP+o8] [BP+o16] 111 DS [BX] [BX+o8] [BX+o16] Note: MMM=110,MM=0 Default Sreg is DS !!!!

32bit memory (Has 67h 32 bit memory address prefix) MMM Default MM Field Field Sreg 00 01 10 11=MMM is reg 000 DS [EAX] [EAX+o8] [EAX+o32] 001 DS [ECX] [ECX+o8] [ECX+o32] 010 DS [EDX] [EDX+o8] [EDX+o32] 011 DS [EBX] [EBX+o8] [EBX+o32] 100 SIB [SIB] [SIB+o8] [SIB+o32] 101 SS [o32] [EBP+o8] [EBP+o32] 110 DS [ESI] [ESI+o8] [ESI+o32] 111 DS [EDI] [EDI+o8] [EDI+o32] Note: MMM=110,MM=0 Default Sreg is DS !!!!


SIB is (Scale/Base/Index) SS BBB III Note: SIB address calculated as: =+*(2^(Scale))

Fild Default Base BBB Sreg Register Note 000 DS EAX 001 DS ECX 010 DS EDX 011 DS EBX 100 SS ESP 101 DS o32 if MM=00 (Postbyte) SS EBP if MM<>00 (Postbyte) 110 SS ESI 111 DS EDI

Fild Index III register Note 000 EAX 001 ECX 010 EDX 011 EBX 100 never Index SS can be 00 101 EBP 110 ESI 111 EDI

Fild Scale coefficient SS =2^(SS) 00 1 01 2 10 4 11 8