Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369443
  • 博文数量: 102
  • 博客积分: 2070
  • 博客等级: 大尉
  • 技术积分: 1019
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 11:07
文章存档

2011年(1)

2010年(34)

2009年(37)

2008年(30)

我的朋友

分类: C/C++

2010-04-29 11:57:17


今天在阅读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;
}


阅读(4096) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

guotong19882015-01-12 11:12:35

好帖,顶!!!!!!!!!!