MOV

移动到/从调试日志中

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
0F 21/rMOV r32, DR0DR7MR.e. valid move 调试寄存器到 r32 。
0F 21/rMOV r64, DR0DR7MRalid n.e. move 扩展调试寄存器到 r64 。
0F 23 /rMOV DR0DR7, r32RM.e. valid move r32 调试注册 。
0F 23 /rMOV DR0DR7, r64RMalid n.e. move r64 到扩展调试寄存器 。

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

MR

  1. modrm.rm escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  2. modrm.reg lecturaModRM 字节的 reg 字段(第 5-3 位)

RM

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

涉及的标志位

说明

将调试寄存器(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 时访问到任何调试寄存器 。

来源