内联汇编程序增量64位计数器



我想以原子方式递增内联程序集中的64位(C++中的长类型)计数器。我知道如何在32位值(int)上做到这一点:

asm volatile("lock; incl %0" : "=m" (val) : "m"(val));

但我不知道如何在长期价值上做到这一点。

将自我回答从问题移动到答案

这很容易,但我还不熟悉x86-64。

asm volatile("lock; incq %0" : "=m" (val) : "m"(val));

应该是:

asm volatile("lock; incq %0" : "+m" (val));

指定单独的操作数而不受强制输入到与输出相同位置的约束,可能会导致以下代码:

val = something;
asm volatile("lock; incq %0" : "=m" (val) : "m"(val));

被错误地优化。您可能还需要一个内存阻塞器,以防止对其他变量的访问被移过asm。

最新更新