[英]Generate a random 32-bit number to store in a 64-bit register
我想生成一个随机的 32 位数字。 我正在为此使用rdrand
。 但是,我遇到了一些问题。 由于数字不能超过 32 位,我正在执行rdrand eax
。 这是出现问题的地方:
我需要能够在 64 位寄存器中引用这个 32 位数字,因为我的代码库的其余部分使用 64 位寄存器。 我想我可以用自己的xor
来清除rax
,然后只用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
2147483647
或等效的0x7FFFFFFF
是最大的有符号32 位数字。 rdrand eax
可以把任何价值从0x00000000
到0xFFFFFFFF
在eax
。 对于如何处理此问题,您有几种选择:
4294967295
或等效的0xFFFFFFFF
(最大的 32 位无符号数)进行比较。cmp eax, 2147483647
而不是cmp rax, 2147483647
。 由于jle
对比较有符号整数的结果进行操作,这将导致您现在看到的2147483648
到4294967295
被解释为-2147483648
到-1
。rax
的高 32 位始终为零,而是让它们与eax
的符号位匹配(这称为符号扩展)。 您可以通过在movsx rax, eax
之后rdrand eax
执行movsx rax, eax
来完成此操作。 这将导致rax
保持一个介于-2147483648
和2147483647
之间的值,而不是介于0
和4294967295
之间。 如您所料,任何这些更改都会导致您的条件跳转始终被执行。 如果您希望rax
最终介于0
和4294967295
之间,则选择选项 1 或 2。如果您希望rax
最终介于-2147483648
和2147483647
,则选择选项 3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.