INT(軟件中斷指令)是CALL指令的一種特殊形式。call指令調用調用的子程序是用戶程序的一部分,而INT指令調用的操作系統提供的子程序或者其他特殊的子程序。
中斷服務子程序和標准過程的最大區別是 匯編程序可以有任意個過程,中斷服務子程序最多有256個過程、
INT指令共有四中不同的格式:
《1》 int n
n是中斷號,這就允許用戶程序調用256個中斷服務子程序。
該指令2字節長度,第一字節是int機器碼,第二字節是8位立即數,表示中斷號。
CPU在執行到INT指令時,通過中斷描述符表找到中斷號對應的中斷服務子程序的地址,(本質上就是一個異常處理程序的軟件調用)
《2》 int 3
INT 3 是中斷指令的一種特殊形式,僅有一個字節長。
調試器將該指令當作軟件中斷指令來用。調試的時候,當程序中的某一位置加斷點的時候,調試器會把斷點處指令編碼的第一個字節替換為INT 3指令的編碼。
當程序執行到INT 3,回向調試器申請系統調用,調試器因此獲得CPU控制權。之后,再用原先的編碼替換INT 3 編碼。
《3》INTO 中斷號4
如果溢出標志位為1,則INTO指令會產生一個軟件中斷,利用這個指令可以快速測試算術運算指令之后是否有溢出產生。
《4》BOUND 中斷號5
BOUND reg,mem
其執行算法為:if(reg<[mem])or(reg>[mem+sizeof(reg)]) then INT 5
判斷數組下表是否在合理范圍內,不合理觸發INT 5 中斷,返回地址仍是BOUND
不管是哪種,都會發生
(1)標志寄存器入棧
(2)CS:EIP 寄存器入棧,
(3)通過中斷號在中斷描述符表中找到對應的描述符,並將對應的數據放入CS:EIP中、
CS入棧和出棧都是一個32位值,只有低16位有效。擴充的高16位無定義,目的是使堆棧保持與4字節邊界對齊。這對80386的性能來說很重要。。。么。。。。。