[英]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.