我对C还不熟悉,在这里很难理解汇编级的操作。有人能帮忙吗?
/**
* Input: bitmap - u32bits*
* bitpos - position of the bit to be reset (range 0-31)
* return: old value of the bit (0 if unset, 1 if set)
**/
static inline u32bits resetbit(u32bits *bitmap, u32bits bitpos)
{
u32bits oldbit;
__asm__ __volatile__ (
"btr %2, (%1)\n" /* bit test and reset */
"sbbl %0, %0\n" /* return the previous value*/
: "=r"(oldbit) /* "0" output parameter */
: /* input parameters */
"0"(bitmap), /* "1" */
"r"(bitpos) /* "2" */
: "%cc", "memory" /* clobbered registers */
);
return oldbit;
}
最佳答案
BTR
指令将所选位存储在EFLAGS.CF
中,并清除源操作数(bitmap
)中的该位。
接下来,执行SBB
,并将oldbit
指定为源和目标。SBB
将从目标操作数中减去源和CF
标志的值。基本上,在这里,我们要做的是:oldbit = oldbit - oldbit - CF
如您所见,如果CF
是0
(请记住,CF
由BTR
指令设置,这取决于指定的位是否在bitmap
中设置),则oldbit
将设置为0
,因为该操作将有效:oldbit = oldbit - oldbit - 0
。
否则oldbit
将被设置为-1
(因为CF
=1),这将设置所有位,并指示原始位也已设置。
关于c - 需要帮助了解位重置功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30366659/