簡體   English   中英

生成一個隨機的 32 位數字以存儲在 64 位寄存器中

[英]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可以把任何價值從0x000000000xFFFFFFFFeax 對於如何處理此問題,您有幾種選擇:

  1. 將其與4294967295或等效的0xFFFFFFFF (最大的 32 位無符號數)進行比較。
  2. 執行cmp eax, 2147483647而不是cmp rax, 2147483647 由於jle對比較有符號整數的結果進行操作,這將導致您現在看到的21474836484294967295被解釋為-2147483648-1
  3. 不要讓rax的高 32 位始終為零,而是讓它們與eax的符號位匹配(這稱為符號擴展)。 您可以通過在movsx rax, eax之后rdrand eax執行movsx rax, eax來完成此操作。 這將導致rax保持一個介於-21474836482147483647之間的值,而不是介於04294967295之間。

如您所料,任何這些更改都會導致您的條件跳轉始終被執行。 如果您希望rax最終介於04294967295之間,則選擇選項 1 或 2。如果您希望rax最終介於-21474836482147483647 ,則選擇選項 3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM