汇编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
總結
以上是生活随笔為你收集整理的汇编cli(Clear Interrupt,禁止中断、关中断,对应的sti是开中断)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编伪指令EVEN(数据对齐的伪指令,使
- 下一篇: seg是伪操作符,用来取后面符号的段地址