Assembly 利用时钟中断生成随机数

Assembly 利用时钟中断生成随机数,assembly,interrupt,Assembly,Interrupt,我需要生成5个随机数,为此我使用了时钟中断:mov-ah,2ch-int-21h。我计算了毫秒数,这应该是随机数。但我得到了同样的数字5次。如果您有其他使用中断解决问题的方法,请提供帮助。如果您需要一个小(伪)随机数,请使用: rdtsc % N 如果你的处理器有rdrand(参见对另一个答案的评论),它看起来是个好主意。我认为它是最近为英特尔CPU添加的,所以我认为它们不会,而且我也不认为它的速度很快 如果没有,并且您希望在汇编代码中使用快速、高质量(psuedo)随机数,那么XORShif

我需要生成5个随机数,为此我使用了时钟中断:mov-ah,2ch-int-21h。我计算了毫秒数,这应该是随机数。但我得到了同样的数字5次。如果您有其他使用中断解决问题的方法,请提供帮助。

如果您需要一个小(伪)随机数,请使用:

rdtsc % N
如果你的处理器有rdrand(参见对另一个答案的评论),它看起来是个好主意。我认为它是最近为英特尔CPU添加的,所以我认为它们不会,而且我也不认为它的速度很快

如果没有,并且您希望在汇编代码中使用快速、高质量(psuedo)随机数,那么XORShift随机数生成器看起来相当不错。短代码,长周期,优秀的统计。以下是我在(32位)工作窃取SMP处理器调度程序中使用的内容,用于决定从哪个处理器窃取:

DATA_ALIGN_TO_CACHE_LINE
   public XORRNGvalue32
XORRNGvalue32 dword  2463534242           ; see COMPUTE_RANDOM32 macro
; XORShift random number generator; see http://en.wikipedia.org/wiki/Xorshift
; or Marsaglia, George (July 2003). "Xorshift RNGs". Journal of Statistical Software Vol. 8 (Issue  14).

 COMPUTE_RANDOM32 macro ; uses EAX and EDX
; Marsaglia suggested 32 bit RNG:
;  unsigned long xor()
;    { static unsigned long y=2463534242; "32 bit seed value y"
;      y =(y<<13); y^=(y>>17); return (y =(y<<5)); }
      mov     eax,  XORRNGvalue32
      mov     edx, eax
      shl     eax, 13
      xor     eax, edx
      mov     edx, eax
      shr     eax, 17
      xor     eax, edx
      mov     edx, eax
      shl     eax, 5
      xor     eax, edx
      mov     XORRNGvalue32, eax ; has nice random number in EAX here
  endm
数据与缓存线对齐
公共XORRNGvalue32
XORRNGvalue32 dword 246353442;请参阅COMPUTE_RANDOM32宏
; 异或移位随机数发生器;看见http://en.wikipedia.org/wiki/Xorshift
; 或Marsaglia,George(2003年7月)。“Xorshift RNGs”。《统计软件杂志》第8卷(第14期)。
计算32个宏;使用EAX和EDX
; Marsaglia建议32位RNG:
;  无符号长xor()
;    {静态无符号长y=2463534242;“32位种子值y”

;y=(y17);return(y=(yUse
rdtsc
指令。
DL
包含百分之一秒,而不是毫秒。另外:“注意:在大多数系统上,系统时钟的分辨率约为5/100秒”()使用设计为尽可能可重复且更新速度较低的数据源来生成随机数显然是个坏主意。如果需要随机数,请使用
rdrand
…请参阅-不要落入调用时间戳“随机”的陷阱.即使是TSC这样的高分辨率时间戳,也不能通过随机性的基本测试,即,(非-)可预测性值得一提的是,计算机上生成的任何随机数充其量都是伪随机的,因为它必须从非随机的东西中播种。这正是英特尔利用
rdrand
所做的-它是一个真正的硬件熵源之上的CSPRNG。上面的文章引用了有关实际硬件si的详细信息反实现。Wrt。以
rdrand
的速度为例,检查一下,-如果存在,它很快。文章建议每秒1亿个随机数-->每10纳秒1个。64位版本的Marsaglia例程本质上是相同的指令序列,使用不同的常量将其扩展到64位。假设我们都是按顺序执行的,而且每个都需要几个时钟,Marsaglia的例程应该需要20-30个时钟。在3 Ghz的机器上,也就是说…10纳秒!Marasaglia的生成器也被认为具有极好的“随机性”属性……如果我必须在供应商指定的指令和通用例程(速度和质量都相同)之间进行选择,我会选择该例程。不过,英特尔指令的真正随机性可能对加密协议有好处。