看内核的发现这个指令挺好玩的,可以做些事情,比如嵌入式领域中可用它来进行位操作,判断相应的位是0还是1
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#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中内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复