AT&T中的bt汇编指令

时间:2022-07-02 03:30:14

    看内核的发现这个指令挺好玩的,可以做些事情,比如嵌入式领域中可用它来进行位操作,判断相应的位是0还是1

#include <stdio.h>
#define bitop(name,op) \ //类似于函数生成器的感觉, 可能就是此法的意义
static inline int name(char * addr,unsigned int nr) \
{ \
int __res; \
__asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \ //adcl $0, %0: _res= _res + 0 + CF(进位标志)
:"=g" (__res) \ //g:使用通用有效地址(寄存器或是内存呢变量)
:"r" (nr),"m" (*(addr)),"0" (0)); \ //r: 使用任意动态分配的寄存器, m:使用内存地址
return __res; \
}
//bitop即生成了 bit, setbit, clrbit, inversionBit 函数
bitop(bit,"")
bitop(setbit,"s")
bitop(clrbit,"r")
bitop(inversionBit, "c")

int main()
{
char a=0xff;
char b=0xfe;
char res1;
char res2;
res1 = bit(&a, 0);
res2 = bit(&b, 0);
printf("res1 =[%d], a=[%x], res2=[%d], b=[%x]\n", res1, a, res2, b);

a = 0xff;
b = 0xfe;
res1 = setbit(&a, 0);
res2 = setbit(&b, 0);
printf("res1 =[%d], a=[%x], res2=[%d], b=[%x]\n", res1, a, res2, b);

a = 0xff;
b = 0xfe;
res1 = clrbit(&a, 0);
res2 = clrbit(&b, 0);
printf("res1 =[%d], a=[%x], res2=[%d], b=[%x]\n", res1, a, res2, b);

a = 0xff;
b = 0xfe;
res1 = inversionBit(&a, 0);
res2 = inversionBit(&b, 0);
printf("res1 =[%d], a=[%x], res2=[%d], b=[%x]\n", res1, a, res2, b);
return 0;
}

输出结果:

res1 =[1], a=[ffffffff], res2=[0], b=[fffffffe]
res1 =[1], a=[ffffffff], res2=[0], b=[ffffffff]
res1 =[1], a=[fffffffe], res2=[0], b=[fffffffe]
res1 =[1], a=[fffffffe], res2=[0], b=[ffffffff]
说明:

bit, bits, bitr, bitc 四个指令, 其中nr的值为0(随意,这里举个例子), a为一个char型,CF为进位标志

bit  nr   &a    //将a的第0个bit位的值送进CF中

bits nr  &a   //将a的第0个bit位的值送进CF中, 然后将a的第0个bit的值置1

bitr nt   &a   //将a的第0个bit位的值送进CF中, 然后将a的第0个bit的值置0

bitc nt  &a   //将a的第0个bit位的值送进CF中, 然后将a的第0个bit的值取反

上面的测试程序很清晰的说明了此指令的用法