位操作指令,處理器控制指令
AA.位操作指令,8086新增的一組指令,包括位測試,位掃描。BT,BTC,BTR,BTS,BSF,BSR
a.BT(Bit Test),位測試指令,指令格式:
BT OPRD1,OPRD2,規(guī)則:操作作OPRD1可以是16位或32位的通用寄存器或者存儲單元。操作數(shù)OPRD2必須是8位立即數(shù)或者是與OPRD1操作數(shù)長度相等的通用寄存器。如果用OPRD2除以O(shè)PRD1,假設(shè)商存放在Divd中,余數(shù)存放在Mod中,那么對OPRD1操作數(shù)要進行測試的位號就是Mod,它的主要功能就是把要測試位的值送往CF,看幾個簡單的例子:
b.BTC(Bit Test And Complement),測試并取反用法和規(guī)則與BT是一樣,但在功能有些不同,它不但將要測試位的值送往CF,并且還將該位取反。
c.BTR(Bit Test And Reset),測試并復(fù)位,用法和規(guī)則與BT是一樣,但在功能有些不同,它不但將要測試位的值送往CF,并且還將該位復(fù)位(即清0)。
d.BTS(Bit Test And Set),測試并置位,用法和規(guī)則與BT是一樣,但在功能有些不同,它不但將要測試位的值送往CF,并且還將該位置位(即置1)。
e.BSF(Bit Scan Forward),順向位掃描,指令格式:BSF OPRD1,OPRD2,功能:將從右向左(從最低位到最高位)對OPRD2操作數(shù)進行掃描,并將第一個為1的位號送給操作數(shù)OPRD1。操作數(shù)OPRD1,OPRD2可以是16位或32位通用寄存器或者存儲單元,但OPRD1和OPRD2操作數(shù)的長度必須相等。
f.BSR(Bit Scan Reverse),逆向位掃描,指令格式:BSR OPRD1,OPRD2,功能:將從左向右(從最高位到最低位)對OPRD2操作數(shù)進行掃描,并將第一個為1的位號送給操作數(shù)OPRD1。操作數(shù)OPRD1,OPRD2可以是16位或32位通用寄存器或存儲單元,但OPRD1和OPRD2操作數(shù)的長度必須相等。
g.舉個簡單的例子來說明這6條指令:
AA DW 1234H,5678H
BB DW 9999H,7777H
MOV EAX,12345678H
MOV BX,9999H
BT EAX,8;CF=0,EAX保持不變
BTC EAX,8;CF=0,EAX=12345778H
BTR EAX,8;CF=0,EAX=12345678H
BTS EAX,8;CF=0,EAX=12345778H
BSF AX,BX;AX=0
BSR AX,BX;AX=15
BT WORD PTR [AA],4;CF=1,[AA]的內(nèi)容不變
BTC WORD PTR [AA],4;CF=1,[AA]=1223H
BTR WORD PTR [AA],4;CF=1,[AA]=1223H
BTS WORD PTR [AA],4;CF=1,[AA]=1234H
BSF WORD PTR [AA],BX;[AA]=0;
BSR WORD PTR [AA],BX;[AA]=15(十進制)
BT DWORD PTR [BB],12;CF=1,[BB]的內(nèi)容保持不變
BTC DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTR DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTS DWORD PTR [BB],12;CF=1,[BB]=77779999H
BSF DWORD PTR [BB],12;[BB]=0
BSR DWORD PTR [BB],12;[BB]=31(十進制)
BB.處理器控制指令
處理器控制指令主要是用來設(shè)置/清除標(biāo)志,空操作以及與外部事件同步等。
a.CLC,將CF標(biāo)志位清0。
b.STC,將CF標(biāo)志位置1。
c.CLI,關(guān)中斷。
d.STI,開中斷。
e.CLD,清DF=0。
f.STD,置DF=1。
g.NOP,空操作,填補程序中的空白區(qū),空操作本身不執(zhí)行任何操作,主要是為了保持程序的連續(xù)性。
h.WAIT,等待BUSY引腳為高。
i.LOCK,封鎖前綴可以鎖定其后指令的操作數(shù)的存儲單元,該指令在指令執(zhí)行期間一直有效。在多任務(wù)環(huán)境中,可以用它來保證獨占其享內(nèi)存,只有以下指令才可以用LOCK前綴:
XCHG,ADD,ADC,INC,SUB,SBB,DEC,NEG,OR,AND,XOR,NOT,BT,BTS,BTR,BTC
j.說明處理器類型的偽指令
.8086,只支持對8086指令的匯編
.186,只支持對80186指令的匯編
.286,支持對非特權(quán)的80286指令的匯編
.286C,支持對非特權(quán)的80286指令的匯編
.286P,支持對80286所有指令的匯編
.386,支持對80386非特權(quán)指令的匯編
.386C,支持對80386非特權(quán)指令的匯編
.386P,支持對80386所有指令的匯編
只有用偽指令說明了處理器類型,匯編程序才知道如何更好去編譯,連接程序,更好地去檢錯。
在后續(xù)的幾篇里將詳細(xì)介紹80386的段頁管理機制及控制寄存器,調(diào)試寄存器,以及如何在386實模下和保護模式下編程。