1. 8088获得中断向量后,如何获取中断服务程序入口
还用这么老的?!早没有了吧
我记得中断程序入口在0地址开始处按顺序排列,中断号乘以4就是它地址存储处
2. 只知道中断类型 怎么就能求出中断服务入口地址 中断类型乘4不是中断向量的地址吗又不是中断向量///
8086系统在存储器的最低1KB区域(00000H~003FFH)建立一个中断向量表,存放256个中断类型的中断向量。
这1024个单元被分成256组,每组包括4个字节单元,存储一个中断向量的段基址和段内偏移地址,高2个字节用于存放段基址,低两个字节用于存放段内偏移地址。
在执行某一条INT n指令时,CPU首先对断点和现场进行保护,然后将中断指令中的中断类型号n乘以4,得到一个地址,这个地址就是n号中断服务子程序的入口地址在中断向量表中的存放地址。
按照这个地址,取出连续4个字节单元的内容,即n号中断服务子程序入口的段基址(2个字节)和偏移地址(2个字节),送入CS和IP,以实现n号中断调用。
8086/8088有20条地址线,它的直接寻址能力为1MB。也就是在一个系统中可以有多达1MB的存储器,地址从00000H—FFFFFH。给定任意一个20位物理地址,就可以从中取出需要的指令和操作数。但是8086/8088CPU只能进行16位运算。
与地址有关的寄存器SP、IP、BP、SI、DI也都是16位的,所以对地址的运算也只能是16位的。对于8086/8088来说,无论采用哪种寻址方式,寻找操作数的范围最大是2^16。
系统先将1MB存储器以64KB为范围分成若干段。在寻址一个具体物理地址时,由一个基本地址再加上由SP或IP等可由CPU处理的16位偏移量来形成20位物理地址。
3. 在PC机中,CPU响应中断后是如何找到中断服务子程序入口地址的
cpu在响应中断前会保护主程序当前指令下面的一条指令的地址。就是将当前的IP和CS的内容入堆栈。cpu响应中断之后,将指令地址从堆栈中取出即可找到中断服务子程序入口地址。
CPU响应中断做如下动作:
①将中断类型码放入暂存器保存;
②将标志寄存器内容压入堆栈,以保护中断时的状态;
③将IF和TF标志清0,目的是防止在中断响应的同时又来别的中断,而将TF清0是为了防止CPU以单步方式执行中断处理子程序。这时要特别提醒,因为CPU在中断响应时自动关闭了IF标志,因此用户如要进行中断嵌套时,必须在自己的中断处理子程序中用开中断指令来重新设置IF;
④保护断点,断点指的是在响应中断时,主程序当前指令下面的一条指令的地址。因此保护断点的动作就是将当前的IP和CS的内容入栈,保护断点是为了以后正确地返回主程序;
⑤根据取到的中断类型码,在中断向量表中找出相应的中断向量,将其装入IP和CS,即呆自动转向中断服务子程序。
4. 如何将中断服务程序的入口地址写入中断向量表
有两种基本方法:一是直接写入法,使用指令将中断服务程序入口地址的IP写入n×4的RAM位置,中断服务程序入口的CS写入n×4+2的位置;二是DOS功能调用,25H用来写中断向量表,35H读中断向量表。
5. 单片机80196KC CPU怎么找到中断服务程序的入口地址
内存中有固定的一段内存,存放中断向量。程序按照优先级将相应服务程序入口地址依次存放在此。中断发生后,CPU自动保存现场,到相应位置取出服务程序的入口地址,并执行之。执行完,返回中断处,继续运行。
6. 什么是中断服务程序的入口
中断服务程序,处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序。
比如有3个仓库,仓库号分别是111、222、333,对应的钥匙是111、222、333。
在111仓库有大米、222仓库储存的是高级跑车、333仓库储存的是美酒。
某一天,
你正在与朋友逛街(正在执行的程序);
这时你有钱的老爸让你去222仓库(中断的入口)把车开到他面前(中断命令);
你要听你爸爸的话(执行中断);
找到仓库222(中断入口),其他的入口111、333都没有跑车;
把车开到你爸爸面前,接着和朋友逛街;
7. ARM中的异常中断是如何实现进入中断程序的,比如如何进入...
ARM中的异常中断是如何实现进入中断程序的,比如如何进入...
swi(0x00) void SwiHandle1(int Handle);其实没有函数体,执行这个语句后就自动把Handle的值赋给了R0,接着执行下面的代码。__swi(0x00)是软件中断,0为软中断指令中的24位立即数,但是通过R0寄存器来传递参数具体的函数体,当然是要在swi的中断处理程序中去找了可以在复位时的异常向量表里面找到swi中断服务程序的入口地址。
SWI 执行的流程是,先进入异常中断向量表,然后跳到向量地址处,接着一小段汇编操作,把功能号读入到一个寄存器中,然后 switch 判断这个功能号是多少,接着跳转到对应的终端服务程序,如果函数有参数,则根据ATPCS规则进行参数的传递;如只有一个参数,则用 R0 来传递,超过4个参数,超出的部分用堆栈来传递。
__swi是ADS编译器的关键字,用它做前缀可以声明一个软中断调用,格式为:
__swi(功能号) 返回值 名称 (参数列表)
功能号:即软中断指令中的24位立即数,软中断号
名 称:即调用软中断时用于描述软中断的函数名称
参 数:软中断函数的参数,根据ATPCS规则,如果软中断函数有不超过4个参数时,通过R0~R3传递,超过4个参数时用堆栈来传递。
__swi(0x00) void SwiHandle1(int Handle)。其中0x00为软中断功能号(软中断号);软中断函数名称为SwiHandle1;只有一个参数,则使用R0来传递;函数没有返回值。紧接着这句代码的是定义了4个宏,分别表示禁能IRQ函数、使能IRQ函数、禁能FIQ函数、使能IFQ函数,其实调用的软中断函数是一样的,只是参数不同而已。例如在用户程序中调用“IRQEnable( );”时,处理器会产生软中断。位于启动代码中的那些是软中断处理函数,当发生软中断时,PC被强制指向0x00000008,这个地址中存放的是软中断异常的处理函数的地址,所以程序会跳转至标号“SoftwareInterrupt ”处执行。SoftwareInterrupt 函数的功能是判断R0的值(R0的值为软中断函数传递过来的参数)是否小于4,如果小于4则跳转至标号“SwiFunction”执行,如果不是则函数返回。SwiFunction函数是一个散转函数,它的功能是根据R0的值跳转至对应的函数处执行,即如果参数为1,则函数会跳转至IRQEnable处执行,将IRQ中断使能。
本文件SWI.s位于ARM Executable Image for LPC2294工程模板中,故不考虑SWI触发前为Thumb态;SWI异常一旦触发,内核硬件完成:
♂ 进入Supervisor模式;
♂ 拷贝CPSR至SPSR_svc
♂ 拷贝异常返回地址至LR_svc
♂ 将0x00000008装入PC
因此,当触发SWI软中断前内核处于Supervisor模式,SPSR_svc、LR_svc中的值将被破坏;
3、SWI指令编码中自带24bit数据作为软中断号(swi_num),因此可通过取SWI指令编码获取软中断号;LDR r0,[lr,#-4]就是这样;
4、SWI_Exception_Function函数一般采用C编码(也可汇编),采用C编码可直接套用switch根据swi_nun软中断号切换,SWI_Exception_Function函数的编制是灵活的,比如可以为带参或不带参函数;
5、一个SWI调用允许带1~4个字型参数和1~4个字型返回值,触发SWI调用时四个参数依次保存在R0~R3中,返回值也......
8. 中断向量表和中断描述符表的功能是什么如何利用它们获得中断服务程序的入口地址
中断向量表是存放一系列中断向量的表(好像有点废话...不过确实是这样)
中断向量代表着中断服务程序的入口地址
中断描述符用最通俗的语言来讲就是用来获取中断向量用的,为什么要获取中断向量呢?就是要通过中断向量知道中断服务程序的入口地址.三者的关系应该明了了吧...
引用楼上的例子INT 21H 这里21H就是一个中断描述符
21H*4 =84H 得到的就是中断向量(就是这么规定的)
以84H为首地址(85H 86H 87H) 其中存放的就是中断服务程序的地址
还是举个例子吧
87H 33
86H 22
85H 11
84H 00
那么中断服务程序的入口地址就是 (CS:IP)3322:1100
9. CPU是如何根据中断类型码找到相应的中断服务程序入口地址的
cpu在响应中断前会保护主程序当前指令下面的一条指令的地址。就是将当前的IP和CS的内容入堆栈。cpu响应中断之后,将指令地址从堆栈中取出即可找到中断服务子程序入口地址。CPU响应中断做如下动作: ①将中断类型码放入暂存器保存;
10. 8086cpu如何通过中断码寻找中断服务程序入口的
系统是把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。
至于这个中断向量表的区域从哪里开始,是由CPU的寄存器控制的。