gpt4 book ai didi

assembly - OPENSSL_ia32_rdrand cmp/cmove 指令

转载 作者:行者123 更新时间:2023-12-01 01:01:07 24 4
gpt4 key购买 nike

我试图了解 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 中的 counter 已递减为 0。在情况 1 中,cmp 失败且 cmove 不执行移动。在情况 2 中,rcx 包含 0,cmove 将 0 移动到 0。无论哪种方式,cmove 都是空操作。

我是否误解了一个或多个组装说明的作用?

最佳答案

你有一个小小的误会。

你说对了主要部分,有 8 次尝试使用 RDRAND 检索随机数但是 CMOVE不一定NOP如果 RDRAND返回 0 作为随机数。在这种情况下,此函数将返回 RCX 的值(循环计数)作为“随机数”。简而言之,这个函数只会在没有随机数可用时返回 0 - 否则它将返回来自 RDRAND 的真实随机数。或从 RDRAND 收到 0 的迭代数.

关于assembly - OPENSSL_ia32_rdrand cmp/cmove 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23360694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com