gpt4 book ai didi

c - 需要帮助了解位重置功能

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:33 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com