• 汇编指令CLI/STI


    CLI禁止中断发生
    STL允许中断发生

           这两个指令只能在内核模式下执行,不可以在用户模式下执行;而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的执行(如移动鼠标等等),系统就会变得不稳定。在标志寄存器中中断标志清零的情况下,可以以“int  ××”的形式调用软中断。


           程序员可以改变段地址和偏移地址,但是在这个过程中如果需要改变段寄存器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

    jpg 改 rar

  • 相关阅读:
    会议室预订系统
    event chrome firefox 获取点击对象的 id 类
    微信支付 301 500 php 7 simplexml_load_string
    会议室预订
    ini_set('date.timezone','Asia/Shanghai');
    UnionID OpenID
    Location 接口表示其链接到的对象的位置
    confirm() event.target.getAttribute('id')
    php 代替 js实现自定义时间选择器
    前端页面 重复提交避免
  • 原文地址:https://www.cnblogs.com/kuangke/p/5524405.html
Copyright © 2020-2023  润新知