BT,BTC,BTR,BTS 指令
2013-12-29 05:04
459 查看
源地址:http://www.groad.net/bbs/thread-3294-1-1.html
BTS, BTR 指令说明
BTS -- Bit Test and Set (位测试并置位)
BTS 指令先将指定位的值存储到 CF 标志中然后设置该位。
指令语法格式及举例:
说明:
Intel 指令格式和 AT&A 指令格式顺序相反。这里按照 linux 里所用的 AT&T 指令格式说明。其实这个指令解释起来拗口,但用起来却简单。举一个简单的例子说明,看下面的代码示例:
第 1 条语句简单不用说;看第 2 条 bts 指令,这里对寄存器 eax 的第 7 位进行测试并置位。因为,要测试的第 7 位由于第 1 条 mov 指令已经变为 1,所以在执行 bts 指令后,这个 1 会被存在 CF 中,然后对该位置 1 ,置位后 eax 自然是 0x80 。
再看一个特殊点的:
eax 总共才有 32 位,那要设置第 127(0x7f)位那怎么办?当然是环绕了。127%32 = 31 ,所以我们要对 eax 的第 31 位进行置位了,eax 置位后的结果是 0x80000000 。
bts 不仅可以操作寄存器中的位,也可以操作内存中的位,比如:
如此之后,以 values 地址开始的第 3 个整数原来是 0,但在执行 bts 指令后变为 0x80 。另外需要注意一点,如果上面 bts 指令中指定的位值大于31,也就是超出一个 int 类型的长度,那么超出的部分不会像寄存器中的发生环绕,而是延伸到下一个内存位置。
对于 BTR 指令同样道理。BTR 指令是测试并清零指定位。
以上内容来自http://www.groad.net/bbs/thread-3294-1-1.html
补充以下:
经测试,若目的操作数是寄存器,则总是环绕;
若源操作数是立即数,则总是环绕(不排除汇编器会干扰实际行为,但经测试机器码中的立即数高位是被忽略的);
其他不环绕(即,若位位置值很大,则会触及偏离目的操作数的内存区域)。
BTS, BTR 指令说明
BTS -- Bit Test and Set (位测试并置位)
BTS 指令先将指定位的值存储到 CF 标志中然后设置该位。
指令语法格式及举例:
Instruction | Example |
vbtsw r16,r/m16 | btsw %bx,%cx btsw %bx,(%ebx,1) btsw %bx,(%ebx,2) btsw %bx,(%ebx,%ebp,1) |
btsl r32,r/m32 | btsl %ebx,%ecx btsl %ebx,(%ebx,2) btsl %ebx,(%ebx,4) btsl %ebx,(%ebx,%ebp,1) |
btsw imm8,r/m16 | btsw $0x7f,%cx btsw $0x7f,(%ebx,1) btsw $0x7f,(%ebx,2) btsw $0x7f,(%ebx,%ebp,1) |
btsl imm8,r/m32 | btsl $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/thread-3294-1-1.html
补充以下:
经测试,若目的操作数是寄存器,则总是环绕;
若源操作数是立即数,则总是环绕(不排除汇编器会干扰实际行为,但经测试机器码中的立即数高位是被忽略的);
其他不环绕(即,若位位置值很大,则会触及偏离目的操作数的内存区域)。
相关文章推荐
- 学 Win32 汇编[23] - 位测试与位扫描指令: BT、BTC、BTR、BTS、BSF、BSR
- BT、BTS、BTR、BTC: 位测试指令
- Win32 汇编 [23] - 位测试指令: BT、BTC、BTR、BTS
- BTS, BTR 指令
- [BTS] Faulting application name: BTSNTSvc.exe, version: 3.9.469.0, time stamp: 0x4c547e09
- BTS指令
- [BTS]为什么BTSharePointAdapterWS.asmx无法预览?
- Android 指令打开BT、WIFI
- 汇编指令: VERW、WAIT、WBINVD、WRSHR、WRMSR、XADD、XBTS、XCHG、
- ARM伪指令讲解(一)
- 汇编学习笔记(6)转移指令原理
- mongodb基本指令操作
- 初始化应用程序数据ng-init指令
- [小技巧]使用google指令直接翻译单词和查询汇率
- 利用虚拟键盘驱动uinput向系统发送按键指令
- 指令
- SQL常用指令
- AT91RM9200的协处理器CP15的操作指令及操作码
- addr和offset指令的区别
- angular js权威指南笔记三--向指令中传递数据