MOV—Move 
  Opcode
                 Instruction
              64-Bit
        Compat/
          Description 
                                                  Mode
          Leg Mode 
  88 /r
                  MOV r/m8,r8
              Valid
         Valid
            Move r8 to r/m8. 
  REX + 88 /r
            MOV r/m8***,r8***
        Valid
         N.E.
             Move r8 to r/m8. 
  89 /r
                  MOV r/m16,r16
            Valid
         Valid
            Move r16 to r/m16. 
  89 /r
                  MOV r/m32,r32
            Valid
         Valid
            Move r32 to r/m32. 
  REX.W + 89 /r
          MOV r/m64,r64
            Valid
         N.E.
             Move r64 to r/m64. 
  8A /r
                  MOV r8,r/m8
              Valid
         Valid
            Move r/m8 to r8. 
  REX + 8A /r
            MOV r8***,r/m8***
        Valid
         N.E.
             Move r/m8 to r8. 
  8B /r
                  MOV r16,r/m16
            Valid
         Valid
            Move r/m16 to r16. 
  8B /r
                  MOV r32,r/m32
            Valid
         Valid
            Move r/m32 to r32. 
  REX.W + 8B /r
          MOV r64,r/m64
            Valid
         N.E.
             Move r/m64 to r64. 
  8C /r
                  MOV r/m16,Sreg**
         Valid
         Valid
            Move segment register to 
                                                                                 r/m16. 
  REX.W + 8C /r
          MOV r/m64,Sreg**
         Valid
         Valid
            Move zero extended 16- 
                                                                                 bit segment register to 
                                                                                 r/m64. 
  8E /r
                  MOV Sreg,r/m16**
         Valid
         Valid
            Move r/m16 to segment 
                                                                                 register. 
  REX.W + 8E /r
          MOV Sreg,r/m64**
         Valid
         Valid
            Move lower 16 bits of 
                                                                                 r/m64 to segment 
                                                                                 register. 
  A0
                     MOV AL,moffs8*
           Valid
         Valid
            Move byte at (seg:offset) 
                                                                                 to AL. 
  REX.W + A0
             MOV AL,moffs8*
            Valid
        N.E.
             Move byte at (offset) to 
                                                                                 AL. 
  A1
                     MOV AX,moffs16*
          Valid
         Valid
            Move word at (seg:offset) 
                                                                                 to AX. 
  A1
                     MOV EAX,moffs32*
         Valid
         Valid
            Move doubleword at 
                                                                                 (seg:offset) to EAX. 
  REX.W + A1
             MOV RAX,moffs64*
         Valid
         N.E.
             Move quadword at (offset) 
                                                                                 to RAX. 
  A2
                     MOV moffs8,AL
             Valid
        Valid
            Move AL to (seg:offset). 
                                       *** 
  REX.W + A2
             MOV moffs8
       ,AL
     Valid
         N.E.
             Move AL to (offset). 
  A3
                     MOV moffs16*,AX
          Valid
         Valid
            Move AX to (seg:offset). 
MOV—Move
                                                                                        Vol. 2A
  3-639 
