§3.3.7 中斷指令
中斷指令的一般格式為:
INT n 其中,n稱為"中斷類型碼",n=0~255。
中斷指令"INT n"調(diào)用n號中斷處理程序,在中斷處理程序中,用中斷返回指令I(lǐng)RET指令使CPU返回主程序斷點(diǎn)繼續(xù)執(zhí)行。 中斷指令(INT n)和調(diào)用程序指令(CALL)很相似,它們均轉(zhuǎn)入內(nèi)存中其它程序段執(zhí)行,執(zhí)行完后再轉(zhuǎn)回。

主程序用"CALL 目標(biāo)地址"調(diào)用子程序,如圖3-25所示。主程序用"INT n"調(diào)用中斷處理程序,如圖3-26所示。數(shù)值n是中斷處理程序的編號,它代表了中斷處理程序的地址。中斷處理程序的地址稱為"中斷矢量"或"中斷向量",它是一個4字節(jié)值,2字節(jié)段地址,2字節(jié)偏移量。在8086處理器中,用"中斷矢量表"或稱"中斷向量表"來管理256個中斷處理程序的地址。
中斷向量表存放在內(nèi)存地址最低區(qū)域上(0段0000H~03FFH),共1024字節(jié)(256×4),其內(nèi)存放256個中斷處理程序的地址。

例如,設(shè)在中斷向量表中,0000:0084H~0000:0087H四個單元存放的值依此為00H、20H、00H、30H,則21H號中斷處理程序的地址為3000H:2000H。 中斷指令I(lǐng)NT和中斷返回指令I(lǐng)RET的執(zhí)行過程是:
INT n:
?、?SP減2,把標(biāo)志寄存器的值(記為FLAGS)推入堆棧。
② 標(biāo)志位TF和IF清0,以禁止跟蹤方式(單步方式)和屏蔽INTR中斷。
?、?SP減2,把返回地址的段值(CS)推入堆棧。
?、?SP減2,把返回地址的偏移量(IP)推入堆棧。
⑤ 根據(jù)中斷類型碼n,從中斷矢量表中取得中斷處理程序地址,取得的段地址送給CS,偏移量送給IP。從而使CPU轉(zhuǎn)入中斷處理程序運(yùn)行。
IRET:
中斷處理程序中最后被執(zhí)行的指令是IRET。其操作是:
?、?從堆棧中取出一字(INT指令保存的返回地址偏移量),送給 IP,然后使SP加2。
② 從堆棧中取出一字(INT指令保存的返回地址段值),送給 CS,然后使SP加2。
?、?從堆棧中取出一字(INT指令保存的標(biāo)志寄存器的值),送給 標(biāo)志寄存器,然后使SP加2。 IRET執(zhí)行后,CPU返回到INT指令后面的一條指令。
幾個特殊的中斷處理程序:
(1) 0號中斷處理程序
0號中斷處理程序用于處理除法運(yùn)算溢出,稱為"除數(shù)為0中斷"。當(dāng)CPU檢測到除法運(yùn)算溢出,自動調(diào)用0號中斷處理程序,無"INT 0"指令。
(2) 1號中斷處理程序
當(dāng)CPU的TF標(biāo)志置1時,CPU每執(zhí)行一條指令,就調(diào)用1號中斷處理程序,因此,它稱為"單步中斷"。 當(dāng)CPU檢測到TF=1時,自動進(jìn)入單步方式,無"INT 1"指令。 該中斷處理程序用于調(diào)試程序。
(3) 2號中斷處理程序
用于處理NMI非屏蔽硬件中斷請求,無"INT 2"指令。
(4) 3號中斷處理程序 用"INT 3"指令調(diào)用。稱為"斷點(diǎn)中斷"。用于調(diào)試程序。
(5) 4號中斷處理程序 用"INTO"指令調(diào)用。該中斷處理程序用于處理有符號數(shù)運(yùn)算溢出(OF=1)。稱為"溢出中斷"。
中斷處理程序的應(yīng)用:
(1) BIOS和操作系統(tǒng)(如DOS、Windows)的常用功能程序,一般設(shè)計為中斷處理程序的形式,用"INT n"指令調(diào)用。例如,DOS功能設(shè)計為21H號中斷處理程序,用"INT 21H"指令調(diào)用。
(2) 硬件中斷處理。當(dāng)外部設(shè)備希望CPU處理某事件時,它向中斷控制器8259發(fā)出一個INTR中斷請求,8259再向CPU發(fā)出中斷請求。
當(dāng)CPU響應(yīng)中斷時(發(fā)出中斷響應(yīng)信號 ),8259向CPU提供中斷類型碼,CPU就轉(zhuǎn)入對應(yīng)的中斷處理程序,處理該事件。
(3) 程序員編寫程序時,也可以把常用的功能程序,設(shè)計為中斷處理程序的形式,用"INT n"指令調(diào)用。
§3.3.8 處理器控制指令
1、 標(biāo)志位操作指令

2、 暫停指令HLT CPU暫停,不執(zhí)行任何操作。當(dāng)出現(xiàn)下述情況時,CPU脫離暫停狀態(tài)。
(1) 復(fù)位。
(2) 在NMI信號線上有請求。
(3) 當(dāng)IF=1時,INTR信號線上有請求。 該指令用于等待硬件中斷的發(fā)生。
3、 處理器交權(quán)指令ESC和等待指令WAIT
ESC指令用于調(diào)用數(shù)學(xué)協(xié)處理器8087。
WAIT指令用于等待協(xié)處理器完成運(yùn)算。
這兩條指令配合使用,它們由CPU硬件信號TEST來協(xié)調(diào)。8087在被初始化后,使TEST信號為"1"。 CPU執(zhí)行部件(EU)從指令隊(duì)列中取得指令的機(jī)器碼,如為ESC指令(數(shù)學(xué)協(xié)處理器指令),則交8087執(zhí)行。在8087執(zhí)行指令期間,使TEST信號為"1"。在8087執(zhí)行指令期間,CPU可執(zhí)行其他指令(8086與8087并行工作)。8087執(zhí)行完其操作后,使TEST信號為"0"。
當(dāng)8086需要使用8087的操作結(jié)果時,首先執(zhí)行WAIT指令以檢查TEST信號是否為"0",若TEST=1(8087未執(zhí)行完),8086進(jìn)入空轉(zhuǎn)等待;若TEST=0(8087已執(zhí)行完),8086執(zhí)行WAIT后面的指令(這些指令需要8087的操作結(jié)果)。
4、 總線鎖定指令LOCK
該指令是總線鎖定前綴,放在其他指令之前。某指令被執(zhí)行時,如果不希望其他總線主設(shè)備占用總線而使該指令被暫停,則在該指令前加前綴指令LOCK,例如:
LOCK XCHG AL,Varible
CPU在執(zhí)行上面的指令時,輸出總線鎖定信號 ,此時,即使有總線主設(shè)備請求總線,CPU要等到該指令執(zhí)行完后,才允許總線主設(shè)備使用總線。
5、 空操作指令NOP
CPU執(zhí)行該指令時,沒有實(shí)際動作,僅使IP加1(NOP指令的機(jī)器碼是90H,1字節(jié))。該指令主要用于程序調(diào)試。
