我不了解很多ASM。我最近遇到了内联gcc asm,内容如下:
("rdtsc;movl %%eax,%0":"=m"(x)::"ax","dx")
在我看来,好像它将计数器的低32位置于x
,一个32位无符号整数。我不明白为什么你会破坏ax
和dx
。是同步还是其他原因?我见过很多rdtsc
个例子,但从来没有见过ax
和dx
。
此外,关于rdtsc
,如果你破解memory
,我会阅读here,然后gcc不会重新排序该指令。这是一个很好的建议吗?您是否有任何建议可以防止rdtsc
指令重新排序?
由于
答案 0 :(得分:1)
我不是内联的asm专家,但是,根据这里写的内容:
内联程序内部使用的寄存器必须指定为clobber。 RDTSC指令将计数器加载到eax-edx对中,并且这些寄存器必须被破坏,以便gcc不将它们用作高速缓存。我不知道为什么ax和dx被破坏而不是eax和edx,但也许这是由于我缺乏内联asm的经验。
2。 只有在修改不可预测时才能破坏内存。这里,明确提到了修改地址,因此不需要破坏内存。