IA-32汇编语言笔记(12)—— 位操作 & 条件设置字节指令

  • 记录汇编语言课笔记,可能有不正确的地方,欢迎指出
  • 教材《新概念汇编语言》—— 杨季文
  • 这篇文章对应书第二章 IA32处理器基本功能 4.2 ~ 4.3部分

一、位操作

1、位测试及设置指令组

  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 是存储器单元,那么它代表的是位串的地址
  • 在OPRD1是32位存储单元偏移地址的情况下,可以取(-2G)至(2G-1)范围内的位串:

    1. EA = OPDR1; BitOffset = OPDR2
    2. 实测存储单元 = EA + (4 ∗ (BitOffset DIV 32))
    3. 实测位号 = BitOffset MOD 32
  • 在OPRD1是16位存储单元偏移地址的情况下,可以取(-32K)至(32K-1)范围内的位串:

    1. EA = OPDR1; BitOffset = OPDR2
    2. 实测存储单元 = EA + (2 ∗ (BitOffset DIV 16))
    3. 实测位号 = BitOffset MOD 16
  1. 位测试并取反指令BTC
名称 BTC(位测试并取反指令)
格式 BTC OPRD1,OPRD2
动作 OPRD1指定位串,OPRD2指定位号,被测试位的值送到进位标志CF并把被测试位取反
合法值 同BT指令
注意 同BT指令
  1. 位测试并复位指令BTR
名称 BTR(位测试并复位指令)
格式 BTR OPRD1,OPRD2
动作 OPRD1指定位串,OPRD2指定位号,被测试位的值送到进位标志CF并且把被测试位清0
合法值 同BT指令
注意 同BT指令
  1. 位测试并置位指令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、位扫描指令组

  1. 顺(逆)向位扫描指令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位寄存器字节存储单元

在这里插入图片描述

  • 例1
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
  • 例2
//检测含于寄存器EAX中的8位十六进制数是否有一位为0,检测结果由寄存器BH反映
	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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章