Win32ASM学习[12]:位测试指令位扫描指令
-----------------------------------------------------------------------------------------------------------------------
?一.BT 指令
格式: BT OPD,OPS
功能: 目的操作數(shù)OPD中由源操作數(shù)OPS指定的位送CF標(biāo)志
說(shuō)明: 1. 在指令中,目的操作數(shù)OPD只能是16/32位通用寄存器或存儲(chǔ)單元,用于指定要測(cè)試的數(shù)據(jù);源操作數(shù)OPS必須是8位立即數(shù)或者是與目的操作數(shù)等長(zhǎng)的16/32位通用寄存器,用于指定要測(cè)試的位. 如果目的操作數(shù)是寄存器,則源操作數(shù)除以16/32的余數(shù)就是要測(cè)試的位,它在0-15/31之間.
???????? 2. 舉例: MOV EAX 12345678H?????? ;EAX=12345678H
??????????????????????BT EAX,5????????????????????????? ?;EAX的D5位=1-->CF,EAX=12345678H
注意: 如果目的操作數(shù)是存儲(chǔ)單元, 則該單元的最低位為0.從這個(gè)最低位向地址高端每位依次增量,向地址代低端每位依次減量,這部分存儲(chǔ)器數(shù)據(jù)作為一個(gè)2G-1~-2G長(zhǎng)的位串.此時(shí),有符號(hào)源操作數(shù)就指示要測(cè)試的位.
?
二.BTS指令
格式: BTS OPD,OPS
功能: 報(bào)目的操作數(shù)OPD中由源操作數(shù)OPS指定的位送CF標(biāo)志,然后對(duì)那一位置位.
說(shuō)明: 1. 在指令中,目的操作數(shù)OPD只能是16/32位通用寄存器或存儲(chǔ)單元,用于指定要測(cè)試的數(shù)據(jù);源操作數(shù)OPS必須是8位立即數(shù)或者是與目的操作數(shù)等長(zhǎng)的16/32位通用寄存器,用于指定要測(cè)試的位.如果目的操作數(shù)是寄存器,則源操作數(shù)除以16/32的余數(shù)就是要測(cè)試的位,它在0-15/31之間.
?????? 2. 舉例: MOV EAX 12345678H?????? ;EAX=12345678H
???????????????????BTS??EAX,34?????????????????????? ;EAX的D2位=0-->CF,EAX=1224527CH
注意: 如果目的操作數(shù)是存儲(chǔ)單元,則該單元的最低位為0.從這個(gè)最低位向地址高端每位依次增量,向地址代低端每位依次減量,這部分存儲(chǔ)器數(shù)據(jù)作為一個(gè)2G-1~-2G長(zhǎng)的位串.此時(shí),有符號(hào)源操作數(shù)就指示要測(cè)試的位
?
三.BTC 指令
格式: BTC OPD,OPS
功能: 報(bào)目的操作數(shù)OPD中由源操作數(shù)OPS指定的位送CF標(biāo)志,然后對(duì)那一位求反.
說(shuō)明: 1. 在指令中, 目的操作數(shù)OPD只能是16/32位通用寄存器或存儲(chǔ)單元,用于指定要測(cè)試的數(shù)據(jù);源操作數(shù)OPS必須是8位立即數(shù)或者是與目的操作數(shù)等長(zhǎng)的16/32位通用寄存器,用于指定要測(cè)試的位.如果目的操作數(shù)是寄存器,則源操作數(shù)除以16/32的余數(shù)就是要測(cè)試的位,它在0-15/31之間.
?????? 2. 舉例: MOV EAX 12345678H?????? ;EAX=12345678H
??????????????????? BTC EAX,10????????????????????? ?;EAX的D10位=1-->CF,EAX=12345278H
????????? 注意: 如果目的操作數(shù)是存儲(chǔ)單元,則該單元的最低位為0.從這個(gè)最低位向地址高端每位依次增量,向地址代低端每位依次減量,這部分存儲(chǔ)器數(shù)據(jù)作為一個(gè)2G-1~-2G長(zhǎng)的位串.此時(shí),有符號(hào)源操作數(shù)就指示要測(cè)試的位.
?
?四.BTR 指令
格式: BTR OPD,OPS
功能: 報(bào)目的操作數(shù)OPD中由源操作數(shù)OPS指定的位送CF標(biāo)志,然后對(duì)那一位復(fù)位.
說(shuō)明: 1. 在指令中,目的操作數(shù)OPD只能是16/32位通用寄存器或存儲(chǔ)單元,用于指定要測(cè)試的數(shù)據(jù);源操作數(shù)OPS必須是8位立即數(shù)或者是與目的操作數(shù)等長(zhǎng)的16/32位通用寄存器,用于指定要測(cè)試的位.如果目的操作數(shù)是寄存器,則源操作數(shù)除以16/32的余數(shù)就是要測(cè)試的位,它在0-15/31之間.
?????? 2. 舉例: MOV EAX 12345678H?????? ;EAX=12345678H
????????????????????BTR EAX,20????????????????????????? ;EAX的D20位=1-->CF,EAX=12245278H
注意: 如果目的操作數(shù)是存儲(chǔ)單元,則該單元的最低位為0.從這個(gè)最低位向地址高端每位依次增量,向地址代低端每位依次減量,這部分存儲(chǔ)器數(shù)據(jù)作為一個(gè)2G-1~-2G長(zhǎng)的位串.此時(shí),有符號(hào)源操作數(shù)就指示要測(cè)試的位.
?---------------------------------------------------------------------------------------------------------------------------------
.code
main proc
??? ;BT 把 10000001b 的第七位復(fù)制到 CF, 得知是 1
??? mov dx, 10000001b
??? bt? dx, 7
??? lahf
??? PrintHex ah ;47 - 01000111b (CF=1)
??? ;BT 把 10000001b 的第六位復(fù)制到 CF, 得知是 0
??? bt? dx, 6
??? lahf
??? PrintHex ah ;86 - 10000110b (CF=0)
???
??? ;BTS 在執(zhí)行 BT 命令的同時(shí), 把操作數(shù)的指定位置為 1
??? mov dx, 10000001b
??? bts dx, 6
??? PrintHex dl ;C1 - 11000001b
???
??? ;BTR 在執(zhí)行 BT 命令的同時(shí), 把操作數(shù)的指定位置為 0
??? mov dx, 10000001b
??? btr dx, 7
??? PrintHex dl ;01 - 00000001b
???
??? ;BTC 在執(zhí)行 BT 命令的同時(shí), 把操作數(shù)的指定位取反
??? mov dx, 10000001b
??? btc dx, 0
??? PrintHex dl ;80 - 10000000b
??? btc dx, 0
??? PrintHex dl ;81 - 10000001b
??? ret
main endp
end main
?------------------------------------------------------------------------------------------------------------------
五.BSF 指令
格式: BSF OPD,OPS
功能: 向前位掃描指令.本指令從最低位(第0位)開(kāi)始測(cè)試OPS中的各位,當(dāng)遇到有1的位時(shí),ZF=0,且將該位的序號(hào)存入OPD中,如OPS的所有位都是0,則ZF=1且OPD中的值無(wú)意義.(執(zhí)行邏輯移位前,決定應(yīng)移位的次數(shù))
?說(shuō)明: 1. OPD和OPS應(yīng)為同類型的16或32位的寄存器或存儲(chǔ)器操作數(shù),OPD必須為寄存器操作數(shù).
???????? 2. 舉例: 假定EBX中的數(shù)是12F234E0H,指令BSF EAX,EBX執(zhí)行后,EAX=5,ZF=0
?
六.BSR 指令
格式: BSR OPD,OPS
功能: 向后位掃描指令.本指令從最高位(第15位或31位)開(kāi)始測(cè)試OPS中的各位,當(dāng)遇到有1的位時(shí),ZF=0,且將該位的序號(hào)存入OPD中,如OPS的所有位都是0,則ZF=1且OPD中的值無(wú)意義.(執(zhí)行邏輯移位前,決定應(yīng)移位的次數(shù))
?
說(shuō)明: 1. OPD和OPS應(yīng)為同類型的16或32位的寄存器或存儲(chǔ)器操作數(shù),OPD必須為寄存器操作數(shù).
??????? 2. 舉例: 假定EBX中的數(shù)是12F234E0H,指令BSR EAX,EBX執(zhí)行后,EAX=28,ZF=0
-------------------------------------------------------------------------------------------------------------------
.code
main proc
??? ;掃描到時(shí)
??? mov dx, 0000111100001100b
??? bsf cx, dx
??? PrintDec cx ;2? - 也就是左數(shù)第 3 位
???
??? bsr cx, dx
??? PrintDec cx ;11 - 也就是左數(shù)第 12 位
???
??? ;掃描不到時(shí)
??? mov cx, 0FFFFh
??? mov dx, 0
??? bsf cx, dx
??? lahf
??? PrintHex ah ;C6 - 11000110 (ZF=1)
??? PrintHex cx ;FFFF - 找不到時(shí)不會(huì)影響到目的值
??? ret
main endp
end main
----------------------------------------------------------------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的Win32ASM学习[12]:位测试指令位扫描指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 英雄联盟皮肤多少钱啊?
- 下一篇: Win32ASM学习[13]:移位指令S