導讀:
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