【发布时间】:2014-06-15 03:45:47
【问题描述】:
我试图了解 OpenSSL 中使用的 x86 汇编函数,以使用 CPU 的 RDRAND 指令获取随机字节。这是函数体:
OPENSSL_ia32_rdrand:
mov $8,%ecx
.Loop_rdrand:
rdrand %rax
jc .Lbreak_rdrand
loop .Loop_rdrand
.Lbreak_rdrand:
cmp $0,%rax
cmove %rcx,%rax
ret
我无法弄清楚 cmp 和 cmove 指令的用途。我不是 x86 汇编程序员,但从我看过的参考资料中可以看出,我对它在做什么的理解是:
10 load retry counter to ecx
20 get random number into rax
30 if successful (carry flag set) goto 50
40 decrement counter and goto 20 if not zero
50 check if rax is zero
60 if it is, move rcx to rax
70 return
因此,如果 rdrand 失败(进位标志清零),rax 只能为 0,并且只有在 1) rdrand 成功(进位集)并且在 rax 中放入非零数或 2 时才能到达 cmp 指令) ecx 中的重试计数器已减为 0。在情况 1 中,cmp 失败并且 cmove 不执行移动。在情况 2 中,rcx 包含 0,cmove 将 0 移动到 0。无论哪种方式,cmove 都是空操作。
我是否误解了一个或多个汇编指令的作用?
【问题讨论】:
-
好问题和好问题。 OpenSSL 项目有一个非常敏锐的家伙会做这些事情,所以看看他的推理会很有趣。