我想生成一个随机的 32 位数字。我正在使用rdrand
这个。但是,我遇到了一些问题。由于这个数字不能超过 32 位,所以我正在做rdrand eax
. 这是问题出现的地方:
我需要能够在 64 位寄存器中引用这个 32 位数字,因为我的代码库的其余部分使用 64 位寄存器。我想我可以
rax
用 axor
自己清除,然后只用rdrand eax
. 然后我可以看一下rax
,一半最多是32位数字,另一半被清除。当我
rax
与最大 32 位数字大小2147483647进行比较时,我得到的结果非常不一致。有一半的时候,退出码是 1,这意味着实际上里面的数字rax
小于 32 位。但另一半时间我得到 0。几乎就像结果eax
并不总是小于或等于2147483647 ,考虑到本文档所说的内容,这是出乎意料的。
有谁知道我的思维过程出了什么问题?我很想知道。(注意:我在 macOS 上使用 Clang 进行组装。)
.global _main
.text
# how to generate a 32-bit random number that is in rax?
_main:
xor rax, rax # clear the top half of the eax-rax register pair
rdrand eax # a 32-bit number in rax
cmp rax, 2147483647
jle smaller_than_32 # rax <= MAX_32_BIT
xor rdi, rdi
jmp end
smaller_than_32:
mov rdi, 1
end:
mov rax, 0x2000001
syscall