汇编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

你可能感兴趣的:(汇编语言,sti,cli,汇编)