ASM中关于CLI和STI的详解

程序员可以改变段地址和偏移地址,但是在这个过程中如果需要改变段寄存器SS和SP必须禁止中断,当改变完成后再恢复中断(也就是说在cli指令后需要有与其配对的sti指令,否则计算机--最常见的反应就是--死机~~~)
为什么要这样做?举个例子:
当你写了一段程序并且运行它时,系统中运行的程序并不只是它一个!最简单的例子--计时器(timer),计算机电路中它每秒钟发生18次中断。就是在你等待键盘输入的时候它也会发生~这是系统会在堆栈中保存下一条指令的地址和所有的寄存器,然后转到中断处理程序(比方说刷新时间的显示)。然后退出中断,恢复寄存器并转到刚才保存下的指令地址。
比方说,下面这个程序段(没有屏蔽中断):
(1)   mov   ax,100h
(2)   mov   ss,ax
(3)   mov   sp,200h
假设在执行完指令(2)时产生了一个计时器中断。这时SS等于100h,但是SP还没有来得及改变。这样就是说堆栈的段地址正确,但偏移地址还是原先堆栈的偏移地址(假设SP=0FFFEh)。系统会在SS=100h,SP=0FFFEh的内存地址处保存所有寄存器和下一条指令地址等等需要保存的信息。如果这个地址(100h、0FFFEh)上有什么重要的信息,这样的结果就可能覆盖系统的一些重要数据!你猜它会怎么做??:)

下面是两条规则:
1)在改变SS:SP之前,必须用cli指令屏蔽中断,然后等操作执行完立即用sti指令恢复
2)SS:SP需要设置在空闲的内存地址,不要建立在其他的程序(尤其是系统的)代码区

正确的写法:
cli
mov   ax,0B900h
mov   ss,ax
mov   sp,100h

sti


转自——http://topic.csdn.net/t/20020907/21/1005206.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值