- 论坛徽章:
- 0
|
x86上的实现:
187/**
188 * test_and_set_bit - Set a bit and return its old value
189 * @nr: Bit to set
190 * @addr: Address to count from
191 *
192 * This operation is atomic and cannot be reordered.
193 * It also implies a memory barrier.
194 */
195static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
196{
197 int oldbit;
198
199 asm volatile(LOCK_PREFIX "bts %2,%1\n\t"
200 "sbb %0,%0" : "=r" (oldbit), ADDR : "Ir" (nr) : "memory");
201
202 return oldbit;
203}
BTS就是根据位偏移值从位串中取出一位放入CF中,然后将位串中的该位置成1。位基址可以为寄存器或内存寻址;位偏移值可以为寄存器或立即数:
SBB是一条带借位的减法指令,这就是说SBB将第二个操作数(即右操作数)加上标志位CF,然后将结果用第一个操作数来减。
[ 本帖最后由 chenbdchenbd 于 2009-11-27 12:58 编辑 ] |
|