intelbsf指令
导读:
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"
offset指令是什么意思"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下的汇编,可以在这⾥到更多信息:
asm.sourceforge/howto/Assembly-HOWTO.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。