XSETBV
设置扩展 控制寄存器
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
NP 0F 01 D1 | XSETBV | ZO | 有效 | 有效 | 以 EDX 写入值: EAX 到 XCR 指定的 ECX 。 |
实测开销
正在从 arch-data 加载实测数据...
说明
将登记EDX:EAX的内容写入控制寄存器(XCR)中指定的64位扩展的控制寄存器(ECX). (关于支持Intel 64架构的处理器,RCX的高阶32位被忽略. ) EDX寄存器的内容被复制到选定的XCR的高阶32位,EAX寄存器的内容被复制到XCR的低阶32位. (关于支持Intel 64架构的处理器,RAX和RDX的每个高序32比特被忽略. ) XCR中未定义或保留的比特应设定为先前读取的值.
此指令必须在特权级别0或实地址模式执行;否则,生成一般保护例外#GP(0). 在 ECX 中指定一个保留或未执行的 XCR 也会引起一般的保护例外. 如果软件试图在 XCR 中写入保留位元,处理器也会生成一般保护例外.
目前,仅支持XCR0. 因此,ECX的所有其他值都是保留下来的,并将产生#GP(0). 注意, XCR0 的比特 0 (对应 x87 状态) 必须设置为 1; 如果试图清除此比特, 指令将会导致 #GP(0) 。 此外,如果尝试在清除XCR01的同时设置XCR02;需要设置两个比特来使用AVX指令,则该指令会产生#GP(0); 第13.3节,"赋予XSAVE特性集和XSAVE-Enabled Features",Intel(R)64和IA-32 架构软件开发者手册,第一卷.
行动
XCR[ECX] := EDX:EAX;受影响的旗帜
None.
Intel C/C++ 内在编译器
XSETBV void _xsetbv( unsigned int, unsigned __int64);异常
保护模式
#GP(0) | 如果当前特权级别不是 0 。 如果在 ECX 中指定了无效的 XCR 。 如果 EDX 中的值: EAX 设置在 ECX 指定的 XCR 中保留的位数。 如果试图清除 XCR0 中的位数 0 。 如果试图设置 XCR0 [2:1] 到 10b 。 |
#UD | 若CPUID.01H:ECX.XSAVE[26]=0. 若CR4.OSXSAVE[bit 18]=0. 若使用LOCK前缀. |
实地址模式
#GP | 如果无效XCR指定在ECX如果值为EDX:EAX设置在XCR由ECX中。如果试图清除XCR0。如果试图设置XCR0[2:1] 到 10 b. |
#UD | 若CPUID.01H:ECX.XSAVE[26]=0. 若CR4.OSXSAVE[bit 18]=0. 若使用LOCK前缀. |
虚拟 8086 模式
#GP(0) | XSETBV指令在虚拟 8086 模式中不被识别. |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
| 与保护模式中的例外相同. |