| Code | Mnemonic | Description | 
|---|---|---|
| 0F 22 / r | MOV CR0, r32 | Move r32 to CR0 | 
| 0F 22 / r | MOV CR2, r32 | Move r32 to CR2 | 
| 0F 22 / r | MOV CR3, r32 | Move r32 to CR3 | 
| 0F 22 / r | MOV CR4, r32 | Move r32 to CR4 | 
| 0F 20 / r | MOV r32, CR0 | Move CR0 to r32 | 
| 0F 20 / r | MOV r32, CR2 | Move CR2 to r32 | 
| 0F 20 / r | MOV r32, CR3 | Move CR3 to r32 | 
| 0F 20 / r | MOV r32, CR4 | Move CR4 to r32 | 
Moves the contents of a control register (CR0, CR2, CR3, or CR4) to a general-purpose register or vice versa. The operand size for these instructions is always 32 bits, regardless of the operand-size attribute. (See "Control Registers" in Chapter 2 of the Intel Architecture Software Developer's Manual, Volume 3, for a detailed description of the flags and fields in the control registers.)
When loading a control register, a program should not attempt to change any of the reserved bits; that is, always set reserved bits to the value previously read.
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 effects:
| Operands | Bytes | Clocks | |
|---|---|---|---|
| r32, cr32 | 3 | 4 | NP | 
| cr32, r32 | 3 | 12/22 (cycles depend on which special register) | NP | 
| r32, dr32 | 3 | 2/12 (cycles depend on which special register) | NP | 
| dr32, r32 | 3 | 11/12 (cycles depend on which special register) | NP | 
| r32, tr32 | 3 | - | NP | 
| tr32, r32 | 3 | - | NP | 
| ID | unaffected | DF | unaffected | 
|---|---|---|---|
| VIP | unaffected | IF | unaffected | 
| VIF | unaffected | TF | unaffected | 
| AC | unaffected | SF | undefined | 
| VM | unaffected | ZF | undefined | 
| RF | unaffected | AF | undefined | 
| NT | unaffected | PF | undefined | 
| IOPL | unaffected | CF | undefined | 
| OF | undefined |