彙編cli(Clear Interrupt,禁止中斷、關中斷,對應的sti是開中斷)

CLI禁止中斷髮生,關中斷
STI允許中斷髮生,開中斷

這兩個指令只能在內核模式下執行,不可以在用戶模式下執行;而且在內核模式下執行時,應該儘可能快的恢復中斷,因爲CLI會禁用硬件中斷,若長時間禁止中斷會影響其他動作的執行(如移動鼠標等等),系統就會變得不穩定。在標誌寄存器中中斷標誌清零的情況下,可以以“int ××”的形式調用軟中斷。

STI(Set Interrupt) 中斷標誌置1指令 使 IF = 1;
CLI(Clear Interrupt) 中斷標誌置0指令 使 IF = 0.
它們隻影響本指令指定的標誌,而不影響其他標誌位(即STI和CLI隻影響IF)。

CLI和STI是用來屏蔽中斷和恢復中斷用的,如 設置棧基址SS和偏移地址SP時,需要CLI,因爲如果這兩條指令被分開了,那麼很有可能SS被修改了,但由於中斷,而代碼跳去其它地方執行了,SP還沒來得及修改,就有可能出錯。

CLI可以屏蔽中斷, STI恢復中斷,於是,兩者之間的代碼就不會被外部中斷打斷。所以可以儘量保護代碼連續執行。但是對於一些不允許屏蔽的中斷以及異常,代碼的運行還是會被中斷

中斷向量是指中斷髮生以後,程序會按照中斷類型執行不同的中斷服務程序,這個中斷向量就是這些中斷處理函數的入口地址
具體爲什麼叫向量,我認爲,中斷是有優先級的,程序會按照優先級從高到低依次查詢,突出一個方向性,所以叫向量。

程序員可以改變段地址和偏移地址,但是在這個過程中如果需要改變段寄存器SS和SP必須禁止中斷,當改變完成後再恢復中斷(也就是說在cli指令後需要有與其配對的sti指令,否則計算機–最常見的反應就是崩潰)
在對 ss 和sp操作的時候, 如果有中斷髮生,中斷的保存現場的操作是將相關寄存器值保存到ss:sp指向的地址.
如果ss 或者sp沒有完成賦值操作, 這時候ss:sp指向的地址則是不期望的地方. 如果將系統或者其他應用的數據覆蓋,會導致系統/應用崩潰.

比方說,下面這個程序段(沒有屏蔽中斷):
(1) mov ax,100h
(2) mov ss,ax
(3) mov sp,200h
假設在執行完指令(2)時產生了一個計時器中斷。這時SS等於100h,但是SP還沒有來得及改變。這樣就是說堆棧的段地址正確,但偏移地址還是原先堆棧的偏移地址。
下面是兩條規則:
1)在改變SS:SP之前,必須用cli指令屏蔽中斷,然後等操作執行完立即用sti指令恢復
2)SS:SP需要設置在空閒的內存地址,不要建立在其他的程序(尤其是系統的)代碼區

正確的寫法:
cli
mov ax,100h
mov ss,ax
mov sp,200h
sti
————————————————
版權聲明:本文爲CSDN博主「zang141588761」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zang141588761/article/details/52325106

STI(Set Interrupt) 中斷標誌置1指令 使 IF = 1;
CLI(Clear Interrupt) 中斷標誌置0指令 使 IF = 0.
它們隻影響本指令指定的標誌,而不影響其他標誌位(即STI和CLI隻影響IF)。

CLI和STI是用來屏蔽中斷和恢復中斷用的,如 設置棧基址SS和偏移地址SP時,需要CLI,因爲如果這兩條指令被分開了,那麼很有可能SS被修改了,但由於中斷,而代碼跳去其它地方執行了,SP還沒來得及修改,就有可能出錯。

CLI可以屏蔽中斷, STI恢復中斷,於是,兩者之間的代碼就不會被外部中斷打斷。所以可以儘量保護代碼連續執行。但是對於一些不允許屏蔽的中斷以及異常,代碼的運行還是會被中斷

以上參考了:https://blog.csdn.net/lanwanjunxixihaha/article/details/46518563

https://zhidao.baidu.com/question/365339672.html
https://blog.csdn.net/lanwanjunxixihaha/article/details/46518563
https://blog.csdn.net/zang141588761/article/details/52325106

發佈了149 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章