【发布时间】:2014-03-05 10:10:20
【问题描述】:
static __inline__ int atomic_dec_and_test(atomic_t *v)
{
unsigned char c;
__asm__ __volatile__(
LOCK "decl %0; sete %1"
:"=m" (v->counter), "=qm" (c)
:"m" (v->counter) : "memory");
return c != 0;
}
这个实现让我很困惑 原子在这个函数中意味着什么?只有减少的部分? 但是我们如何确保 sete 返回正确的值呢? 我们需要在函数invoke this one中禁用中断吗?似乎原子仅适用于该函数中的一个句子(decl),而不是整个函数?
【问题讨论】:
-
我需要让自己清楚,我知道在 decl 指令中使用 lock 前缀确保原子性,但是这个函数如何确保 sete 在 sete 之前的 decl 之后使用 eflag 寄存器导致的正确值are 可以是中断,并且 eflag 值可以由中断处理程序更改!!!!!!!!!!!!
-
中断不会改变标志,除非故意编码这样做。否则你不能写任何代码。比如,如果你不能依赖
CMP和随附的条件指令之间保留的标志,无论是否是原子的。 -
或者,更准确地说,从中断返回时,标志会被恢复。
-
这是我需要听到的正确答案,谢谢ninjalj
标签: linux assembly kernel i386