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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值