RDRAND

读取随机数字

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
NFx 0F C7 /6RDRAND r16M有效有效读取一个16位的随机数字,并存储在目的地登记册中.
NFx 0F C7 /6RDRAND r32M有效有效读取一个32位的随机数字并存储在目的地登记册中.
NFx REX.W + 0F C7 /6RDRAND r64M有效无效读取64位随机数并存储在目的地登记册中.

操作数编码

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

M

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

实测开销

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

涉及的标志位

说明

装入生成随机值的硬件并将其存储在目标寄存器中。 随机值的大小由目的地注册大小和操作模式决定. 进位标志表示在执行指令时是否有随机值. CF=1表示目的地的数据有效. 否则CF=0,目标操作数中的数据将作为指定宽度的零返回. 在这两种情况下,所有其他旗帜都被迫为0。 软件必须检查CF=1的状态,以确定是否返回了有效的随机值,否则预计将循环和重试执行RDRAND(见Intel(R)64和IA-32架构软件开发者手册,第一卷,7.3.17节,"随机数生成者指令").

该课程可在各个特权级别提供。

在64位模式中,指令默认的操作数大小为32位. 使用REX的前缀形式为REX.B,允许访问额外的注册(R8-R15). 使用REX前缀,形式为REX.W,促进运行到64位操作数. 参见本节开头的汇总图,用于编码数据和限制.

行动

IF HW_RND_GEN.ready = 1
    THEN
          CASE of
                operand size is 64: DEST[63:0] := HW_RND_GEN.data;
                operand size is 32: DEST[31:0] := HW_RND_GEN.data;
                operand size is 16: DEST[15:0] := HW_RND_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.

Intel C/C++ 内在编译器

RDRAND int _rdrand16_step( unsigned short * );
RDRAND int _rdrand32_step( unsigned int * );
RDRAND int _rdrand64_step( unsigned __int64 *);

异常

保护模式
#UD如果使用 LOCK 前缀。如果 CPUID.01H: ECX.RDRAND[30] = 0.
实地址模式
与保护模式中的例外相同.
虚拟 8086 模式
与保护模式中的例外相同.
兼容模式
与保护模式中的例外相同.
64 位模式
与保护模式中的例外相同.

来源