----------------------- Page 688-----------------------
INSTRUCTION SET REFERENCE, A-M 
 A3
                     MOV moffs32*,EAX
        Valid
        Valid
            Move EAX to (seg:offset). 
 Opcode
                 Instruction
             64-Bit
       Compat/
          Description 
                                                Mode
         Leg Mode 
 REX.W + A3
             MOV moffs64*,RAX
        Valid
        N.E.
             Move RAX to (offset). 
 B0+ rb
                 MOV r8, imm8
            Valid
        Valid
            Move imm8 to r8. 
                                *** 
 REX + B0+ rb
           MOV r8
    , imm8
        Valid
        N.E.
             Move imm8 to r8. 
 B8+ rw
                 MOV r16, imm16
          Valid
        Valid
            Move imm16 to r16. 
 B8+ rd
                 MOV r32, imm32
          Valid
        Valid
            Move imm32 to r32. 
 REX.W + B8+ rd
         MOV r64, imm64
          Valid
        N.E.
             Move imm64 to r64. 
 C6 /0
                  MOV r/m8, imm8
          Valid
        Valid
            Move imm8 to r/m8. 
 REX + C6 /0
            MOV r/m8***, imm8
       Valid
        N.E.
             Move imm8 to r/m8. 
 C7 /0
                  MOV r/m16, imm16
        Valid
        Valid
            Move imm16 to r/m16. 
 C7 /0
                  MOV r/m32, imm32
        Valid
        Valid
            Move imm32 to r/m32. 
 REX.W + C7 /0
          MOV r/m64, imm32
        Valid
         N.E.
            Move imm32 sign 
                                                                              extended to 64-bits to 
                                                                              r/m64. 
 NOTES: 
 *
  The moffs8, moffs16, moffs32 and moffs64 operands specify a simple offset relative to the seg- 
    ment base, where 8, 16, 32 and 64 refer to the size of the data. The address-size attribute of the 
    instruction determines the size of the offset, either 16, 32 or 64 bits. 
 ** In 32-bit mode, the assembler may insert the 16-bit operand-size prefix with this instruction (see 
    the following “Description” section for further information). 
 ***In 64-bit mode, r/m8 can not be encoded to access the following byte registers if a REX prefix is 
    used: AH, BH, CH, DH. 
