Chinaunix首页 | 论坛 | 博客
  • 博客访问: 340621
  • 博文数量: 88
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 885
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 14:50
文章分类

全部博文(88)

文章存档

2010年(88)

我的朋友

分类: LINUX

2010-07-20 20:14:46

导读: 
bsfl汇编指令:     
  intel汇编指令:bsf   oprd1,oprd2;     
  顺向位扫描(bit   scan   forward)     
  从右向左(从位0-->位15或位31)扫描字或双字操作数oprd2中第一个含"1"的位,并把扫描到的第一个含'1'的位的位号送操作数oprd1     
  AT&T格式汇编指令bsfl类似bsf,只是源操作数和目的操作数顺序相反。   
    
  比如网上有一个类似语句的分析:   
  .__asm__("bsfl   %1,%0\n\t"     
  "jne   1f\n\t"     
  "movl   $32,   %0\n"     
  "1:"     
  :   "=r"(set)     
  :"r"(~   (*p   >>   bit)));     
    
  进入汇编指令前的初始条件:     
  p:指向offset所指向的起始位所处的那个unsigned   long型4B双字的开始处。     
  bit:   offset所指向的起始位位于所处在的那个unsigned   long型4B双字中的第几位。     
    
  *p   >>   bit   :   将指向offset所指向的起始位所处的那个unsigned   long型4B双字的开始处的指针右移bit位,即:将offset所指向的起始位前面的位全部移出去,而将offset所指向的起始位右移到了最右端(最低位,0位),该起始位成了该unsigned   long型4B的首位了。     
  ~   (*p   >>   bit)   :将各位取反,本来是要找从offset位开始的后面的第一个'0'位,这一取反就将问题转化为找从offset位开始的后面的第一个'1'所在的位。     
    
  bsfl   %1,%0   <====>   bsfl   (~   (*p   >>   bit)),set     
  找(~   (*p   >>   bit))中的第一个'1'所在的位,将结果存放在set中返回。     
    
  movl   $32,   %0   :     
  当从offset位开始的后面的32个位为全'0',即:取反前为全'1',这时置set   =   32  
阅读(1267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~