我有这个功能(RDRand - 由David Heffernan编写)在 32 位中可以正常工作,但在 64 位中失败:
function TryRdRand(out Value: Cardinal): Boolean;
{$IF defined(CPU64BITS)}
asm .noframe
{$else}
asm
{$ifend}
db $0f
db $c7
db $f1
jc @success
xor eax,eax
ret
@success:
mov [eax],ecx
mov eax,1
end;
尤其是这样写:
本质上,开发人员使用单个操作数调用此指令:将存储随机值的目标寄存器。请注意,此寄存器必须是通用寄存器,寄存器的大小(16、32 或 64 位)将决定返回的随机值的大小。
调用 RDRAND 指令后,调用者必须检查进位标志 (CF) 以确定在执行 RDRAND 指令时是否有可用的随机值。如表 3 所示,值 1 表示随机值可用并放置在调用中提供的目标寄存器中。值 0 表示随机值不可用。在当前架构中,目标寄存器也将作为这种情况的副作用归零。
我对 ASM 的了解很少,我错过了什么?
我也不太明白这个指令:
...
xor eax,eax
ret
...
它到底是做什么的?