ASM clobber帮助。你需要使用rdtsc破解ax,dx或内存吗?

时间:2013-10-31 06:01:08

标签: gcc assembly x86 inline-assembly rdtsc

我不了解很多ASM。我最近遇到了内联gcc asm,内容如下:

("rdtsc;movl %%eax,%0":"=m"(x)::"ax","dx")

在我看来,好像它将计数器的低32位置于x,一个32位无符号整数。我不明白为什么你会破坏axdx。是同步还是其他原因?我见过很多rdtsc个例子,但从来没有见过axdx

此外,关于rdtsc,如果你破解memory,我会阅读here,然后gcc不会重新排序该指令。这是一个很好的建议吗?您是否有任何建议可以防止rdtsc指令重新排序?

由于

1 个答案:

答案 0 :(得分:1)

我不是内联的asm专家,但是,根据这里写的内容:

  1. 内联程序内部使用的寄存器必须指定为clobber。 RDTSC指令将计数器加载到eax-edx对中,并且这些寄存器必须被破坏,以便gcc不将它们用作高速缓存。我不知道为什么ax和dx被破坏而不是eax和edx,但也许这是由于我缺乏内联asm的经验。

  2. 2。  只有在修改不可预测时才能破坏内存。这里,明确提到了修改地址,因此不需要破坏内存。