MOV
移入/移出控制登记册
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
0F 20/r | MOV r32, CR0CR7 | MR | .e. v | alid m | ove 控制寄存器 到 r32. [永久失效連結] (中文(简体) ). |
0F 20/r | MOV r64, CR0CR7 | MR | alid n | .e. m | ove将控制寄存器扩展至r64. |
REX.R + 0F 20 /0 | MOV r64, CR8 | MR | 有效 | 不可编码 | 将扩展的 CR8 移动到 r64 1 。 |
0F 22 /r | MOV CR0CR7, r32 | RM | .e. v | alid m | ove r32 到 控制寄存器. 中国植物物种信息数据库. |
0F 22 /r | MOV CR0CR7, r64 | RM | alid n | .e. m | ove r64 到扩展 控制寄存器. |
REX.R + 0F 22 /0 | MOV CR8, r64 | RM | 有效 | 不可编码 | 移动 r64 到扩展 CR8.1 |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
MR
modrm.rmescrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移modrm.reglecturaModRM 字节的 reg 字段(第 5-3 位)
RM
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
将 控制寄存器 (CR0, CR2, CR3, CR4, 或 CR8) 的内容移动到 通用寄存器 或 通用寄存器 的内容移动到 控制寄存器. 这些指令的操作数大小在非64位模式中总是32位,无论操作数的大小属性如何. 在64位能处理器上,在64位模式的0外执行MOV到CR,将控制寄存器的上32位执行. (见Intel(R)64和IA-32架构软件开发者手册第3A卷第2章中的"控制注册",详细描述控制注册中的旗帜和字段. ) 本指令只有在当前特权级别为0时才能执行.
在 操作码 级别上, ModR/M 字节中的 reg 字段指定了哪个控制登记册是加载或读取的. Mod字段中的2位被忽略. R/m 字段指定装入或读取的 通用寄存器 。 CR0,CR3,和CR4中的一些位点是保留的,必须用零写. 试图在 CR0 [31:0] 中设置任何保留位元的尝试被忽略 。 试图在 CR0 [63:32] 中设置任何保留位点,导致一般保护例外 #GP(0). 未启用PCID时,不使用CR3中的2:0和11:5的位元,并忽略设置它们的尝试. 关于CR3中保留的位元的处理,见下段. 试图在 CR4 中设置任何保留位元的结果为 #GP(0) 。 在Pentium 4,Intel Xeon和P6家族处理器上,CR0.ET在CR0的任何负载后仍然被设置;试图清除这一位没有影响.
通常,MAXPHYADDR是CPUID.80000008H:EAX[7:0]中列举的值. 然而,如果IA32 TME ACTI-VATE[0]=1(表示TME已经配置),则当一个逻辑处理器在安全仲裁模式(SEAM;见Intel(R)64第35章和IA-32架构软件开发者手册,第3卷)之外时,MAXPHYADDR的值被IA32 TME ACTI-VATE[39:36]降低;该值在SEAM中不降低. 试图在 CR3 [63:MAXPHYADDR] 中设置任何保留位,结果为 #GP(0).
在某些情况下,这些指令具有在TLBs和page-结构缓存中取消条目的副作用. 见5.10.4.1节,"使TLBs和Page-Structure Caches无效的操作",详见Intel(R)64和IA-32架构软件开发者手册第3A卷.
以下副作用针对Pentium 4,Intel Xeon,以及P6处理器家族: 当修改注册CR0中的PE或PG时,或者在注册CR4中的PSE或PAE时,所有TLB条目都被冲走,包括全局条目. 软件不应依赖于所有Intel 64或IA-32处理器中的这一功能.
在64位模式下,指令的默认操作大小为64位. REX.R的前缀必须用于访问CR8. 使用REX.B可以访问额外的登记册(R8-R15). REX.W前缀或66H前缀的使用被忽略. 使用 REX.R 前缀指定除 CR8 以外的寄存器会导致无效-操作码 例外. 参见本节开头的汇总图,用于编码数据和限制.
如果 CR4.PCIDE = 1, 源操作数 到 MOV 到 CR3 的比特 63 确定指令是否使 TLBs 和 page-结构缓存中的条目无效(见第5.10.4.1节,"使 TLBs 和 Page-Structure Caches 无效的操作",Intel(R) 64 和 IA-32 Architectures Software开发者手册,Volume 3A). 该指令不修改 CR3 的比特 63,该比特是保留且总是0.
请参看Intel(R)64和IA-32架构软件开发者手册第3C卷第27章中的"VMX非root操作中的改变指令行为",以了解VMX非root操作中此指令行为的更多信息.
行动
DEST := SRC;受影响的旗帜
OF,SF,ZF,AF,PF,和CF旗没有定义.
异常
保护模式
#GP(0) | 如果当前特权级别不是 0 。 如果尝试在 CR0 中写入无效的位元组合( 如在 PE 旗帜设置为 0 时将 PG 旗帜设置为 1 , 或者在 NW 旗帜设置为 1 时将 CD 旗帜设置为 0 ) 。 如果尝试在 CR4 中写入 1 到 CR4.PCIDE 中的任何保留位元组合 。 如果尝试将 1 到 TSS 中的任何保留位元设置在页指针表( PDPT) 中, 并加载一个 控制寄存器 会导致 PDPT 被加载到处理器中。 如果尝试激活 IA-32e 模式, 而当前 CS 或 CS 有 L- 位设置或 TR 引用 16- bit Zq6qqz 。 |
#UD | 如果使用 LOCK 前缀。 如果尝试访问 CR1, CR5, CR6, CR7, 或 CR9CR15 。 |
实地址模式
#GP | 如果尝试在 CR4 中写入 1 到任何保留位 。 如果尝试在 CR4.PCIDE 中写入 1 到 CR4.PCIDE 。 如果尝试在 CR0 中写入无效位组合( 如在 PE 旗设定为 0 时将 PG 旗设置为 1 ) , 如果尝试激活 IA-32e 模式, 而当前 CS 要么有 L 位集, 要么 TR 引用为 16 位 TSS 。 |
#UD | 如果使用 LOCK 前缀。 如果尝试访问 CR1, CR5, CR6, CR7, 或 CR9CR15 。 |
虚拟 8086 模式
#GP(0) | 这些指令无法在 虚拟 8086 模式 中执行 。 |
兼容模式
#GP(0) | 如果当前特权级别不是 0 。 如果尝试在其中写入无效的位元组合CR0(如PG旗在PE旗设为0时设置为1,或者在NW旗设为1时设置为0) 如果尝试更改.CR4.PCIDE从 0 到 1 时CR3[11:0] 000H如果试图澄清CR0.PG[bit 31]时CR4.PCIDE= 1. 如果试图通过清除离开IA-32e模式CR4.PAE[bit 5]. |
#UD | 如果使用 LOCK 前缀。 如果尝试访问 CR1, CR5, CR6, CR7, 或 CR9CR15 。 |
64 位模式
#GP(0) | 如果当前特权级别不是 0 。 如果尝试在其中写入无效的位元组合CR0(如PG旗在PE旗设为0时设置为1,或者在NW旗设为1时设置为0) 如果尝试更改.CR4.PCIDE从 0 到 1 时CR3[11:0] 000H如果试图澄清CR0.PG[bit 31]。如果试图将 1 写入任何预留的位元。CR4。如果试图将 1 写入任何预留的位元。CR8。如果试图将 1 写入任何预留的位元。CR3[63:MAXPHYADDR如果试图通过清理离开IA-32e模式CR4.PAE[bit 5]. |
#UD | 如果使用 LOCK 前缀。如果尝试访问 CR1, CR5, CR6, CR7, 或 CR9CR15。 如果使用 REX.R 前缀指定一个除 CR8 以外的寄存器 。 |