汇编cli(Clear Interrupt,禁止中断、关中断,对应的sti是开中断)
CLI禁止中斷發(fā)生,關(guān)中斷
STI允許中斷發(fā)生,開中斷
這兩個(gè)指令只能在內(nèi)核模式下執(zhí)行,不可以在用戶模式下執(zhí)行;而且在內(nèi)核模式下執(zhí)行時(shí),應(yīng)該盡可能快的恢復(fù)中斷,因?yàn)镃LI會(huì)禁用硬件中斷,若長(zhǎng)時(shí)間禁止中斷會(huì)影響其他動(dòng)作的執(zhí)行(如移動(dòng)鼠標(biāo)等等),系統(tǒng)就會(huì)變得不穩(wěn)定。在標(biāo)志寄存器中中斷標(biāo)志清零的情況下,可以以“int ××”的形式調(diào)用軟中斷。
STI(Set Interrupt) 中斷標(biāo)志置1指令 使 IF = 1;
CLI(Clear Interrupt) 中斷標(biāo)志置0指令 使 IF = 0.
它們只影響本指令指定的標(biāo)志,而不影響其他標(biāo)志位(即STI和CLI只影響IF)。
CLI和STI是用來(lái)屏蔽中斷和恢復(fù)中斷用的,如 設(shè)置棧基址SS和偏移地址SP時(shí),需要CLI,因?yàn)槿绻@兩條指令被分開了,那么很有可能SS被修改了,但由于中斷,而代碼跳去其它地方執(zhí)行了,SP還沒來(lái)得及修改,就有可能出錯(cuò)。
CLI可以屏蔽中斷, STI恢復(fù)中斷,于是,兩者之間的代碼就不會(huì)被外部中斷打斷。所以可以盡量保護(hù)代碼連續(xù)執(zhí)行。但是對(duì)于一些不允許屏蔽的中斷以及異常,代碼的運(yùn)行還是會(huì)被中斷
中斷向量是指中斷發(fā)生以后,程序會(huì)按照中斷類型執(zhí)行不同的中斷服務(wù)程序,這個(gè)中斷向量就是這些中斷處理函數(shù)的入口地址。
具體為什么叫向量,我認(rèn)為,中斷是有優(yōu)先級(jí)的,程序會(huì)按照優(yōu)先級(jí)從高到低依次查詢,突出一個(gè)方向性,所以叫向量。
程序員可以改變段地址和偏移地址,但是在這個(gè)過(guò)程中如果需要改變段寄存器SS和SP必須禁止中斷,當(dāng)改變完成后再恢復(fù)中斷(也就是說(shuō)在cli指令后需要有與其配對(duì)的sti指令,否則計(jì)算機(jī)–最常見的反應(yīng)就是崩潰)
在對(duì) ss 和sp操作的時(shí)候, 如果有中斷發(fā)生,中斷的保存現(xiàn)場(chǎng)的操作是將相關(guān)寄存器值保存到ss:sp指向的地址.
如果ss 或者sp沒有完成賦值操作, 這時(shí)候ss:sp指向的地址則是不期望的地方. 如果將系統(tǒng)或者其他應(yīng)用的數(shù)據(jù)覆蓋,會(huì)導(dǎo)致系統(tǒng)/應(yīng)用崩潰.
比方說(shuō),下面這個(gè)程序段(沒有屏蔽中斷):
(1) mov ax,100h
(2) mov ss,ax
(3) mov sp,200h
假設(shè)在執(zhí)行完指令(2)時(shí)產(chǎn)生了一個(gè)計(jì)時(shí)器中斷。這時(shí)SS等于100h,但是SP還沒有來(lái)得及改變。這樣就是說(shuō)堆棧的段地址正確,但偏移地址還是原先堆棧的偏移地址。
下面是兩條規(guī)則:
1)在改變SS:SP之前,必須用cli指令屏蔽中斷,然后等操作執(zhí)行完立即用sti指令恢復(fù)
2)SS:SP需要設(shè)置在空閑的內(nèi)存地址,不要建立在其他的程序(尤其是系統(tǒng)的)代碼區(qū)
正確的寫法:
cli
mov ax,100h
mov ss,ax
mov sp,200h
sti
————————————————
版權(quán)聲明:本文為CSDN博主「zang141588761」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zang141588761/article/details/52325106
STI(Set Interrupt) 中斷標(biāo)志置1指令 使 IF = 1;
CLI(Clear Interrupt) 中斷標(biāo)志置0指令 使 IF = 0.
它們只影響本指令指定的標(biāo)志,而不影響其他標(biāo)志位(即STI和CLI只影響IF)。
CLI和STI是用來(lái)屏蔽中斷和恢復(fù)中斷用的,如 設(shè)置棧基址SS和偏移地址SP時(shí),需要CLI,因?yàn)槿绻@兩條指令被分開了,那么很有可能SS被修改了,但由于中斷,而代碼跳去其它地方執(zhí)行了,SP還沒來(lái)得及修改,就有可能出錯(cuò)。
CLI可以屏蔽中斷, STI恢復(fù)中斷,于是,兩者之間的代碼就不會(huì)被外部中斷打斷。所以可以盡量保護(hù)代碼連續(xù)執(zhí)行。但是對(duì)于一些不允許屏蔽的中斷以及異常,代碼的運(yùn)行還是會(huì)被中斷
以上參考了: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
總結(jié)
以上是生活随笔為你收集整理的汇编cli(Clear Interrupt,禁止中断、关中断,对应的sti是开中断)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编伪指令EVEN(数据对齐的伪指令,使
- 下一篇: seg是伪操作符,用来取后面符号的段地址