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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章