AT&T中的bt汇编指令

    看内核的发现这个指令挺好玩的,可以做些事情,比如嵌入式领域中可用它来进行位操作,判断相应的位是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的值取反

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值