我是靠谱客的博主 愤怒白猫,最近开发中收集的这篇文章主要介绍bsfl汇编指令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

导读:
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    
   
   
  关于linux下的汇编,可以在这里找到更多信息:  
  http://asm.sourceforge.net/howto/Assembly-HOWTO.html   
 

本文转自
http://topic.csdn.net/t/20061220/20/5244999.html

最后

以上就是愤怒白猫为你收集整理的bsfl汇编指令的全部内容,希望文章能够帮你解决bsfl汇编指令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部