精华内容
下载资源
问答
  • 编写中断服务程序的一些基本原则

    千次阅读 2008-06-28 00:36:00
    关于编写中断服务程序的一些基本原则:1. 避免在中断服务程序中做浮点运算 好的中断服务程序应该遵循短而有效这一原则,但在中断服务程序中做浮点运算却大大地违背这一原则,同时有些处理器/编译器就不允许在中断...

    关于编写中断服务程序的一些基本原则:

    1. 避免在中断服务程序中做浮点运算
             好的中断服务程序应该遵循短而有效这一原则,但在中断服务程序中做浮点运算却大大地违背这一原则,同时有些处理器/编译器就不允许在中断服务城中做浮点运算。
    2.中断服务程序不能有返回值
            所有的中断服务程序都应该将返回类型定义为void。
    3.中断服务程序不能传递参数
           所有的中断服务程序的参数列表为void。

     

       
    展开全文
  • 中断服务类型号为60 DATA SEGMENT MESG DB 'This is an Interruption Service Program!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: mov ax,DATA mov ds,ax push ds mov dx,offset disp60 ...

    设中断服务类型号为60

    DATA SEGMENT
    	MESG DB 'This is an Interruption Service Program!$'
    DATA ENDS
    CODE SEGMENT
    	ASSUME CS:CODE,DS:DATA
    START:
    	mov ax,DATA
    	mov ds,ax
    	push ds
    	
    	mov dx,offset disp60
    	mov ax,seg disp60
    	mov ds,ax
    	mov ah,25H
    	mov al,60H
    	int 21H
    	
    	pop ds
    	int 60H
    	
    	mov ah,4CH
    	int 21H
    disp60 proc far
    	mov dx,offset MESG
    	mov ah,09H
    	int 21H
    	iret
    disp60 endp
    CODE ENDS
    END START

     

    展开全文
  • 中断服务程序编写规则

    千次阅读 2013-06-16 09:30:52
    关于编写中断服务程序的一些基本原则: 1. 避免在中断服务程序中做浮点运算  好的中断服务程序应该遵循短而有效这一原则,但在中断服务程序中做浮点运算却大大地违背这一原则,同时有些处理器/编译器就不允许在...

    关于编写中断服务程序的一些基本原则:

    1. 避免在中断服务程序中做浮点运算
             好的中断服务程序应该遵循短而有效这一原则,但在中断服务程序中做浮点运算却大大地违背这一原则,同时有些处理器/编译器就不允许在中断服务城中做浮点运算。
    2.中断服务程序不能有返回值
            所有的中断服务程序都应该将返回类型定义为void。
    3.中断服务程序不能传递参数
           所有的中断服务程序的参数列表为void。

    中断服务程序样例:

      interrupt void timer_isr (void)
    {


    }

    展开全文
  • 中断服务程序编写

    千次阅读 2007-09-10 10:51:00
    中断服务程序编写

    中断服务程序的编写
                                          陈晴阳 

     
    摘要:本文主要介绍C语言中中断服务程序的编写、安装和使用。由于硬中断服务程序的编写涉及到硬件端口读写操作,使得用户直接和硬件打交道,在程序设计过程中要用到的数据(如硬件端口地址等)比较多,这就使程序员和计算机的硬件设备间缺少一种“缓冲”的作用,况且,用汇编语言来直接对硬件编程要方便得多。本文仅对软中断程序的编写作个介绍。
    关键词:软中断、中断向量、中断向量表、TSR内存驻留、DOS重入、中断请求、段地址、偏移量、寄存器、BIOS、DOS、setvect ( )、getvect ( )、keep ( )、disable ( )、enable ( )、geninterrupt ( )、int86 ( )、interrupt
    对于一般的C语言爱好者而言,就如何在C中使用中断例程这一问题应该已经非常熟悉,例如,我们可以通过int86 ( )函数调用13H号中断直接对磁盘物理扇区进行操作,也可以通过INT86 ( )函数调用33H号中断在屏幕上显示鼠标光标等。其实,13H号也好,33H号也好,它们只不过就是一些函数,这些函数的参数通过CPU的寄存器传递。中断号也只不过是间接地指向函数体的起始内存单元,说它是间接的,也就是说,函数的起始段地址和偏移量是由中断号通过一种方法算得的(具体如何操作,下面会作解释)。如此一来,程序员不必要用太多的时间去写操作硬件的程序了,只要在自己的程序中设置好参数,再调用BIOS或DOS提供的中断服务程序就可以了,大大减小了程序开发难度,缩短了程序开发周期。那么中断既然是函数,就可以由用户任意的调用、由用户任意地编写。
    计算机内存的前1024个字节(偏移量00000H到003FFH)保存着256个中断向量,每个中断向量占4个字节,前两个字节保存着中断服务程序的入口地址偏移量,后两个字节保存着中断程序的入口段地址,使用时,只要将它们分别调入寄存器IP及CS中,就可以转入中断服务程序实现中断调用。每当中断发生时,CPU将中断号乘以4,在中断向量表中得到该中断向量地址,进而获得IP及CS值,从而转到中断服务程序的入口地址,调用中断。这就是中断服务程序通过中断号调用的基本过程。在计算机启动的时候,BIOS将基本的中断填入中断向量表,当DOS得到系统控制权后,它又要将一些中断向量填入表中,还要修改一部分BIOS的中断向量。有一部分中断向量是系统为用户保留的,如60H到67H号中断,用户可以将自己的中断服务程序写入这些中断向量中。不仅如此,用户还可以自己更改和完善系统已有的中断向量。
    在C语言中,提供了一种新的函数类型interrupt,专门用来定义中断服务程序,比如我们可以写如下的中断服务程序:
    /*例1:中断服务程序*/
    void interrupt int60()
    {
        puts("This is an example");
    }
    该中断的功能就是显示一个字符串,为什么不用printf ( )函数呢?这就牵涉到DOS的重入问题,后面将作一些介绍。
    一个简单的中断服务程序写好了,如何把它的函数入口地址填写到中断向量表中,以便在产生中断的时候能转入中断服务程序去执行呢?这里要用到setvect ( )和getvect ( )函数。setvect ( )有两个参数:中断号和函数的入口地址,其功能是将指定的函数安装到指定的中断向量中,getvect ( )函数有一个参数:中断号,返回值是该中断的入口地址。在安装中断以前,最好用disable ( )函数关闭中断,以防止在安装过程中又产生新的中断而导致程序运行混乱,待安装完成后,再用enable ( )函数开放中断,使程序正常运行。现在我们可以把上面的例子再丰富一下:
    /*例2:中断服务程序的编写、安装和使用*/
    #include
    #include
    #ifdef __cplusplus
       #define __ARGU ...
    #else
       #define __ARGU
    #endif
    void interrupt int60 (__ARGU) /*中断服务函数*/
    {
       puts("This is an example");
    }
    void install (void interrupt (*fadd)(__ARGU),int num) /*安装中断*/
    {
       disable(); /*关闭中断*/
       setvect(num, fadd); /*设置中断*/
       enable(); /*开放中断*/
    }
    void main()
    {
    install (int60,0x60);/*将int60函数安装到0x60中断*/
    geninterrupt (0x60); /*人为产生0x60号中断*/
    }
    有一定经验的读者很容易得到该程序的执行结果:在屏幕上显示“This is an example!”。
    编写、安装中断服务程序的方法就介绍这些。下面再浅谈一下内存驻留程序(TSR)的编写和使用。在C语言中,可以用keep ( )函数将程序驻留内存。这个函数有两个参数:status和size。size为驻留内存长度,可以用size=_SS+_SP/16-_psp得到,当然这也是一种估算的方法,并不是精确值。函数执行完以后,出口状态信息保存在status中。比如,对于上面的例子,将“geninterrupt (0x60);”改写成“keep(0,_SS+_SP/16-_psp);”后再执行程序,这一段程序就被驻留,此后在其它的任何软件或程序设计中,只要用到了60H号中断,就会在屏幕上显示“This is an example!”的字样。要恢复系统对60H号中断的定义,只能重新启动计算机。
    像上面的例子其实还很不完善,它没有考虑DOS系统环境的状态、没有考虑程序是否已经驻留内存、没有考虑退出内存驻留等问题。对于第二个问题还是很容易解决的:执行程序一开始就读取某一函数中断入口地址(如63H号中断)判断是否为空(NULL),如果为空就先将该地址置为非空再驻留内存,若为非空则表示已经驻留并退出程序。这一步判断非常重要,否则将会因为重复驻留占用过多内存空间而最后造成系统崩溃。至于其它两个问题,在此不多作说明,有兴趣的读者可以参考一些有关书籍。
    不仅如此,我们还可以通过在DOS下使用热键(Hotkey)来调用内存驻留程序。比如将《希望汉字系统》自带的《希望词典》驻留内存后,在任意时刻按下Ctrl+F11键,就能激活程序,出现词典界面。微机的键盘中有一个微处理芯片,用来扫描和检测每个按键的按下和释放状态。大多数按键都有一个扫描码,告知CPU当前的状态,但一些特殊的键如PrintScreen、Ctrl+Break等不会产生扫描码,而直接产生中断。正因为如此,我们可以将Ctrl+Break产生的中断号指向我们自己写好的程序入口地址,那么当按下Ctrl+Break后,系统就会调用我们自己的程序去执行,这实际上也就是修改了Ctrl+Break的中断向量。至于其它按键激活程序则可以利用9H号键盘中断捕获的扫描码来实现,在此不多作说明。例如,执行下面的程序后,退回DOS系统,在任意的时候按下Ctrl+Break后,屏幕的底色就会变成红色。
    /*例3:中断服务程序编写、安装和使用,内存驻留*/
    #include
    #include
    #ifdef __cplusplus
    #define __ARGU ...
    #else
    #define __ARGU
    #endif
    void interrupt newint(__ARGU); /*函数声明*/
    void install (void interrupt (*fadd)(__ARGU), int num);
    int main()
    {
    install (newint,0x1b); /*Ctrl+Break 中断号:1BH*/
    keep(0,_SS+(_SP/16)-_psp); /* 驻留程序*/
    return 0;
    }
    void interrupt newint(__ARGU)
    {
    textbackground(4); /* 设置屏幕底色为红色*/
    clrscr(); /* 清除屏幕*/
    }
    void install (void interrupt (*fadd)(__ARGU), int num)
    {
    disable();
    setvect(num,fadd); /* 设置中断*/
    enable();
    }
    由于13H号中断是BIOS提供的磁盘中断服务程序,对于DOS下的应用程序,它们的存盘、读盘功能都是通过调用这一中断来实现的。有许多DOS下的病毒就喜欢修改13H号中断来破坏系统,例如,修改13H号中断服务程序,将其改成:
    /*例4:病毒体程序伪代码*/
    void interrupt new13(__ARGU)
    {
        if ( 病毒发作条件成熟)
        {   修改入口参数指向病毒程序入口地址;
             执行病毒代码;
        }
        调用原来的13H中断;
    }
    只要当任一软件(如EDIT.COM等)对磁盘有操作并且病毒发作条件成熟时,病毒就被激活。当然,这样做会导致可用内存空间减少,容易被用户发现。一些“聪明”的病毒又会去修改其它的中断向量,使得系统报告的内存大小和实际相符合。还有的病毒,当发现用户通过一些程序(如DEBUG.COM等)去跟踪它时,它会悄悄地溜掉,其基本原理仍然与修改中断有关。硬盘的0面0柱1扇区(Side 0 Cylinder 0 Sector 1)保存着重要的引导信息,一旦破坏,计算机将无法识别硬盘。我们可以写一个程序来防止任何软件(包括病毒)对这一扇区执行“写”操作,一定程度上实现了“写保护”的作用,它的基本原理就是修改13H号中断向量并常驻内存,监视着软件(包括病毒)对磁盘操作的每一个细节。读者请注意:本程序没有考虑内存驻留的退出,如果想恢复13H号中断,请重新启动计算机。
    /*例5:主引导扇区保护,请用Turbo C 2.0编译,MBSP.C*/
    #include
    #include
    #include
    #define STSIZE 8192
    #define PSP_ENV_PSP 0x2c
    #define PARA(x) ((FP_OFF(x)+15)>>4)
    typedef struct {
       unsigned bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags;
    } INTERRUPT_PARAMETER;
    void install (void interrupt (*faddress)(), int num);
    void interrupt new13(INTERRUPT_PARAMETER p);
    int main()
    {
    union REGS regs;
    struct SREGS sregs;
    unsigned mem;
    unsigned far *pointer;
    char far *stack;
    printf("/n< > version 1.0/n/n");
       if ((stack=malloc(STSIZE))==NULL)
           {
           printf ("Not enough Memory!/n");
           exit(1);
           }
       if (getvect(0x62)!=NULL)
           {printf("Already Installed!/n");exit(1);}
       install(getvect(0x13),0x62);
       install (new13,0x13);
       pointer=MK_FP(_psp,PSP_ENV_PSP);
       freemem(*pointer);
       segread(&sregs);
       mem=sregs.ds+PARA(stack)-_psp;
       setblock(_psp,mem);
       keep (0,mem);
       return 0;
    }
    void install (void interrupt (*faddress)(), int num)
    {
       disable();
       setvect(num,faddress);
       enable();
    }
    void interrupt new13(INTERRUPT_PARAMETER p)
    {
        p.ax=_AX;
        p.cx=_CX;
        p.dx=_DX;
        if(_AH==0x03&&_CH==0&&_CL==0x01&&_DH==0&&_DL==0x80) return;
        enable();
        geninterrupt (0x62);
        disable();
        _AX=p.ax;
        _CX=p.cx;
        _DX=p.dx;
        return;
    }
    说明:在使用本程序以前,请:①用杀毒软件对计算机引导扇区、内存和所有文件进行一次全面的扫描,确信计算机中没有任何病毒;②有计算机汇编语言基础的读者可以自己写一个新的引导程序,先将本程序驻留内存,再调用原来的引导程序,以便在病毒还没有取得系统控制权以前开启防护功能。
    最后简要说明一下DOS系统重入问题。DOS是单用户单任务操作系统。如果程序在执行的过程中被打断,就有可能因为破坏了原来的程序运行环境而造成运行不正常,这是灾难性的。当中断产生后,CPU立即中止当前的程序去执行中断服务程序,如果在中断服务程序中又有对DOS中断的调用(如DOS的21H号中断)时,这样必定会重写环境全局变量(例如PSP程序段前缀就会被改成正在执行的中断程序的PSP),这样原来的环境被破坏,原来的程序也就无法正确执行。当中断调用完成并返回后,用户得到的结果是出乎意料的。所以在编写中断服务程序时应该避免DOS系统功能调用,在C语言的中断服务程序中不应该出现malloc ( )、printf ( )、sprintf ( )等函数。
    参考文献:《C高级实用程序设计》王士元编著,清华大学出版社,1996.3
     
    展开全文
  • 当进程发出一个系统调用的请求时,由应用态切换到内核态。这样的内核控制路径被成为进程内核路径,也叫进程...当CPU执行一个与中断有关的内核控制路径的时候,被成为中断上下文。中断的上半部和下半部都属于ISR上下文。
  • 若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写中断所需的中断服务程序,并将该中断服务程序的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断...
  • UCOSIII编写中断服务函数

    千次阅读 2018-12-12 20:58:50
    1.1、编写中断服务函数: void USART1_IRQHandler(void) {  OSIntEnter();  //中断服务程序 OSIntExit(); }  1.2、进入中断服务函数以后使用函数OSIntEnter() void OSIntEnter (void) {  if (OS...
  • CPU都具有执行完当前正在执行的指令之后,检测到从...编写中断的处理程序有多个步骤 首先,CPU接收到中断类型码(一个字节型数据),然后通过中断向量表找到对应的中断处理程序的入口地址。中断向量表是入口地址的列表
  • 这是一个操作系统实验课上的全部内容,这一实验为时钟中断处理程序和键盘中断响应程序.本次实验的内容为操作系统工作期间,利用时钟中断,在屏幕24行79列...在内核中,对33号、34号、35号和36号中断编写中断服务程序
  • 中断服务程序(ISR)应遵循的高效原则

    千次阅读 2018-08-27 11:29:41
    用C语言编写中断服务程序(ISR)要遵循高效的原则:   中断函数代码应尽量简洁——一般不宜在中断函数内编写大量复杂冗长的代码; 应尽量避免在中断函数内调用其他自定义函数; 尽量避免在中断内调用数学函数——...
  • 中断系统的运行必须与子程序配合才能正确使用。... (4)编写中断服务程序,处理中断请求。 前3条一般放在主程序的初始化程序段中。 举例如下:例1、假设允许外部中断0中断,并设定它为高优先级中断,其他中断源为
  • 串口中断服务程序

    千次阅读 2019-07-22 21:44:34
    今天下文主要在学习串口通信这一块,自己尝试写...7,编写中断处理函数;8,串口数据收发;9,串口传输状态获取。 然后就是看见视频里面用了管脚复用但没有在程序里面说明(CSDN搜STM32发103:什么时候用到IO复位(A...
  • PIC单片机中断服务程序

    千次阅读 2017-08-03 20:48:55
    中断服务程序有一个特殊的定义方法: void interrupt ISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一...
  • 第五章 中断中断服务程序

    千次阅读 2012-12-26 14:07:48
    第五章 中断中断服务程序 一,处理器与外围设备进行通信有两种方式:  1,轮询(效率低下)  2,中断 二,中断原理  当我们在敲击键盘的时候,键盘控制器会发送一个中断给处理器,告诉OS有中断产生,...
  • 中断就是CPU正常运行期间,由于内、外部事件引起的CPU暂时停止正在运行的程序,去执行该内部事件或外部事件的引起的服务中去,服务执行完毕后再返回断点处继续执行的情形。这样的中断机制极大的提高了CPU运行效率。
  • 在CW4.6环境下,中断编程主要有两种方式:第一种是使用“interrupt”关键字,“interrupt”关键字是一个非标准ANSI...“interrupt”关键字同样会提示编译器下面的函数是一个中断服务例程。例: void interrupt 20 SCI0_IS
  • 中断服务程序

    千次阅读 2014-10-14 11:41:48
    中断服务程序:处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序。 当中央处理器正在处理内部数据时,外界发生了紧急情况,...
  • 中断服务程序(ISR)

    千次阅读 2012-08-13 22:23:56
    中断服务程序 关键词:软中断中断向量、中断向量表、TSR内存驻留、DOS重入、中断请求、段地址、偏移量、寄存器、BIOS、DOS、setvect ( )、getvect ( )、keep ( )、disable ( )、enable ( )、geninterrupt ( )、...
  • ABBABB机器人中断程序编写格式和用法。
  • 应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长,如果用中断编写,设置中断响应在下降沿时执行中断,则程序编写不用去抖动判断,所以相比较要简单很多!下面用汇编和C语言两种方式编写4X4...
  • linux下avr单片机开发:中断服务程序

    千次阅读 2013-10-08 19:24:27
    不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-avr有所差异,这里对linux下中断服务程序编写做个...
  • c语言单片机中断服务程序

    千次阅读 2018-01-28 02:28:00
    中断服务程序 */ void timer0() interrupt 1 { count ++ ; if (count == 80 ) { P1 = 0 ; // 流水灯全亮 delay( 2000 ); count = 0 ; } } void int0() interrupt 0 { P1 = 0 ; // 流水...
  • 在RT-Thread中,中断服务程序的书写和在裸机开发的写法差不多,区别是加入一组API函数,如下: rt_interrupt_enter(); //通知操作系统此时进入中断状态 rt_interrupt_leave();//通知操作系统此时离开中断状态 ...
  • 汇编语言实验:编写0号中断处理程序任务:编写0号中断处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回操作系统。下面写给出效果,再给出实现代码,最后给出设计思路(为什么这样做...
  • 基于cw10的kinetis中断程序编写 飞思卡尔K系列中断开发模板 不会的可以下来看看 有用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 154,539
精华内容 61,815
关键字:

如何编写中断服务程序