• 内中断04 零基础入门学习汇编语言63


    第十二章:内中断04

     

    让编程改变世界

    Change the world by program


     

    单步中断

      什么是单步中断? CPU为什么要提供这样的功能呢? 我们在使用Debug的T命令的时候,有没有想过这样的问题,Debug如何能让CPU在执行一条指令后,就显示各个寄存器的状态?   假想:如果CPU不提供其他功能的话,就按正常方式工作,只要CPU一加电,它就从预设的地址开始一直执行下去……不可控制! 可是,我们在Debug中看到的情况却是,Debug可以控制CPU执行被加载程序中的一条指令,然后让它停下来,显示寄存器的状态。  

    Debug有特殊的能力吗?

      我们只能说Debug利用了CPU提供的一种功能。 只有CPU提供了在执行一条指令后就转去做其他事情的功能,Debug或是其他的程序才能利用CPU提供的这种功能做出我们使用T命令时的效果。 好了,我们先来谈谈CPU是如何实现单步中断机制,然后再来简要地考虑一下Debug是如何利用CPU所提供的单步中断的功能的。 CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。  

    单步中断的中断类型码为1,则它所引发的中断过程如下:

    (1)取得中断类型码1; (2)标志寄存器入栈,TF、IF设置为0; (3) CS、IP入栈; (4)(IP)=(1*4),(CS)=(1*4+2)。   如上所述,如果TF=1,则执行一条指令后,CPU就要转去执行1号中断处理程序。 同样的道理,Debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。 在使用 T 命令执行指令时,Debug 将TF设置为 1,使得CPU在工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在屏幕上,并且等待输入命令。 总之,当TF=1时,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序。执行完中断处理程序后,又返回原来的位置继续……  

    我们再来看一下中断过程

    (1)取得中断类型码N; (2)标志寄存器入栈,TF=0、IF=0; (3)CS、IP入栈; (4)(IP) = (N*4),(CS) = (N*4+2)   最后,CPU提供单步中断功能的原因就是,为单步跟踪的执行过程,提供了实现机制。  

    响应中断的特殊情况

      一般情况下,CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。 可是,在有些情况下,CPU 在执行完当前指令后,即便是发生中断,也不会响应。 对于这些情况,我们不一一列举,大家结合实际运用多加体会,这里我们举一种比较典型的情况来进行说明。   例如,在执行完向 ss寄存器传送数据的指令后,即便检测到中断信号,CPU 也不会响应。 这样做的主要原因是,ss:sp联合指向栈顶,而对它们的设置应该连续完成。 因为,如果在执行完设置ss的指令后,CPU响应中断,引发中断过程,要在栈中压入标志寄存器、CS和IP的值。 而ss改变,sp并未改变,ss:sp指向的不是正确的栈顶,将引起错误。 所以CPU在执行完设置ss的指令后,不响应中断。   这给连续设置 ss和sp,指向正确的栈顶提供了一个时机。 即,我们应该利用这个特性,将设置ss和sp的指令连续存放,使得设置sp的指令紧接着设置ss的指令执行,而在此之间,CPU不会引发中断过程。   比如,我们要将栈顶设为1000:0 我们应该

    mov ax,1000h

    mov ss,ax

    mov sp,0

    mov ax,0

    而不应该

    mov ax,1000h

    mov ss,ax

    mov ax,0

    mov sp,0

    好了,现在我们回过来看一下,实验2 中的“(3)下一条指令执行了吗?”。 现在你知道原因了吧? ! [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LYMMXENSJUDT']视频下载[/Downlink]
  • 相关阅读:
    JavaScript中的方法和属性
    vue的计算属性与方法的不同
    vue 中使用 watch 出现了如下的报错
    vue中methods函数调用methods函数写法
    ES2015箭头函数与普通函数对比理解
    leetcode Single Number python
    leetcode first bad version python
    leetcode Search for a Range python
    leetcode Longest Valid Parentheses python
    python dict traversal
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3847062.html
Copyright © 2020-2023  润新知