精华内容
下载资源
问答
  • 汇编语言--iret指令

    万次阅读 2020-09-13 16:54:16
    中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中。 中断处理程序的常规编写步骤: 保存用到的寄存器; 处理中断; 恢复用到的寄存器; iret指令返回。 iret 指令描述为:pop IP pop...

          CPU随时都可能执行中断处理程序,中断处理程序必须一直存储在内存某段空间之中
    而中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中。

    中断处理程序的常规编写步骤:

    1. 保存用到的寄存器;
    2. 处理中断;
    3. 恢复用到的寄存器;
    4. 用iret指令返回。

    iret 指令描述为:pop IP pop CS popf

    iret指令执行后,CPU回到执行中断处理程序前的执行点继续执行程序

    展开全文
  • 中断就是打断处理器当前执行流程,去执行另外一些和当前工作不相干的指令,执行完以后,还可以返回到原来的程序流程继续执行。在现实生活中我们也会经常遇到类似中断这样事情,例如你正在手机听歌,突然你...

    中断就是打断处理器当前的执行流程,去执行另外一些和当前工作不相干的指令,执行完以后,还可以返回到原来的程序流程继续执行。在现实生活中我们也会经常遇到类似中断这样的事情,例如你正在用手机听歌,突然你的电话响了,这时处理器必须中断歌曲的播放,来处理这件更为重要的事件。

     

    中断可以分为两大类:CPU内部中断和CPU外部中断。

     

    1. 外部硬件中断

    从字面意思理解,外部硬件中断就是处理器外面的中断信号,是由外设引起的(例如键盘)。当设备发生错误或者有数据要传送,又或者处理器交给它的事情处理完了(比如,打印已经完成)。它们都会拍一下处理器的肩膀,告诉它应当先把手头上的事情放一放,来临时处理一下。

    外部硬件中断是通过两个信号线引入处理器内部的,从很早的时候,也就是8086处理器的时代,这两根线的名字叫做NMI和INTR,如下图所示:

     

    2. 非屏蔽中断

    NMI=Non Maskable Interrupt,中文译为非屏蔽中断,什么叫做非屏蔽中断呢?

    举个栗子,例如内存访问电路发现内存里面的数据乱了,出错了,这种情况下CPU再努力工作也是没有意义的,在这些情况下,处理器必须对这种情况采取必要的措施,一旦置之不理,隐瞒真相必然会对用户造成不可挽回的损失。

    所以,处理器的设计者通过两个引脚来明确区分不同性质的中断,这是很自然的事情,严重事件,必须无条件地加以处理,这种类型的中断是不会被阻断和屏蔽的,也就是:NMI。当产生一个中断时,就会通过中断引脚NMI通知处理器。

    每种类型的中断都被统一编号,这称为中断类型号,或者中断号,或者中断向量,都是一回事。NMI非屏蔽中断一旦发生,对于处理器来说都是致命的,甚至是无法挽回,不可纠正的。在实模式下,NMI被赋予了统一的中断号2,一旦发生2号中断,处理器和软件系统通常会放弃正常工作的“念头”,也不会试图纠正已经发生的问题和错误。

     

    3. 可屏蔽中断

    相对于非屏蔽中断来说,可屏蔽中断(INTR)就没有那么“致命”了,可能会非常紧急,但不会那么恐怖,动不动就死机崩溃什么的。

     

    可屏蔽中断有两个特点:

    1.数量很多,毕竟有很多外部设备。

    2.可以被屏蔽,也就是说处理器可以不处理中断。

    可屏蔽中断通过INTR引脚进入处理器内部,处理器每次只能处理一个中断,在这种情况下,需要一个代理,来接受外部设备发出的中断信号。另外多个设备同时发出中断请求的几率也是很高的,所以该代理的任务还包括对这些中断进行仲裁,以决定让它们中的哪一个优先向处理器提出服务请求。

    在个人计算机中,用得最多的中断代理就是8259芯片,Inter处理器允许256个中断,中断号的范围是0~255,8259负责提供其中的15个,但中断号并不固定,可以根据程序员设置,以防止发生冲突。

    当然,我们也把上图中的这种芯片叫做:可编程中断控制器(Programmable Interrupt Controller.  PIC)。

    在以前的一些个人PC中就使用了两块8259芯片,并且把这两块芯片进行了“连接在一起”,一块芯片可以反馈8个中断号,两块芯片接在一起,就可以管理15个中断号。在当时,接在8259上的15个设备都是相当重要的,如键盘和鼠标、串行口、并行口、软磁盘驱动器、 IDE 硬盘等。这些中断引脚可以被其他设备使用,我们可以从上图看到,8259的片引脚0(IR0)接的是系统定时器/计数器芯片,从片的引脚0(IR0)接的是实时时钟芯片(RTC)。

     

    另外,在8259芯片内部还有一个中断屏蔽寄存器(Interrupt Mask Regidter. IMR),IMR是一个8位的寄存器,每个比特位对应着8个芯片的8个输入。

    当外部设备通过某个引脚发来一个中断请求信号时,如果它没有被IMR阻断(0表示通过,1表示拦截),那么,这个中断信号就会被送到CPU内部。注意:8259芯片是可以编程的,主片的端口号是:0x20和0x21,从片的端口号是:0xa0和0xa1,可以通过这些端口访问8259芯片,设置它的工作方式,包括IMR的内容。

    但中断信号即使进入了CPU内部,在CPU内部有一个标志寄存器,叫做IF,这就是中断标志位。(Interrupt Flag)。当IF=0的时候,所有从处理器INTR引脚进来的中断信号都会被忽略掉。当IF=1的时候,处理器可以接受和响应中断。

    也就是说,当NMI(非屏蔽中断)发来中断信号时,CPU立即无条件(不执行中断响应周期,不受标志寄存器IF位的影响)地转入"2号中断处理程序"。当INTR(可屏蔽中断)发来中断信号时,若IF=0,CPU不响应中断请求。若IF=1,CPU响应中断请求。

    修改IF标志位可以通过cli和sti这两条指令:

    cli=IF=0
    sti=IF=1

    在计算机内部,中断发生得非常频繁,当一个中断正在处理时,其他中断也会陆续到来,甚至多个中断同时发生的情况,这都无法预料。但8259芯片会记住它们,并按照一定的策略决定先为谁服务。中断的优先级和引脚是相关的,主片的IR0引脚优先级最高,IR7引脚最低,从片也是如此,也就是说,当IR0和IR7都有一个中断发送给处理器时,那么IR0的中断会优先处理。

     

    4. 中断处理

    处理器收到中断信号以后,就要进行处理,当然有些中断信号是可以忽略的,8259主片和从片,合起来提供15种类型中断号。

    8086处理器最多支持256个中断号,那么理论上就可以设置256段中断程序。在实模式下,处理器要求将它们的入口点集中存放到内存中从物理地址0x00000开始,到0x003FF结束,共1KB内存。

    每一个中断处理程序必须有一个段地址和偏移地址才能进行准确物理地址定位,这个就是一个中断向量表。当中断发生后,处理器执行完当前的指令后,会立即着手为硬件服务。处理器首先会响应中断,告诉8259芯片准备着手处理该中断,接下来,CPU告诉8259芯片,把中断号送过来。

    8259芯片中的每个引脚都对应着一个中断号。当然因为8259芯片是可以编程的,可以修改每个引脚对应的中断号,但不能任意修改。比如设置主片的中断号从0x08开始,那么引脚IR0~IR7所对应的中断号分别是:0x08 ~ 0x0E。

     

    当有中断信号到来时,8259芯片会告诉CPU对应的中断号。处理器拿到这个中断号,会做以下几件事情:

    1. 保护断点的现场。首先要将标志寄存器 FLAGS 压栈,然后清除它的 IF 位和 TF 位,TF是陷阱标志,这个以后再讲。接着,再将当前的代码段寄存器 CS 和指令指针寄存器 IP 压栈。

    2. 执行中断处理程序。由于处理器已经拿到了中断号,它将该号码乘以 4(毕竟每个中断在中断向量表中占 4 字节),就得到了该中断入口点在中断向量表中的偏移地址。接着从表中依次取出中断程序的偏移地址和段地址,并分别传送到 IP 和 CS,然后处理器就开始执行中断处理程序了。

    注意:由于IF标志被清除,IF=0,在中断处理过程中,处理器将不再响应硬件中断,如果希望这期间处理优先级高的中断嵌套,可以在编写中断处理程序时,适时用sti指令开放中断。

    3. 返回到断点接着执行。所有中断处理程序的最后一条指令必须是中断返回指令 iret。这将导致处理器依次从栈中弹出(恢复) IP、 CS 和 FLAGS 的原始内容,于是转到主程序接着执行。

     

    对于上面的几件事情,我们可以用伪代码来表示:

    取得中断向量:
    push f			;把flag标志寄存器压栈
    TF=0,IF=0       ;清除IF位和TF位
    push CS			;把CS,IP压栈,保护现场
    push IP
    IP=N*4			;处理中断程序
    jmp far 0x0000:IP 
    1.保存用到的寄存器
    2.处理中断
    3.恢复用到的寄存器
    4.iret			;iret恢复现场

     

    iret指令的功能可以它做了以下的事情:

    pop IP
    pop CS
    popf

    和可屏蔽中断不同, NMI发生时,处理器不会从外部获得中断号,它自动生成中断号码2,其他处理过程和可屏蔽中断相同。 中断随时可能发生,中断向量表的建立和初始化工作是由BIOS在计算机启动时负责完成的。 BIOS为每个中断号填写入口地址,因为它不知道多数中断处理程序的位置,所以,一律将它们指向一个相同的入口地址,在那里,只有一条指令:iret(Interrupt Return )。

    也就是说,当这些中断发生时,只做一件事,那就是立即返回。当计算机启动后,操作系统和用户程序再根据自己的需要,来修改某些中断的入口地址,使它指向自己的代码。

     

    5. 内部中断

    和硬件中断不同,内部中断发生在处理器内部,是由执行的指令引发的,例如,处理器检测到div或者idiv指令的除数为零时,或者除法的结果溢出,将产生中断0(0号中断),这就是除法中断,当然处理器内部中断还有有:单步中断,断点中断等等...... 并且,内部中断不受标志寄存器IF位的影响。

    再比如,当处理器遇到非法指令时,将产生中断 6。非法指令是指指令的操作码没有定义,或者指令超过了规定的长度。操作码没有定义通常意味着那不是一条指令,而是普通的数。内部中断不受标志寄存器 IF 位的影响,它们的中断类型是固定的,可以立即转入相应的处理过程。

     

    6. 软中断

    还有一种中断,叫做软中断,软中断是由程序员自己触发,使用int指令可以触发,int指令的格式如下:

    int3
    int imm8
    into

    int3是断点中断指令,机器指令为CC。这条指令在调试程序的时候很有用,当程序运行不正常时,多数时候希望在某个地方停下来(设置一个检查点),也称断点,这条指令就是用来做这件事的。需要注意的是int3和int 3是不同的指令,当然,最有名的软中断是BIOS中断,因为BIOS中断功能是在计算机加电之后,BIOS程序执行期间建立起来的,主要是为了访问基本硬件功能,关于BIOS中断大家可以参考书籍——《x86汇编语言:从实模式到保护模式》。

    展开全文
  • 单片机中断

    2012-03-21 10:38:40
    1。单片机有个中断入口地址,...要执行中断里面代码必须程序指针指到中断代码,一是通过触发中断,二是手动改变PC指针(汇编直接jmp指令跳转.C由于编译器限制比较难实现,可以嵌入汇编实现)(void)interr

    1。单片机有个中断入口地址,产生中断后CPU自动从中断向量取得入口地址,然后从这个地址执行程序 。如果你用汇编写代码,你会发现main函数其实也是一个中断函数,是个复位中断,和其它中断不同处是main没有返回。要执行中断里面的代码必须让程序指针指到中断里的代码,一是通过触发中断,二是手动改变PC指针(汇编直接用jmp指令跳转.C由于编译器的限制比较难实现,可以嵌入汇编实现)(void)interrupt n(using m)函数是个中断函数,当这个中断产生后,CPU就会通过中断向量找到这个函数的地址(中断入口),然后执行此函数,结束后返回主函数。8051的中断系统包括5个中断源,并提供两个优先级,允许用户对中断源进行独立控制和中断优先级设置


    2。8051支持的5个中断源分别为外部中断0、定时器0溢出中断、外部中断1、定时器1溢出中断和串口中断。对应的中断号为0、1、2、3、4;寄存器有4个工作组可以切换,为0-3; C51中,中断服务程序是以中断函数的方式来时实现的。中断函数格式如下:void 函数名() interrupt 中断号 using 工作组{ 中断服务程序内容;} 


    3。中断的函数名师自己定义的,但是必须在后面加入关键字“interrupt x”,其中“x”是中断向量的编号(中断向量号对应的中断查看任何一本讲解51的书),主函数中不需要写什么语句来跳转到中断函数,因为你定义好中断向量号时,就是定义好了中断的入口地址,因为单片机响应中断是在执行程序的过程中,每个周期都会扫描中断标志位,来判断执行什么中断,比如定时器的定时到了,那么硬件就会自动将对应定时中断标志置为1,此时CPU扫描到这个中断标志为1时,就会自动跳到你定义好的中断函数执行。

    展开全文
  • 我在设计一个状态机,函数表示每种状态,每个函数都会返回一个指向下一个状态函数指针。可我找不到任何方法来声明这样函数——感觉我需要一个返回指针函数,返回的指针指向又是返回指针函数……,如此...
  • 汇编指令(chm格式)

    热门讨论 2009-05-31 20:58:52
    五、程序转移指令 ─────────────────────────────────────── 1>无条件转移指令 (长转移) JMP 无条件转移指令 CALL 过程调用 RET/RETF过程返回. 2>条件转移指令 ...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    我在设计一个状态机,函数表示每种状态,每个函数都会返回一个指向下一个状态函数指针。可我找不到任何方法来声明这样函数——感觉我需要一个返回指针函数,返回的指针指向又是返回指针函数……,如此...
  • 我在设计一个状态机,函数表示每种状态,每个函数都会返回一个指向下一个状态函数指针。可我找不到任何方法来声明这样函数——感觉我需要一个返回指针函数,返回的指针指向又是返回指针函数……,如此...
  • 我在设计一个状态机,函数表示每种状态,每个函数都会返回一个指向下一个状态函数指针。可我找不到任何方法来声明这样函数——感觉我需要一个返回指针函数,返回的指针指向又是返回指针函数……,如此...
  • 我在设计一个状态机,函数表示每种状态,每个函数都会返回一个指向下一个状态函数指针。可我找不到任何方法来声明这样函数——感觉我需要一个返回指针函数,返回的指针指向又是返回指针函数……,如此...
  • 我在设计一个状态机,函数表示每种状态,每个函数都会返回一个指向下一个状态函数指针。可我找不到任何方法来声明这样函数——感觉我需要一个返回指针函数,返回的指针指向又是返回指针函数……,如此...
  • 必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    当我向p[i] 赋值时候, 我的程序崩溃了。. . . . 5 1.14 我总算弄清除函数指针声明方法了, 但怎样才能初始化呢? . . 5 2 结构、联合和枚举7 2.1 声明struct x1 f . . . g; 和typedef struct f . . . g x2; 有...
  • 修改核心支持库,解决“播放音乐()”播放“音频采样大小为24位”WAV文件时产生噪音BUG。 4. 修改编译器,可以为编译出EXE、DLL添加版本信息(通过“程序配置”设定)。 5. 修改集成开发环境,自动记忆非...
  • Proteus仿真—40个单片机初学程序.

    热门讨论 2009-04-13 13:00:56
    延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的...
  • NEC芯片特别说明

    2017-04-26 16:45:00
    NEC芯片注意点: 1、堆栈和RAM共用,而且是程序中自定义堆栈空间,堆栈是向下递减堆栈。...4、如果对中断服务程序中断返回用RET而不是RETI,会导致不再进行中断,但是主程序是正常。 转载于:https://ww...

    NEC芯片注意点:

    1、堆栈和RAM共用,而且是程序中自定义堆栈的空间,堆栈是向下递减堆栈。

    2、中断中标志位的清除可以不用手动清除,在中断服务程序中运行任何一条指令后自动清除。

    3、中断服务程序有且仅有对PSW和PC自动进行压入栈,所以对A寄存器必须手动压栈和出栈

    4、如果对中断服务程序中断返回用RET而不是RETI,会导致不再进行中断,但是主程序是正常的。

    转载于:https://www.cnblogs.com/smileintheday/p/6769399.html

    展开全文
  • 求助各大虾,本人最近AVR单片机与一模块相连,每发送一条指令,模块返回不明长度字符串若干,程序的下一步必须判断这些字符串代表的意义.我了一个中断子程序来接收返回字符,但是不知怎样才算接收完毕再执行下一条...
  • 为了在中断处理结束后能够使进程准确地返回中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等值。(2)分析中断原因,转去执行相应的中断处理程序。在多个中断请求同时发生时,处理优先级最高的中断...
  • 堆栈:堆栈是C语言程序运行时必须使用几率函数条路径和参数存储空间,具体作用分为:记录函数条用的框架,传递函数参数,保存返回的地址,提供函数内部局部变量存储空间等。 esp:是栈指针,是cpu机制决定...
  • 单片机期末考试题目及答案详解

    热门讨论 2009-06-23 10:30:30
    执行中断返回指令,要从堆栈弹出断点地址,以便去执行被中断程序。从堆栈弹出断点地址送给 A.A B.CY C.PC D.DPTR 16.中断查询确认后,在下列各种单片机运行情况中,能立即进行响应是 A.当前指令...
  • ARMC处理器请看我转载的那篇文档。 ARM寄存器如下图所示:  描述: ...1.无论处于什么工作模式下,R0~R7都会被使用...3.R14有两点作用:通过BL或者BLX指令调用子程序时存放当前的子程序的返回地址、在发生异常时
  • 随着程序功能的增加和版本的提高,程序越来越复杂,源文件也越来越多,风格规范的源程序会对软件的升级、修改和维护带来极大的方便,要想开发一个成熟的软件产品,必须在编写源程序的时候就有条不紊,细致严谨。...
  • COP2000.zip

    2019-09-16 22:33:43
    很多实验机还不支持子程序调用、返回指令 CALL、RET。我们知道在调用子程序时涉及到压栈、退栈概念,这在 COP2000 实验仪中可从微程序层面上十分形象观察整个执行过程。  完善寻址方式 累加器寻址:如 CPL ...
  • 9、仿真开发系统调试程序时,汇编成功只说明源程序的( )没有问题,而程序( )还要靠运行调试纠错才能成功。 10、单片机串行通信时,若要发送数据,就必须将要发送的数据送至( )单元,若要接收数据也要到该...
  • 易于理解和使用操作界面,接受用户的指令、代替用户完成某些复杂繁琐工作、或为用户 提供帮助。科学研究表明:从人机工程角度考虑,赋予电脑或程序更多人性化色彩,如支持 语音合成输出信息、语音识别输入...
  • 程序 取汇编指令长度, 整数型, 公开, 返回指定进程指定地址处首条汇编指令的长度。注:计算方法使用是LDX32 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 指令地址,如Hex2Dec("00401000") .子程序 ...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    答:汇编语言是一种文字助记符来表示机器指令的符号语言,是最接近机器码一种语言。其主要优点是占用资源少、程序执行效率高。但是不同CPU,其汇编语言可能有所差异,所以不易移植。 C语言是一种结构化...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

中断程序的返回指令必须用