Description 
Copies the second operand (source operand) to the first operand (destination 
operand). The source operand can be an immediate value, general-purpose register, 
segment register, or memory location; the destination register can be a general- 
purpose register, segment register, or memory location. Both operands must be the 
same size, which can be a byte, a word, a doubleword, or a quadword. 
The MOV instruction cannot be used to load the CS register. Attempting to do so 
results in an invalid opcode exception (#UD). To load the CS register, use the far JMP, 
CALL, or RET instruction. 
If the destination operand is a segment register (DS, ES, FS, GS, or SS), the source 
operand must be a valid segment selector. In protected mode, moving a segment 
3-640
   Vol. 2A
                                                                                 MOV—Move 
----------------------- Page 689-----------------------
                                                                   INSTRUCTION SET REFERENCE, A-M 
 selector into a segment register automatically causes the segment descriptor infor- 
 mation associated with that segment selector to be loaded into the hidden (shadow) 
 part of the segment register. While loading this information, the segment selector 
 and segment descriptor information is validated (see the “Operation” algorithm 
 below). The segment descriptor data is obtained from the GDT or LDT entry for the 
 specified segment selector. 
 A NULL segment selector (values 0000-0003) can be loaded into the DS, ES, FS, and 
 GS registers without causing a protection exception. However, any subsequent 
 attempt to reference a segment whose corresponding segment register is loaded 
 with a NULL value causes a general protection exception (#GP) and no memory 
 reference occurs. 
 Loading the SS register with a MOV instruction inhibits all interrupts until after the 
 execution of the next instruction. This operation allows a stack pointer to be loaded 
 into the ESP register with the next instruction (MOV ESP, stack-pointer value) 
 before an interrupt occurs1. Be aware that the LSS instruction offers a more efficient 
 method of loading the SS and ESP registers. 
 When operating in 32-bit mode and moving data between a segment register and a 
 general-purpose register, the 32-bit IA-32 processors do not require the use of the 
 16-bit operand-size prefix (a byte with the value 66H) with this instruction, but most 
 assemblers will insert it if the standard form of the instruction is used (for example, 
 MOV DS, AX). The processor will execute this instruction correctly, but it will usually 
 require an extra clock. With most assemblers, using the instruction form MOV DS, 
 EAX will avoid this unneeded 66H prefix. When the processor executes the instruc- 
 tion with a 32-bit general-purpose register, it assumes that the 16 least-significant 
 bits of the general-purpose register are the destination or source operand. If the 
 register is a destination operand, the resulting value in the two high-order bytes of 
 the register is implementation dependent. For the Pentium 4, Intel Xeon, and P6 
 family processors, the two high-order bytes are filled with zeros; for earlier 32-bit 
 IA-32 processors, the two high order bytes are undefined. 
 In 64-bit mode, the instruction’s default operation size is 32 bits. Use of the REX.R 
 prefix permits access to additional registers (R8-R15). Use of the REX.W prefix 
 promotes operation to 64 bits. See the summary chart at the beginning of this 
 section for encoding data and limits. 
 1.
  If a code instruction breakpoint (for debug) is placed on an instruction located immediately after 
     a MOV SS instruction, the breakpoint may not be triggered. However, in a sequence of instruc- 
     tions that load the SS register, only the first instruction in the sequence is guaranteed to delay 
     an interrupt. 
     In the following sequence, interrupts may be recognized before MOV ESP, EBP executes: 
     MOV SS, EDX 
     MOV SS, EAX 
     MOV ESP, EBP 
MOV—Move
                                                                                  Vol. 2A 3-641 
----------------------- Page 690-----------------------
INSTRUCTION SET REFERENCE, A-M 
Operation 
DEST ←SRC; 
Loading a segment register while in protected mode results in special checks and 
actions, as described in the following listing. These checks are performed on the 
segment selector and the segment descriptor to which it points. 
IF SS is loaded 
    THEN 
         IF segment selector is NULL 
              THEN #GP(0); FI; 
         IF segment selector index is outside descriptor table limits 
         or segment selector's RPL ≠ CPL 
         or segment is not a writable data segment 
         or DPL ≠ CPL 
              THEN #GP(selector); FI; 
         IF segment not marked present 
              THEN #SS(selector); 
              ELSE 
                    SS ←segment selector; 
                    SS ←segment descriptor; FI; 
FI; 
IF DS, ES, FS, or GS is loaded with non-NULL selector 
THEN 
    IF segment selector index is outside descriptor table limits 
    or segment is not a data or readable code segment 
    or ((segment is a data or nonconforming code segment) 
    and (both RPL and CPL > DPL)) 
         THEN #GP(selector); FI; 
    IF segment not marked present 
         THEN #NP(selector); 
         ELSE 
              SegmentRegister ←segment selector; 
              SegmentRegister ←segment descriptor; FI; 
FI; 
IF DS, ES, FS, or GS is loaded with NULL selector 
    THEN 
         SegmentRegister ←segment selector; 
         SegmentRegister ←segment descriptor; 
FI; 
3-642
   Vol. 2A
                                                                                    MOV—Move 
----------------------- Page 691-----------------------
                                                            INSTRUCTION SET REFERENCE, A-M 
 Flags Affected 
 None. 
 Protected Mode Exceptions 
 #GP(0)
                If attempt is made to load SS register with NULL segment 
                       selector. 
                       If the destination operand is in a non-writable segment. 
                       If a memory operand effective address is outside the CS, DS, 
                       ES, FS, or GS segment limit. 
                       If the DS, ES, FS, or GS register contains a NULL segment 
                       selector. 
 #GP(selector)
         If segment selector index is outside descriptor table limits. 
                       If the SS register is being loaded and the segment selector's RPL 
                       and the segment descriptor’s DPL are not equal to the CPL. 
                       If the SS register is being loaded and the segment pointed to is a 
                       non-writable data segment. 
                       If the DS, ES, FS, or GS register is being loaded and the 
                       segment pointed to is not a data or readable code segment. 
                       If the DS, ES, FS, or GS register is being loaded and the 
                       segment pointed to is a data or nonconforming code segment, 
                       but both the RPL and the CPL are greater than the DPL. 
 #SS(0)
                If a memory operand effective address is outside the SS 
                       segment limit. 
 #SS(selector)
         If the SS register is being loaded and the segment pointed to is 
                       marked not present. 
 #NP
                   If the DS, ES, FS, or GS register is being loaded and the 
                       segment pointed to is marked not present. 
 #PF(fault-code)
       If a page fault occurs. 
 #AC(0)
                If alignment checking is enabled and an unaligned memory 
                       reference is made while the current privilege level is 3. 
 #UD
                   If attempt is made to load the CS register. 
                       If the LOCK prefix is used. 
 Real-Address Mode Exceptions 
 #GP
                   If a memory operand effective address is outside the CS, DS, 
                       ES, FS, or GS segment limit. 
 #SS
                   If a memory operand effective address is outside the SS 
                       segment limit. 
 #UD
                   If attempt is made to load the CS register. 
                       If the LOCK prefix is used. 
MOV—Move
                                                                        Vol. 2A 3-643 
----------------------- Page 692-----------------------
INSTRUCTION SET REFERENCE, A-M 
Virtual-8086 Mode Exceptions 
#GP(0)
               If a memory operand effective address is outside the CS, DS, 
                     ES, FS, or GS segment limit. 
#SS(0)
               If a memory operand effective address is outside the SS 
                     segment limit. 
#PF(fault-code)
      If a page fault occurs. 
#AC(0)
               If alignment checking is enabled and an unaligned memory 
                     reference is made. 
#UD
                  If attempt is made to load the CS register. 
                     If the LOCK prefix is used. 
Compatibility Mode Exceptions 
Same exceptions as in protected mode. 
64-Bit Mode Exceptions 
#GP(0)
               If the memory address is in a non-canonical form. 
                     If an attempt is made to load SS register with NULL segment 
                     selector when CPL = 3. 
                     If an attempt is made to load SS register with NULL segment 
                     selector when CPL < 3 and CPL ≠ RPL. 
#GP(selector)
        If segment selector index is outside descriptor table limits. 
                     If the memory access to the descriptor table is non-canonical. 
                     If the SS register is being loaded and the segment selector's RPL 
                     and the segment descriptor’s DPL are not equal to the CPL. 
                     If the SS register is being loaded and the segment pointed to is 
                     a nonwritable data segment. 
                     If the DS, ES, FS, or GS register is being loaded and the 
                     segment pointed to is not a data or readable code segment. 
                     If the DS, ES, FS, or GS register is being loaded and the 
                     segment pointed to is a data or nonconforming code segment, 
                     but both the RPL and the CPL are greater than the DPL. 
#SS(0)
               If the stack address is in a non-canonical form. 
#SS(selector)
        If the SS register is being loaded and the segment pointed to is 
                     marked not present. 
#PF(fault-code)
      If a page fault occurs. 
#AC(0)
               If alignment checking is enabled and an unaligned memory 
                     reference is made while the current privilege level is 3. 
#UD
                  If attempt is made to load the CS register. 
                     If the LOCK prefix is used. 
3-644 Vol. 2A
                                                                  MOV—Move 
----------------------- Page 693-----------------------
                                                                     INSTRUCTION SET REFERENCE, A-M 
 MOV—Move to/from Control Registers 
  Opcode
                Instruction
          64-Bit
      Compat/
         Description 
                                             Mode
        Leg Mode 
  0F 20 /0
              MOV r32,CR0
          N.E.
        Valid
           Move CR0 to r32. 
  0F 20 /0
              MOV r64,CR0
          Valid
       N.E.
            Move extended CR0 to r64. 
  0F 20 /2
              MOV r32,CR2
          N.E.
        Valid
           Move CR2 to r32. 
  0F 20 /2
              MOV r64,CR2
          Valid
       N.E.
            Move extended CR2 to r64. 
  0F 20 /3
              MOV r32,CR3
          N.E.
        Valid
           Move CR3 to r32. 
  0F 20 /3
              MOV r64,CR3
          Valid
       N.E.
            Move extended CR3 to r64. 
  0F 20 /4
              MOV r32,CR4
          N.E.
        Valid
           Move CR4 to r32. 
  0F 20 /4
              MOV r64,CR4
          Valid
       N.E.
            Move extended CR4 to r64. 
                                                                                                      1 
  REX.R + 0F 20 /0
      MOV r64,CR8
          Valid
        N.E.
           Move extended CR8 to r64. 
  0F 22 /0
              MOV CR0,r32
          N.E.
        Valid
           Move r32 to CR0. 
  0F 22 /0
              MOV CR0,r64
         Valid
        N.E.
            Move r64 to extended CR0. 
  0F 22 /2
              MOV CR2,r32
          N.E.
        Valid
           Move r32 to CR2. 
  0F 22 /2
              MOV CR2,r64
         Valid
        N.E.
            Move r64 to extended CR2. 
  0F 22 /3
              MOV CR3,r32
          N.E.
        Valid
           Move r32 to CR3. 
  0F 22 /3
              MOV CR3,r64
         Valid
        N.E.
            Move r64 to extended CR3. 
  0F 22 /4
              MOV CR4,r32
          N.E.
        Valid
           Move r32 to CR4. 
  0F 22 /4
              MOV CR4,r64
         Valid
        N.E.
            Move r64 to extended CR4. 
  REX.R + 0F 22 /0
      MOV CR8,r64
         Valid
        N.E.
            Move r64 to extended CR8. 
  NOTE: 
  1.
   MOV CR* instructions, except for MOV CR8, are serializing instructions. MOV CR8 is not 
      architecturally defined as a serializing instruction. For more information, see Chapter 7 in Intel(R) 
      64 and IA-32 Architectures Software Developer’s Manual, Volume 3A. 
 Description 
 Moves the contents of a control register (CR0, CR2, CR3, CR4, or CR8) to a general- 
 purpose register or the contents of a general purpose register to a control register. 
 The operand size for these instructions is always 32 bits in non-64-bit modes, 
 regardless of the operand-size attribute. (See “Control Registers” in Chapter 2 of the 
 Intel(R) 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A, for a 
 detailed description of the flags and fields in the control registers.) This instruction 
 can be executed only when the current privilege level is 0. 
 When loading control registers, programs should not attempt to change the reserved 
 bits; that is, always set reserved bits to the value previously read. An attempt to 
 change CR4's reserved bits will cause a general protection fault. Reserved bits in CR0 
MOV—Move to/from Control Registers
                                                          Vol. 2A 3-645 
----------------------- Page 694-----------------------
INSTRUCTION SET REFERENCE, A-M 
and CR3 remain clear after any load of those registers; attempts to set them have no 
impact. On Pentium 4, Intel Xeon and P6 family processors, CR0.ET remains set after 
any load of CR0; attempts to clear this bit have no impact. 
At the opcode level, the reg field within the ModR/M byte specifies which of the 
control registers is loaded or read. The 2 bits in the mod field are always 11B. The 
r/m field specifies the general-purpose register loaded or read. 
These instructions have the following side effect: 
*
    When writing to control register CR3, all non-global TLB entries are flushed (see 
    “Translation Lookaside Buffers (TLBs)” in Chapter 3 of the Intel(R) 64 and IA-32 
    Architectures Software Developer’s Manual, Volume 3A). 
The following side effects are implementation specific for the Pentium 4, Intel Xeon, 
and P6 processor family. Software should not depend on this functionality in all Intel 
64 or IA-32 processors: 
*
    When modifying any of the paging flags in the control registers (PE and PG in 
     register CR0 and PGE, PSE, and PAE in register CR4), all TLB entries are flushed, 
     including global entries. 
*
    If the PG flag is set to 1 and control register CR4 is written to set the PAE flag to 
     1 (to enable the physical address extension mode), the pointers in the page- 
     directory pointers table (PDPT) are loaded into the processor (into internal, non- 
     architectural registers). 
*
    If the PAE flag is set to 1 and the PG flag set to 1, writing to control register CR3 
     will cause the PDPTRs to be reloaded into the processor. If the PAE flag is set to 1 
     and control register CR0 is written to set the PG flag, the PDPTRs are reloaded 
     into the processor. 
In 64-bit mode, the instruction’s default operation size is 64 bits. The REX.R prefix 
must be used to access CR8. Use of REX.B permits access to additional registers (R8- 
R15). Use of the REX.W prefix or 66H prefix is ignored. See the summary chart at the 
beginning of this section for encoding data and limits. 
See “Changes to Instruction Behavior in VMX Non-Root Operation” in Chapter 21 of 
the Intel(R) 64 and IA-32 Architectures Software Developer’s Manual, Volume 3B, for 
more information about the behavior of this instruction in VMX non-root operation. 
Operation 
DEST ← SRC; 
Flags Affected 
The OF, SF, ZF, AF, PF, and CF flags are undefined. 
Protected Mode Exceptions 
#GP(0)
                  If the current privilege level is not 0. 
3-646
  Vol. 2A
                                                    MOV—Move to/from Control Registers 
----------------------- Page 695-----------------------
                                                                 INSTRUCTION SET REFERENCE, A-M 
                         If an attempt is made to write invalid bit combinations in CR0 
                         (such as setting the PG flag to 1 when the PE flag is set to 0, or 
                         setting the CD flag to 0 when the NW flag is set to 1). 
                         If an attempt is made to write a 1 to any reserved bit in CR4. 
                         If any of the reserved bits are set in the page-directory pointers 
                         table (PDPT) and the loading of a control register causes the 
                         PDPT to be loaded into the processor. 
 #UD
                      If the LOCK prefix is used. 
 Real-Address Mode Exceptions 
 #GP
                     If an attempt is made to write a 1 to any reserved bit in CR4. 
                         If an attempt is made to write invalid bit combinations in CR0 
                         (such as setting the PG flag to 1 when the PE flag is set to 0). 
 #UD
                      If the LOCK prefix is used. 
 Virtual-8086 Mode Exceptions 
 #GP(0)
                  These instructions cannot be executed in virtual-8086 mode. 
 Compatibility Mode Exceptions 
 #GP(0)
                  If the current privilege level is not 0. 
                         If an attempt is made to write invalid bit combinations in CR0 
                         (such as setting the PG flag to 1 when the PE flag is set to 0, or 
                         setting the CD flag to 0 when the NW flag is set to 1). 
                         If an attempt is made to write a 1 to any reserved bit in CR3. 
                         If an attempt is made to leave IA-32e mode by clearing 
                         CR4.PAE[bit 5]. 
 #UD
                      If the LOCK prefix is used. 
 64-Bit Mode Exceptions 
 #GP(0)
                  If the current privilege level is not 0. 
                         If an attempt is made to write invalid bit combinations in CR0 
                         (such as setting the PG flag to 1 when the PE flag is set to 0, or 
                         setting the CD flag to 0 when the NW flag is set to 1). 
                         Attempting to clear CR0.PG[bit 32]. 
                         If an attempt is made to write a 1 to any reserved bit in CR4. 
                         If an attempt is made to write a 1 to any reserved bit in CR8. 
                         If an attempt is made to write a 1 to any reserved bit in CR3. 
                         If an attempt is made to leave IA-32e mode by clearing 
                         CR4.PAE[bit 5]. 
 #UD
                      If the LOCK prefix is used. 
MOV—Move to/from Control Registers
                                                    Vol. 2A 3-647 
----------------------- Page 696-----------------------
INSTRUCTION SET REFERENCE, A-M 
MOV—Move to/from Debug Registers 
 Opcode
               Instruction
              64-Bit
     Compat/
       Description 
                                               Mode
       Leg Mode 
 0F 21/r
              MOV r32, DR0-DR7
         N.E.
       Valid
         Move debug register to r32 
 0F 21/r
              MOV r64, DR0-DR7
         Valid
      N.E.
          Move extended debug 
                                                                        register to r64. 
 0F 23 /r
             MOV DR0-DR7, r32
         N.E.
       Valid
         Move r32 to debug register 
 0F 23 /r
             MOV DR0-DR7, r64
         Valid
       N.E.
        Move r64 to extended debug 
                                                                        register. 
Description 
Moves the contents of a debug register (DR0, DR1, DR2, DR3, DR4, DR5, DR6, or 
DR7) to a general-purpose register or vice versa. The operand size for these instruc- 
tions is always 32 bits in non-64-bit modes, regardless of the operand-size attribute. 
(See Chapter 18, “Debugging and Performance Monitoring”, of the Intel(R) 64 and 
IA-32 Architectures Software Developer’s Manual, Volume 3A, for a detailed descrip- 
tion of the flags and fields in the debug registers.) 
The instructions must be executed at privilege level 0 or in real-address mode. 
When the debug extension (DE) flag in register CR4 is clear, these instructions 
operate on debug registers in a manner that is compatible with Intel386 and Intel486 
processors. In this mode, references to DR4 and DR5 refer to DR6 and DR7, respec- 
tively. When the DE flag in CR4 is set, attempts to reference DR4 and DR5 result in 
an undefined opcode (#UD) exception. (The CR4 register was added to the IA-32 
Architecture beginning with the Pentium processor.) 
At the opcode level, the reg field within the ModR/M byte specifies which of the debug 
registers is loaded or read. The two bits in the mod field are always 11. The r/m field 
specifies the general-purpose register loaded or read. 
In 64-bit mode, the instruction’s default operation size is 64 bits. Use of the REX.B 
prefix permits access to additional registers (R8-R15). Use of the REX.W or 66H 
prefix is ignored. See the summary chart at the beginning of this section for encoding 
data and limits. 
Operation 
IF ((DE = 1)
  and (SRC or DEST = DR4 or DR5)) 
    THEN 
         #UD; 
    ELSE 
         DEST ← SRC; 
FI; 
3-648
   Vol. 2A
                                                      MOV—Move to/from Debug Registers 
----------------------- Page 697-----------------------
                                                               INSTRUCTION SET REFERENCE, A-M 
 Flags Affected 
 The OF, SF, ZF, AF, PF, and CF flags are undefined. 
 Protected Mode Exceptions 
 #GP(0)
                 If the current privilege level is not 0. 
 #UD
                    If CR4.DE[bit 3] = 1 (debug extensions) and a MOV instruction 
                        is executed involving DR4 or DR5. 
                        If the LOCK prefix is used. 
 #DB
                    If any debug register is accessed while the DR7.GD[bit 13] = 1. 
 Real-Address Mode Exceptions 
 #UD
                    If CR4.DE[bit 3] = 1 (debug extensions) and a MOV instruction 
                        is executed involving DR4 or DR5. 
                        If the LOCK prefix is used. 
 #DB
                    If any debug register is accessed while the DR7.GD[bit 13] = 1. 
 Virtual-8086 Mode Exceptions 
 #GP(0)
                 The debug registers cannot be loaded or read when in virtual- 
                        8086 mode. 
 Compatibility Mode Exceptions 
 Same exceptions as in protected mode. 
 64-Bit Mode Exceptions 
 #GP(0)
                 If the current privilege level is not 0. 
 #UD
                    If CR4.DE[bit 3] = 1 (debug extensions) and a MOV instruction 
                        is executed involving DR4 or DR5. 
                        If the LOCK prefix is used. 
 #DB
                    If any debug register is accessed while the DR7.GD[bit 13] = 1. 
MOV—Move to/from Debug Registers
                                                    Vol. 2A 3-649 
----------------------- Page 698-----------------------
INSTRUCTION SET REFERENCE, A-M 
MOVAPD—Move Aligned Packed Double-Precision Floating-Point 
Values 
 Opcode
        Instruction
            64-Bit
     Compat/
       Description 
                                      Mode
       Leg Mode 
 66 0F 28 /r
   MOVAPD xmm1,
           Valid
      Valid
         Move packed double-precision 
               xmm2/m128
                                       floating-point values from 
                                                               xmm2/m128 to xmm1. 
 66 0F 29 /r
   MOVAPD
                 Valid
      Valid
         Move packed double-precision 
               xmm2/m128, xmm1
                                 floating-point values from xmm1 to 
                                                               xmm2/m128. 
Description 
Moves a double quadword containing two packed double-precision floating-point 
values from the source operand (second operand) to the destination operand (first 
operand). This instruction can be used to load an XMM register from a 128-bit 
memory location, to store the contents of an XMM register into a 128-bit memory 
location, or to move data between two XMM registers. When the source or destina- 
tion operand is a memory operand, the operand must be aligned on a 16-byte 
boundary or a general-protection exception (#GP) will be generated. 
To move double-precision floating-point values to and from unaligned memory loca- 
tions, use the MOVUPD instruction. 
In 64-bit mode, use of the REX.R prefix permits this instruction to access additional 
registers (XMM8-XMM15). 
Operation 
DEST ← SRC; 
(* #GP if SRC or DEST unaligned memory operand *) 
Intel C/C++ Compiler Intrinsic Equivalent 
__m128 _mm_load_pd(double * p) 
void _mm_store_pd(double *p, __m128 a) 
SIMD Floating-Point Exceptions 
None. 
3-650
  Vol. 2A
                       MOVAPD—Move Aligned Packed Double-Precision Floating-Point Values 
----------------------- Page 699-----------------------
                                                               INSTRUCTION SET REFERENCE, A-M 
 Protected Mode Exceptions 
 #GP(0)
                 For an illegal memory operand effective address in the CS, DS, 
                        ES, FS or GS segments. 
                        If a memory operand is not aligned on a 16-byte boundary, 
                        regardless of segment. 
 #SS(0)
                  For an illegal address in the SS segment. 
 #PF(fault-code)
         For a page fault. 
 #NM
                    If CR0.TS[bit 3] = 1. 
 #UD
                     If CR0.EM[bit 2] = 1. 
                        If CR4.OSFXSR[bit 9] = 0. 
                        If CPUID.01H:EDX.SSE2[bit 26] = 0. 
                        If the LOCK prefix is used. 
 Real-Address Mode Exceptions 
 #GP
                    If a memory operand is not aligned on a 16-byte boundary, 
                        regardless of segment. 
                        If any part of the operand lies outside the effective address 
                        space from 0 to FFFFH. 
 #NM
                     If CR0.TS[bit 3] = 1. 
 #UD
                     If CR0.EM[bit 2] = 1. 
                        If CR4.OSFXSR[bit 9] = 0. 
                        If CPUID.01H:EDX.SSE2[bit 26] = 0. 
                        If the LOCK prefix is used. 
 Virtual-8086 Mode Exceptions 
 Same exceptions as in real address mode. 
 #PF(fault-code)
          For a page fault. 
 Compatibility Mode Exceptions 
 Same exceptions as in protected mode. 
 64-Bit Mode Exceptions 
 #SS(0)
                 If a memory address referencing the SS segment is in a non- 
                        canonical form. 
 #GP(0)
                 If the memory address is in a non-canonical form. 
                        If memory operand is not aligned on a 16-byte boundary, 
                        regardless of segment. 
 #PF(fault-code)
         For a page fault. 
 #NM
                    If CR0.TS[bit 3] = 1. 
MOVAPD—Move Aligned Packed Double-Precision Floating-Point Values
                    Vol. 2A 3-651 
----------------------- Page 700-----------------------