MOV
移动到/从调试日志中
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
0F 21/r | MOV r32, DR0DR7 | MR | .e. v | alid m | ove 调试寄存器到 r32 。 |
0F 21/r | MOV r64, DR0DR7 | MR | alid n | .e. m | ove 扩展调试寄存器到 r64 。 |
0F 23 /r | MOV DR0DR7, r32 | RM | .e. v | alid m | ove r32 调试注册 。 |
0F 23 /r | MOV DR0DR7, r64 | RM | alid n | .e. m | ove r64 到扩展调试寄存器 。 |
操作数编码
每个模式对应上表 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溢出
说明
将调试寄存器(DR0,DR1,DR2,DR3,DR4,DR5,或DR6,或DR7)的内容移动到通用寄存器或反之. 这些指令的操作数大小在非64位模式中总是32位,无论操作数的大小属性如何. (见Intel(R)64和IA-32架构软件开发者手册第3A卷第20.2节"调试注册",详细描述调试注册中的旗帜和字段. )
指令必须在特权级别0或实地址模式执行.
当寄存器 CR4 中的调试扩展(DE)旗清晰时,这些指令在调试登记册上以与Intel386和Intel486处理器兼容的方式运行. 在这个模式中,引用DR4和DR5分别指DR6和DR7. CR4中的DE旗设定后,试图引用DR4和DR5导致未定义的操作码(#UD)例外. (CR4寄存器被添加到IA-32架构中,从Pentium处理器开始.
在 操作码 级别上, ModR/M 字节中的 reg 字段指定了调试登记册中的哪个是加载或读取的. Mod字段中的两个位被忽略. R/m 字段指定装入或读取的 通用寄存器 。
在64位模式下,指令的默认操作大小为64位. 使用REX.B前缀可以访问额外的登记册(R8R15). REX.W或66H前缀的使用被忽略. 使用REX.R前缀会导致无效opcode例外. 参见本节开头的汇总图,用于编码数据和限制.
行动
IF ((DE = 1) and (SRC or DEST = DR4 or DR5))
THEN
#UD;
ELSE
DEST := SRC;
FI;受影响的旗帜
OF,SF,ZF,AF,PF,和CF旗没有定义.
异常
保护模式
#GP(0) | 如果当前特权级别不是 0 。 |
#UD | 如果 CR4.DE[bit 3] = 1(调试扩展)和 MOV 指令执行涉及 DR4 或 DR5. 如果使用 LOCK 前缀. |
#DB | 如果在 DR7.GD[bit 13] = 1 时访问到任何调试寄存器 。 |
实地址模式
#UD | 如果 CR4.DE[bit 3] = 1(调试扩展)和 MOV 指令执行涉及 DR4 或 DR5. 如果使用 LOCK 前缀. |
#DB | 如果在 DR7.GD[bit 13] = 1 时访问到任何调试寄存器 。 |
虚拟 8086 模式
#GP(0) | 在 虚拟 8086 模式 中调试寄存器无法装入或读取 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#GP(0) | 如果当前特权级别不是 0 。 如果尝试在 DR6 中将 1 到任何位值写为 63: 32 。 如果尝试在 DR7 中将 1 到任何位值写为 63: 32 。 |
#UD | 如果 CR4.DE[bit 3] = 1(调试扩展)和 MOV 指令涉及 DR4 或 DR5 。如果使用 LOCK 前缀。如果使用 REX.R 前缀 。 |
#DB | 如果在 DR7.GD[bit 13] = 1 时访问到任何调试寄存器 。 |