- 记录汇编语言课笔记,可能有不正确的地方,欢迎指出
- 教材《新概念汇编语言》—— 杨季文
- 这篇文章对应书第二章 IA32处理器基本功能 4.2 ~ 4.3部分
一、位操作
1、位测试及设置指令组
- 位测试指令BT
名称 | BT(位测试指令) |
---|
格式 | BT OPRD1,OPRD2 |
动作 | OPRD1指定位串,OPRD2指定位号,被测试位的值送到进位标志CF |
合法值 | OPRD1:16/32位通用寄存器、16/32位存储单元 |
| OPRD2: OPDR1同尺寸通用寄存器、8位立即数 |
注意 | OPRD2 和 OPDR1同尺寸 |
| OPDR2的取值不能大于OPDR1尺寸,真正位号是OPDR2 / 32(16)的余数 |
| 如果OPRD1 是存储器单元,那么它代表的是位串的地址 |
- 位测试并取反指令BTC
名称 | BTC(位测试并取反指令) |
---|
格式 | BTC OPRD1,OPRD2 |
动作 | OPRD1指定位串,OPRD2指定位号,被测试位的值送到进位标志CF,并把被测试位取反 |
合法值 | 同BT指令 |
注意 | 同BT指令 |
- 位测试并复位指令BTR
名称 | BTR(位测试并复位指令) |
---|
格式 | BTR OPRD1,OPRD2 |
动作 | OPRD1指定位串,OPRD2指定位号,被测试位的值送到进位标志CF,并且把被测试位清0 |
合法值 | 同BT指令 |
注意 | 同BT指令 |
- 位测试并置位指令BTS
名称 | BTS(位测试并置位指令) |
---|
格式 | BTS OPRD1,OPRD2 |
动作 | OPRD1指定位串,OPRD2指定位号,被测试位的值送到进位标志CF,并且把被测试位置1 |
合法值 | 同BT指令 |
注意 | 同BT指令 |
MOV DX, 3456H ;DX=3456H
BTC DX, 5 ;CF=0, DX=3476H
MOV CX, 18
BTR DX, CX ;CF=1, DX=3472H(被测位号是2)
MOV ECX, 3
BTS EDX, ECX ;CF=0, DX=347AH
BT EDX, 38 ;CF=1, DX=347AH(被测位号是6)
2、位扫描指令组
- 顺(逆)向位扫描指令BSF(BSR)
名称 | BSF(顺向位扫描指令) |
---|
| BSR(逆向位扫描指令) |
格式 | BSF/BSR OPRD1,OPRD2 |
动作 | BSF:从右向左(位0至位15或位31)扫描字或双字操作数 OPRD2,并把扫描到的第一个含“1”的位的位号送操作数OPRD1 |
| BSR:从左向右(位15或位31至位0)扫描字或双字操作数 OPRD2,并把扫描到的第一个含“1”的位的位号送操作数OPRD1 |
合法值 | OPRD1:16/32位通用寄存器 |
| OPRD2: 16/32位通用寄存器、16/32位存储单元 |
注意 | OPRD2 和 OPDR1同尺寸 |
| 如果字或双字操作数OPRD2等于0,那么零标志ZF被置1,操作数OPRD1的值不确定;否则零标志ZF被清0 |
MOV EBX, 12345678H
BSR EAX, EBX ;ZF=0, EAX=1CH
BSF DX, AX ;ZF=0, DX=2
BSF CX, DX ;ZF=0, CX=1
二、条件设置字节指令
名称 | SETcc(条件设置字节指令)(符号cc是代表各种条件的缩写 ) |
---|
格式 | SETcc OPRD |
动作 | 当条件满足时,那么将目的操作数OPRD设置成1,否则设置成0(这里的条件与条件转移指令中的条件一样) |
合法值 | OPRD:8位寄存器、字节存储单元 |

MOV AL, 23H ;AL=23H
MOV DL, 35H ;DL=35H
ADD AL, DL ;AL=58H, DL=35H, ZF=0, CF=0
SETNZ DL ;AL=58H, DL=01H
SETC AL ;AL=00H, DL=01H
SUB AL, DL ;AL=FFH, DL=01H, ZF=0, CF=1
SETC AL ;AL=01H, DL=01H
MOV BH, 0
MOV ECX, 8
NEXT:
TEST AL, 0FH ;判断AL低4位是否为0
SETZ BL ;是,则使得BL=1
OR BH, BL ;保存检测结果
ROR EAX, 4
LOOP NEXT