RDSEED

读取随机 SEED

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
NFx 0F C7 /7RDSEED r16M有效有效读取一个16位的 NIST SP800-90B & C 兼容随机值,并存储在目的地登记册中.
NFx 0F C7 /7RDSEED r32M有效有效读取一个32位的NIST SP800-90B & C符合的随机值,并存储在目的地登记册中.
NFx REX.W + 0F C7 /7RDSEED r64M有效无效读取一个64位的NIST SP800-90B & C符合的随机值,并存储在目的地登记册中.

操作数编码

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

M

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

实测开销

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

涉及的标志位

说明

装入生成随机值的硬件并将其存储在目标寄存器中。 随机值由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.

来源