我是靠谱客的博主 干净向日葵,最近开发中收集的这篇文章主要介绍BTS, BTR 指令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

BTS -- Bit Test and Set (位测试并置位)
BTS 指令先将指定位的值存储到 CF 标志中然后设置该位。
指令语法格式及举例:

InstructionExample
vbtsw r16,r/m16btsw %bx,%cx
btsw %bx,(%ebx,1)
btsw %bx,(%ebx,2)
btsw %bx,(%ebx,%ebp,1)
btsl r32,r/m32btsl %ebx,%ecx
btsl %ebx,(%ebx,2)
btsl %ebx,(%ebx,4)
btsl %ebx,(%ebx,%ebp,1)
btsw imm8,r/m16btsw $0x7f,%cx
btsw $0x7f,(%ebx,1)
btsw $0x7f,(%ebx,2)
btsw $0x7f,(%ebx,%ebp,1)
btsl imm8,r/m32btsl $0x7f,%ecx
btsl $0x7f,(%ebx,2)
btsl $0x7f,(%ebx,4)
btsl $0x7f,(%ebx,%ebp,1)


说明:
Intel 指令格式和 AT&A 指令格式顺序相反。这里按照 linux 里所用的 AT&T 指令格式说明。其实这个指令解释起来拗口,但用起来却简单。举一个简单的例子说明,看下面的代码示例:
复制代码
mov $0x80, %al 
btsl $7, %eax
第 1 条语句简单不用说;看第 2 条 bts 指令,这里对寄存器 eax 的第 7 位进行测试并置位。因为,要测试的第 7 位由于第 1 条 mov 指令已经变为 1,所以在执行 bts 指令后,这个 1 会被存在 CF 中,然后对该位置 1 ,置位后 eax 自然是 0x80 。
再看一个特殊点的:
复制代码
mov $0, %eax 
btsl  0x7f, %eax
eax 总共才有 32 位,那要设置第 127(0x7f)位那怎么办?当然是环绕了。127%32 = 31 ,所以我们要对 eax 的第 31 位进行置位了,eax 置位后的结果是 0x80000000 。
bts 不仅可以操作寄存器中的位,也可以操作内存中的位,比如:
引用 
.section .data
values:
   .int 10, 15, 0, 25, 30, 35, 40, 45, 50, 55, 60
...
     movl $values, %eax
     movl $2, %ebp
     btsl $7, (%eax, %ebp, 4)
...
如此之后,以 values 地址开始的第 3 个整数原来是 0,但在执行 bts 指令后变为 0x80 。另外需要注意一点,如果上面 bts 指令中指定的位值大于31,也就是超出一个 int 类型的长度,那么超出的部分不会像寄存器中的发生环绕,而是延伸到下一个内存位置。
对于 BTR 指令同样道理。BTR 指令是测试并清零指定位。

原:http://www.groad.net/bbs/read.php?tid=3294&ordertype=desc&skinco=wind8purple

Linux内核中的例子:

#define set_bit(nr,addr) ({
这个例子位于fs下的bitmap.c代码中

register int res __asm__("ax");
__asm__ __volatile__("btsl %2,%3ntsetb %%al":
"=a" (res):"0" (0),"r" (nr),"m" (*(addr)));
res;})

该段代码的作用是把指定地址开始的第nr个为偏移处的比特位置位(nr可大于32),返回原比特位。

#define clear_bit(nr,addr) ({
register int res __asm__("ax");
__asm__ __volatile__("btrl %2,%3ntsetnb %%al":
"=a" (res):"0" (0),"r" (nr),"m" (*(addr)));
res;})
该段代码的作用是复位指定地址开始的第nr位偏移处的比特位。返回原比特位的反码。

注:setb用于根据进位标志CF设置操作数(%al)。如果CF=1则%al=1,否则%al=0。

       setnb也是用于根据进位标志CF设置操作数(%al)。如果CF=1则%al=0,否则%al=1。

最后

以上就是干净向日葵为你收集整理的BTS, BTR 指令的全部内容,希望文章能够帮你解决BTS, BTR 指令所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部