2

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

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

在我看来,这似乎将计数器的低 32 位放入x32 位无符号整数中。我不明白的是你为什么要破坏axdx. 这是为了同步,还是出于其他原因?我见过很多rdtsc例子,但从来没有那种破坏性的axdx.

另外,关于,我在这里rdtsc读到,如果你破坏然后 gcc 不会重新排序指令。这是个好建议吗?您对防止重新排序指令有什么建议吗?memoryrdtsc

谢谢

4

1 回答 1

1

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

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

2. 内存只有在被不可预知的修改时才会被破坏。这里明确地提到了修改地址,这样就不需要破坏内存了。

于 2013-10-31T14:10:15.907 回答