Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 英特尔赛扬64位汇编程序上的RDTSC_Linux_Assembly_Fasm_Rdtsc - Fatal编程技术网

Linux 英特尔赛扬64位汇编程序上的RDTSC

Linux 英特尔赛扬64位汇编程序上的RDTSC,linux,assembly,fasm,rdtsc,Linux,Assembly,Fasm,Rdtsc,我写了一个小的随机数字程序,利用RDTSC给我随机性。我用FASM在LinuxMint17上写的 问题是,它在AMD FX 64位PC上运行得很好,但在Windows 8和Linux Mint下的Intel Celeron上网本(64位)上,确切的代码失败(或挂起)(我采用双引导,因此我将代码改编为Win 8) 这里有什么问题?这基本上就是代码 again: rdtsc and eax,1111b cmp eax,10 jae again ;things to do with the rando

我写了一个小的随机数字程序,利用RDTSC给我随机性。我用FASM在LinuxMint17上写的

问题是,它在AMD FX 64位PC上运行得很好,但在Windows 8和Linux Mint下的Intel Celeron上网本(64位)上,确切的代码失败(或挂起)(我采用双引导,因此我将代码改编为Win 8)

这里有什么问题?这基本上就是代码

again:
rdtsc
and eax,1111b
cmp eax,10
jae again
;things to do with the random digit

我调试了它,发现罪犯隐藏在这部分代码中。但我也看不出有什么问题。它在我的AMD PC上工作得非常好。在英特尔CPU上默认禁用RDTSC吗?

您实际上是在读取时钟周期数(每秒数十亿次),然后不退出循环,除非最后4位小于10。这可能是因为发生这种情况需要很长时间


如果指令被禁用,您的程序将被操作系统以“非法指令”错误终止。

Err。。。我强烈建议不要使用
rdtsc
进行随机性分析。它存在的一个问题是,如果在循环中调用,该函数将给出某个步长值的连续倍数加上偏移量(即,如果每次循环迭代需要4个总线周期,则可能得到1,5,9,13,1,5,9,13…)。仅获取奇数或偶数值,或仅交替获取奇数/偶数值,这完全不是随机的。谢谢您的回答。但我不认为一个位数会有问题。EAX/RAX中的返回对于一个随机的单个数字来说已经足够好了。反正只是一个简单的程序:DYou会感到惊讶。如果你想要一些简单但实用的东西,我觉得对你来说最好的是一个。一个简单的例子:
x_new=1103515245*x_old+12345可能发生的情况,例如,如果循环需要16个总线周期的倍数,并且第一次看到的值是
10,我的AMD机器就没有这个问题。对于单个数字(例如,从0到9),它是随机的。但我的Celeron上网本可能是对的,尽管我对此表示怀疑,因为两个CPU都是64位的,这实际上都与时间有关。无法保证像上面提到的人那样,退出条件会发生。您可以尝试使用rdtscp指令,但这不太可能是Intel的问题,我很肯定他们会注意到的now@royalfinest:RDTSC不再测量CPU周期,并且只测量一些正常化时钟上的周期,这些周期不受电源管理、turbo boost等因素的影响。随着这种变化,CPU使用了较慢的正常化时钟(例如,可能是CPU时钟速度的1/16),并等效于
TSC+=16无论你做什么,你的循环永远不会退出。一个简单的修复方法是使用类似于
eax=eax^(eax>>16)的东西
之前执行code>。