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

汇编指令CLI/STI的更多相关文章

  1. 学习linux内核时常碰到的汇编指令(1)

     转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...

  2. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  3. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  4. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  5. Objdump-查看汇编指令

    作用 Objdump可以用来看汇编指令 查看汇编指令 测试文件 编译指令 gcc -g -o objtest 1.8.c objdump -S objtest |more /main 查看结果

  6. ARM汇编指令(未完待续)

    ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...

  7. STM32的例程GPIO的汇编指令初探

    任务一:寻找main函数的汇编指令集 任务二:寻找main函数中的SystemClock_Config函数的汇编指令集 寻找main函数的汇编指令集 运行例程中GPIO工程时,总会加载startup_ ...

  8. ARM汇编指令的一些总结-转

    ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...

  9. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

随机推荐

  1. 通过nsenter连接docker容器

    通常连接Docker容器并与其进行交互有四种方法.详情见:https://github.com/berresch/Docker-Enter-Demo,下面摘录nsenter连接的方式. 查看是否安装n ...

  2. net use与shutdown配合使用,本机重启远程服务器

    net use与shutdown配合使用,本机重启远程服务器   今天服务器出现问题了,能ping通,但就是远程登录服务器后,服务器无法响应.   在本机测试发现ftp服务可以使用,于是就想通过ftp ...

  3. 6.js模式-中介者模式

    1. 中介者模式 所有对象通过中介者进行通信 var playDirector = (function(){ var players = []; var options = {}; options.a ...

  4. 19. javacript高级程序设计-E4X

    1. E4X E4X是对ECMAScript的一个扩展, l 与DOM不同,E4X只用一个类型节点来表示XML中的各个节点 l XML对象中封装了对所有节点都有用的数据和行为.为了表示多个节点的集合, ...

  5. 头文件algorithm中的常用函数

    非修改性序列操作(12个) 循环         对序列中的每个元素执行某操作         for_each() 查找         在序列中找出某个值的第一次出现的位置         fin ...

  6. 针对SYN洪水攻击的防御措施

    可以运用sysctl命令进行配置,由于本命令参数较多,这里只简单记录几个比较常用的参数: 1.tcp_max_syn_backlog 这个参数指定了后备队列可维持的TCP半开连接的数目,如果该值设定很 ...

  7. linux 卸载软件

    sudo apt-get autoremove --purge 后跟要卸载的软件名称, --purge表示要完全卸载.

  8. LightOJ 1234 Harmonic Number

    D - Harmonic Number Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu S ...

  9. 警告:Assigning to 'id<Delegate>' from incompatible type 'ViewController *const_st

    原因: 你自己写了代理,设置了   delegate = self.但是self 没有遵守这个协议 只需要遵守这个协议就可以消除警告.

  10. 获取driver网络路径名称

    'get the web path of the drive s: Dim MM As New Management.ManagementObject(String.Format("win3 ...