文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>set_bit clear_bit find_first_zero解析

set_bit clear_bit find_first_zero解析

时间:2010-04-29  来源:sanweidaying


今天在阅读linux0.11源码时,看到下面几个宏函数(具体宏定义在我的测试代码中):
set_bit(nr,addr)将addr中第nr位的值置为1 返回addr原第nr为的值,即0或者1
clear_bit(nr,addr)将addr中第nr位的值置为0 返回addr原第nr为的值的反码
find_first_zero(addr)扫描addr值中从低位到高位的第一个出现0的位,并把该位距离起始位的偏移值返回。如对0x01,他将返回1。
测试代码:


#include <stdio.h>
#include <unistd.h>

#define set_bit(nr,addr) ({\
        register int res;\
        __asm__ __volatile__("btsl %2,%3\n\t setb %%al"\
            :"=a"(res) :"0" (0),"r"(nr),"m"(*(addr)));\
        res;})

#define clear_bit(nr,addr) ({\
        register int res;\
        __asm__ __volatile__("btrl %2,%3\n\t setnb %%al"\
            :"=a"(res):"0"(0),"r"(nr),"m"(*(addr)));\
            res;})

#define find_first_zero(addr) ({\
        int __res;\
        __asm__ __volatile__("cld\n"\
            "1:\tlodsl\n\t"\
            "notl %%eax\n\t"\
            "bsfl %%eax,%%edx\n\t"\
            "je 2f\n\t"\
            "addl %%edx,%%ecx\n\t"\
            "jmp 3f\n"\
            "2:\t addl $32,%%ecx\n\t"\
            "cmpl $8192,%%ecx\n\t"\
            "jl 1b\n"\
            "3:"\
            :"=c"(__res):"c"(0),"S"(addr));\
        __res;})
int main()
{
    unsigned long addr = 8192;
    /*test set_bit*/
    printf("**********test set_bit:\n");
    printf("addr %lu(%x)\n",addr,addr);
    printf("%d\n",set_bit(3,&addr));
    printf("addr:%lu(%x)\n",addr,addr);
    /*test clear_bit*/
    printf("***********test clear_bit:\n");
    printf("addr %lu(%x)\n",addr,addr);
    printf("%d\n",clear_bit(4,&addr));
    printf("addr:%lu(%x)\n",addr,addr);
    printf("************test find_first_zero:\n");
    addr = 0xffff;
    printf("addr:%d\n",find_first_zero(&addr));
    return 0;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载