8086执行那些指令后,可以改变指令指针寄存器IP的内容
严格的说,每条指令执行完后IP的内容都会由当前指令的地址改变到下一条指令,不过你的意思应该是指:不是代码清单里紧挨着的那条指令,而是有个跳转变化吧?那样的指令有:JMP, CALL, RET, JZ,JNZ,JL,JNL(等一系列的比较指令),INT,iRet(中断调用、返回),LOOP循环指令,常见的是这些,是否还有些冷僻的要去查查指令表了
8086汇编语言考试题目;若sp的初值为2000h,执行IRET指令后,sp...
中断类型码:,其实就是中断号,对不同的中断服务程序不同的名称记号,以调用该中断程序.中断向量:指向中断服务程序的入口地址.一个向量代表的入口地址为4个字节.中断向量表:由于存在多个中断请求,相应有多个中断服务程序,即有多个存放这些程序的入口地址(即中断向量).为此系统在内存的特定区域安排一张中断向量表,专门存放所有的中断向量.此表即中断向量表.以上三者关系:中断向量=[中断号X4], 其中方括号的含义是内存单元的内容.(即中断向量表刚好存放在内存绝对地址0开始的位置)
操作系统的中断功能是怎么一回事?
操作系统对中断信号处理的实现。
操作系统对中断信号的处理实际是对硬件中断的一种模拟, 所以在在讨论这个问题之前, 先了解一下8086计算机硬件中断的原理。
以下内容是google出来的, 出处我就不说了, 反正类似的内容多的是。
CPU在INTR引脚上接到一个中断请求信号,如果此时IF=1,CPU就会在当前指令执行完以后开始响应外部的中断请求,这时,CPU在INTA引脚连续发两个负脉冲,外设在接到第二个负脉冲以后,在数据线上发送中断类型码,接到这个中断类型码后,CPU做如下动作:1)将中断类型码放入暂存器保存;2)将标志寄存器内容压入堆栈,以保护中断时的状态;3)将IF和TF标志清0。
目的是防止在中断响应的同时又来别的中断,而将TF清0是为了防止CPU以单步方式执行中断处理子程序。
这时要特别提醒,因为CPU在中断响应时自动关闭了IF标志,因此用户如要进行中断嵌套时,必须在自己的中断处理子程序中用开中断指令来重新设置IF;4)保护断点。
断点指的是在响应中断时,主程序当前指令下面的一条指令的地址。
保护断点就是将当前的IP和CS的内容入栈,为了以后正确地返回主程序;5)根据取到的中断类型码,在中断向量表中找出相应的中断向量,将其装入IP和CS,即呆自动转向中断服务子程序。
对NMI进入的中断请求,由于其类型码固定为2,因此CPU不用从外设读取类型码,也不需计算中断向量表的地址,只要将中断向量表中0000:0008H~0000:000BH单元内容分别装入IP和CS即可。
关于的几点说明:1)8086/8088除软件中断外,内部“非屏蔽中断”、“可屏蔽中断”均设立有优先级,其中内中(除单步外)――即0、1、3、4号中断的优先级高于非屏蔽中断,非屏蔽中断高于可屏蔽中断,单步中断优先级最低;2)只有在可屏蔽中断的情况下才判IF=1?,才取中断类型码,其余的没有这个动作。
3)关于单步中断,它是每执行一条指令中断一次,显示出当时各寄存器的内容,供用户参考,当进入单步中断响应时,CPU自动清除了TF,在中断返回后,由于恢复了响应时的标志寄存器的值,因此TF=1,执行完一条指令后又进入单步中断,直到程序将TF改为0为止。
4)关于中断的嵌套,NMI总是可以响应的,若在中断处理子程序中设立了开中断指令,INTR的请求也能响应。
5)弹出IP、CS、标志,返回断点的动作由IRET指令完成。
6)当遇到等待指令或串操作指令时,允许在指令执行的过程中进入中断。
这时需注意在中断处理子程序中保护现场,以保证中断返回后能继续正确地执行这些指令。
扯了那么多8086的东西, 该说说正题了。
操作系统在从内核态返回用户态之前(系统可能是一个系统调用, 也可能是一个时钟中断而导致进入内核模式), 将检查是否有需要的投递的信号。
一旦检测到需要信号投递时, 内核将改变用户空间的数据(跟调用exec类似, 系统会改变用户空间的数据)。
建立一个新的栈桢。
当返回到用户空间的时候, IP指向的将是新的栈, 所以执行的下一个指令将是信号处理函数(signal_handler)。
当信号出来函数返回时, 执行的将是sigreturn, 所以系统将重新进入内核模式。
这个时候系统将把栈清除。
恢复原来的IP值, 当重新再次返回用户模式的时候, 程序就像什么都没有发生一样继续往下执行。
因为上下文是保存在用户空间, 并且是以链的形式保存, 所以信号出来的递归是没有问题的。
信号处理函数sigreturn返回一次将执行一次类似弹栈操作, 直到栈为空为止。
对于系统调用的自动重启, 只要把IP恢复为执行前一条指令, 那么系统调用自然自动被再次调用。
不过由于带有超时参数的函数在执行signal_handler的时候会费掉时间, 再次进入系统调用将造成不必要的麻烦(两义性), 所以对于这类函数是不会自动重启的。
操作系统系统在中断响应和中断处理中做了哪些处理
操作系统对中断信号的处理实际是对硬件中断的一种模拟, CPU在INTR引脚上接到一个中断请求信号,如果此时IF=1,CPU就会在当前指令执行完以后开始响应外部的中断请求,这时,CPU在INTA引脚连续发两个负脉冲,外设在接到第二个负脉冲以后,在数据线上发送中断类型码,接到这个中断类型码后,CPU做如下动作: 1)将中断类型码放入暂存器保存; 2)将标志寄存器内容压入堆栈,以保护中断时的状态; 3)将IF和TF标志清0。
目的是防止在中断响应的同时又来别的中断,而将TF清0是为了防止CPU以单步方式执行中断处理子程序。
这时要特别提醒,因为CPU在中断响应时自动关闭了IF标志,因此用户如要进行中断嵌套时,必须在自己的中断处理子程序中用开中断指令来重新设置IF; 4)保护断点。
断点指的是在响应中断时,主程序当前指令下面的一条指令的地址。
保护断点就是将当前的IP和CS的内容入栈,为了以后正确地返回主程序; 5)根据取到的中断类型码,在中断向量表中找出相应的中断向量,将其装入IP和CS,即呆自动转向中断服务子程序。
对NMI进入的中断请求,由于其类型码固定为2,因此CPU不用从外设读取类型码,也不需计算中断向量表的地址,只要将中断向量表中0000:0008H~0000:000BH单元内容分别装入IP和CS即可。
关于 的几点说明:1)8086/8088除软件中断外,内部“非屏蔽中断”、“可屏蔽中断”均设立有优先级,其中内中(除单步外)――即0、1、3、4号中断的优先级高于非屏蔽中断,非屏蔽中断高于可屏蔽中断,单步中断优先级最低;2)只有在可屏蔽中断的情况下才判IF=1?,才取中断类型码,其余的没有这个动作。
3)关于单步中断,它是每执行一条指令中断一次,显示出当时各寄存器的内容,供用户参考,当进入单步中断响应时,CPU自动清除了TF,在中断返回后,由于恢复了响应时的标志寄存器的值,因此TF=1,执行完一条指令后又进入单步中断,直到程序将TF改为0为止。
4)关于中断的嵌套,NMI总是可以响应的,若在中断处理子程序中设立了开中断指令,INTR的请求也能响应。
5)弹出IP、CS、标志,返回断点的动作由IRET指令完成。
6)当遇到等待指令或串操作指令时,允许在指令执行的过程中进入中断。
这时需注意在中断处理子程序中保护现场,以保证中断返回后能继续正确地执行这些指令。
...
bios在哪个阶段建立中断向量表
这个标号便是表格中的“行号”,只不过,每一行是两列,CPU会将当前正在执行的程序挂起来,这一机制类似于中断向量表,只不过中断向量换成了选择子。
这样的中断机制对不同型号的CPU有略微的差别,我不信你学汇编的书上不讲,我大概讲一下,包括了该中断的处理程序的段基址和偏移量,比方说是5号,中断向量表项为0000:000A,每4字节为一个表项,然后转到AAAA:BBBB处去执行一直到iret指令返回原任务(或许该中断结束了这个任务,就不会返回了)。
至于保护模式的中断,相信你暂时还没遇到。
到后面还有操控8259A芯片来实现高级中断的,这里不细说了,我自己也没全弄明白。
二、中断实现的方式(8086下的普通中断)听说过“优先级编码器”没?——如果同时有两个信号被接收:BBBB,那么它会将当前的CS/IP、Flags寄存器入栈,得到了标号。
这么说不知道你懂不懂。
;具体的中断服务程序。
。
反正总结一下你的问题吧,中断服务程序是加载到内存中的,读取这个内存,得到中断程序入口地址比方说是AAAA:0000开始的,系统会将其解释为一个标号,比如int9h、int21h等等,会指定某一个信号的优先级高您好,不是单片机一、汇编语言的中断分以下几种,在DOS系统被加载后,系统会延用BIOS的中断向量,它在加载前可能是存在BIOS芯片上,先执行它。
中断就是类似的处理方法。
当CPU获取到某一高操作优先级的信号时(比如时钟;比如键盘响应,用户希望通过Ctrl+C来退出任何正在执行的DOS程序)。
处理中断时:1,每固定时间就会触发一次:CPU的INTR引脚获得了中断信号.BIOS中断,这是固化到BIOS程序中的,每次开机BIOS会自动加载到指定内存2.186下的DOS中断。
中断向量表是从0000。
中断标号x4就是对应的中断向量表项所存的地址,高地址是基地址,低地址是偏移,并向里面添加一些新的向量,这些功能便是DOS系统自带的中断服务程序3.286及以上的系统中断,PC会进入保护模式,在OS被加载后,中断由IDT控制,也可能是存在硬盘里的;中断向量表里只能写上中断处理程序的入口地址,要知道每个表项只有4字节,转而去处理该信号(类似于Call,但略有不同,你看的书应该会讲到)。
这个标号是一个序号,在内存某处存放着连续的一个表格,我猜你问的是PC的 展开
从cpu的intr引脚产生的中断叫什么中断
操作系统对中断信号的处理实际是对硬件中断的一种模拟, CPU在INTR引脚上接到一个中断请求信号,如果此时IF=1,CPU就会在当前指令执行完以后开始响应外部的中断请求,这时,CPU在INTA引脚连续发两个负脉冲,外设在接到第二个负脉冲以后,在数据线上发送中断类型码,接到这个中断类型码后,CPU做如下动作: 1)将中断类型码放入暂存器保存; 2)将标志寄存器内容压入堆栈,以保护中断时的状态; 3)将IF和TF标志清0。
目的是防止在中断响应的同时又来别的中断,而将TF清0是为了防止CPU以单步方式执行中断处理子程序。
这时要特别提醒,因为CPU在中断响应时自动关闭了IF标志,因此用户如要进行中断嵌套时,必须在自己的中断处理子程序中用开中断指令来重新设置IF; 4)保护断点。
断点指的是在响应中断时,主程序当前指令下面的一条指令的地址。
保护断点就是将当前的IP和CS的内容入栈,为了以后正确地返回主程序; 5)根据取到的中断类型码,在中断向量表中找出相应的中断向量,将其装入IP和CS,即呆自动转向中断服务子程序。
对NMI进入的中断请求,由于其类型码固定为2,因此CPU不用从外设读取类型码,也不需计算中断向量表的地址,只要将中断向量表中0000:0008H~0000:000BH单元内容分别装入IP和CS即可。
关于 的几点说明: 1)8086/8088除软件中断外,内部“非屏蔽中断”、“可屏蔽中断”均设立有优先级,其中内中(除单步外)――即0、1、3、4号中断的优先级高于非屏蔽中断,非屏蔽中断高于可屏蔽中断,单步中断优先级最低; 2)只有在可屏蔽中断的情况下才判IF=1?,才取中断类型码,其余的没有这个动作。
3)关于单步中断,它是每执行一条指令中断一次,显示出当时各寄存器的内容,供用户参考,当进入单步中断响应时,CPU自动清除了TF,在中断返回后,由于恢复了响应时的标志寄存器的值,因此TF=1,执行完一条指令后又进入单步中断,直到程序将TF改为0为止。
4)关于中断的嵌套,NMI总是可以响应的,若在中断处理子程序中设立了开中断指令,INTR的请求也能响应。
5)弹出IP、CS、标志,返回断点的动作由IRET指令完成。
6)当遇到等待指令或串操作指令时,允许在指令执行的过程中进入中断。
这时需注意在中断处理子程序中保护现场,以保证中断返回后能继续正确地执行这些指令。
扯了那么多8086的东西, 该说说正题了。
操作系统在从内核态返回用户态之前(系统可能是一个系统调用, 也可能是一个时钟中断而导致进入内核模式), 将检查是否有需要的投递的信号。
一旦检测到需要信号投递时, 内核将改变用户空间的数据(跟调用exec类似, 系统会改变用户空间的数据)。
建立一个新的栈桢。
当返回到用户空间的时候, IP指向的将是新的栈, 所以执行的下一个指令将是信号处理函数(signal_handler)。
当信号出来函数返回时, 执行的将是sigreturn, 所以系统将重新进入内核模式。
这个时候系统将把栈清除。
恢复原来的IP值, 当重新再次返回用户模式的时候, 程序就像什么都没有发生一样继续往下执行。
因为上下文是保存在用户空间, 并且是以链的形式保存, 所以信号出来的递归是没有问题的。
信号处理函数sigreturn返回一次将执行一次类似弹栈操作, 直到栈为空为止。
对于系统调用的自动重启, 只要把IP恢复为执行前一条指令, 那么系统调用自然自动被再次调用。
不过由于带有超时参数的函数在执行signal_handler的时候会费掉时间, 再次进入系统调用将造成不必要的麻烦(两义性), 所以对于这类函数是不会自动重启的。
1 回答者: 15801485131
在8386CPU中指令RET与IRET的主要区别是什么?
中断由异步的外部事件引起。
外部事件及中断响应与正在执行的指令不存在关系。
80386有两根引脚INTR和NMI接受外部中断请求信号,INTR接受可屏蔽中断请求。
在80386中,标志寄存器EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。
处理器必须接受和处理来自NMI的中断请求。
在80386系统中,处理器在响应NMI的中断向量号固定为2。
为了避免不可屏蔽中断的嵌套,当接受到一个NMI中断请求时,处理器自动屏蔽所有的NMI的中断请求,直到执行中断指令IRET后才重新开放NMI中断请求,所以,NMI处理程序应以IRET指令结束...
转载请注明出处51数据库 » 执行8086的iret中断返回指令后将从