RDSEED
读取随机 SEED
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
NFx 0F C7 /7 | RDSEED r16 | M | 有效 | 有效 | 读取一个16位的 NIST SP800-90B & C 兼容随机值,并存储在目的地登记册中. |
NFx 0F C7 /7 | RDSEED r32 | M | 有效 | 有效 | 读取一个32位的NIST SP800-90B & C符合的随机值,并存储在目的地登记册中. |
NFx REX.W + 0F C7 /7 | RDSEED r64 | M | 有效 | 无效 | 读取一个64位的NIST SP800-90B & C符合的随机值,并存储在目的地登记册中. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmescrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
装入生成随机值的硬件并将其存储在目标寄存器中。 随机值由NRBG(非定型随机位生成器)生成,它与NIST,SP800-90B和NIST,SP800-90C在XOR构建模式中兼容. 随机值的大小由目的地注册大小和操作模式决定. 进位标志表示在执行指令时是否有随机值. CF=1表示目的地的数据有效. 否则CF=0,目标操作数中的数据将作为指定宽度的零返回. 在这两种情况下,所有其他旗帜都被迫为0。 软件必须检查CF=1的状态,以确定是否返回了有效的随机种子值,否则预计将循环和重试RDSEED的执行(见第1.2节).
RDSEED 指令在所有特权级别都有。 RDSEED 指令通常在一个交易区域内外执行。
在64位模式中,指令默认的操作数大小为32位. 使用REX的前缀形式为REX.B,允许访问额外的注册(R8-R15). 使用REX前缀,形式为REX.W,促进运行到64位操作数. 参见本节开头的汇总图,用于编码数据和限制.
行动
IF HW_NRND_GEN.ready = 1
THEN
CASE of
operand size is 64: DEST[63:0] := HW_NRND_GEN.data;
operand size is 32: DEST[31:0] := HW_NRND_GEN.data;
operand size is 16: DEST[15:0] := HW_NRND_GEN.data;
ESAC;
CF := 1;
ELSE
CASE of
operand size is 64: DEST[63:0] := 0;
operand size is 32: DEST[31:0] := 0;
operand size is 16: DEST[15:0] := 0;
ESAC;
CF := 0;
FI;
OF, SF, ZF, AF, PF := 0;受影响的旗帜
CF旗根据结果设置(见上文"行动"部分). OF,SF,ZF,AF,和PF的旗帜被设定为0.
C/C++ 编译器等效
RDSEED 英寸 rdseed16 step( 未签名的简称) ; RDSEED 英寸 rdseed32 step(未签名英寸) ; RDSEED int rdseed64 step(未署名 int64*);
异常
保护模式
#UD | 如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.RDSEED[18] = 0. |
实地址模式
#UD | 如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.RDSEED[18] = 0. |
虚拟 8086 模式
#UD | 如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.RDSEED[18] = 0. |
兼容模式
#UD | 如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.RDSEED[18] = 0. |
64 位模式
#UD | 如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.RDSEED[18] = 0. |