我对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如您所见,如果CF0(请记住,CFBTR指令设置,这取决于指定的位是否在bitmap中设置),则oldbit将设置为0,因为该操作将有效:
oldbit = oldbit - oldbit - 0
否则oldbit将被设置为-1(因为CF=1),这将设置所有位,并指示原始位也已设置。

关于c - 需要帮助了解位重置功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30366659/

10-11 19:00