gpt4 book ai didi

c++ - 如何将 RDRAND 指令添加到用 VS 2008 编译的 64 位代码中?

转载 作者:行者123 更新时间:2023-11-30 01:10:22 29 4
gpt4 key购买 nike

我正在 Visual Studio 2008 IDE 中处理一个 C++ 项目,我需要在其中使用英特尔的新 RDRAND操作说明。我进行了快速搜索,MSDN 建议使用 _rdrand64_step immintrin.h 中定义的内部函数,我在 VS 2008 中没有。

在 32 位编译代码中,我可以这样使用 asm 关键字:

    __asm
{
xor eax, eax

;RDRAND instruction = Set random value into EAX.
;Will set overflow [C] flag if success
_emit 0x0F
_emit 0xC7
_emit 0xF0
}

但在 x64 上 asm 不被支持。

你能建议我如何使用 RDRAND 指令为 64 位编译我的项目吗?

最佳答案

您需要将编译器升级到支持 _rdrand64_step 内在函数(自 Visual Studio 2012 起支持),或者使用普通(外部)程序集来创建您自己的函数(因为 Visual C++不支持 x86-64 目标的内联汇编)。

例如:

_TEXT   SEGMENT

PUBLIC rdrand32_step
PUBLIC rdrand32_retry
PUBLIC rdrand64_step
PUBLIC rdrand64_retry

; int rdrand32_step(unsigned *p)
rdrand32_step PROC
xor eax, eax
rdrand edx
; DB 0fh, 0c7h, 0f2h
setc al
mov [rcx], edx
ret
rdrand32_step ENDP

; unsigned rdrand32_retry()
rdrand32_retry PROC
retry:
rdrand eax
; DB 0fh, 0c7h, 0f0h
jnc retry
ret
rdrand32_retry ENDP

; int rdrand64_step(unsigned long long *p)
rdrand64_step PROC
xor eax, eax
rdrand rdx
; DB 048h, 0fh, 0c7h, 0f2h
setc al
mov [rcx], edx
ret
rdrand64_step ENDP

; unsigned long long rdrand64_retry()
rdrand64_retry PROC
retry:
rdrand rax
; DB 048h, 0fh, 0c7h, 0f0h
jnc retry
ret
rdrand64_retry ENDP

_TEXT ENDS

END

如果您使用的是 Visual Studio 2008 中的 MASM 版本,您可能必须注释掉 RDRAND 指令并取消注释后面的 DB 指令。

关于c++ - 如何将 RDRAND 指令添加到用 VS 2008 编译的 64 位代码中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38044484/

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