我是靠谱客的博主 怕孤独春天,最近开发中收集的这篇文章主要介绍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的值取反

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

最后

以上就是怕孤独春天为你收集整理的AT&T中的bt汇编指令的全部内容,希望文章能够帮你解决AT&T中的bt汇编指令所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部