汇编学习之中断问题

来源:互联网 发布:javascript div 编辑:程序博客网 时间:2024/05/29 13:50

自学进入到最后阶段,将王爽老师的第十二章至第十五章的内容学习完成,再回过头来总结一下关于中断问题的理解。

中断,基本含义是暂停当下正在执行的任务,转而去执行比较急迫需要完成的任务。但是执行的开始是将当前正在执行的指令执行完成,才转而执行中断内容。

根据发出中断请求的出发点,将中断分为内中断和外中断

内中断是程序内部执行的中断,或者是CPU执行不下去,遇到bug等问题需要采取的措施。内中断类型有四种:

1.除法错误2.单步执行3.into语句4.int指令处理中断的步骤有四步:

1.取得中断类型码2.标志寄存器入栈,IF=0,TF=03.CS,IP入栈4.根据类型码设置中断入口地址其中,中断类型码和中断向量表相关联。根据中断类型码可以从中断向量表中获得中断程序的入口地址,继而将入口地址赋给CS和IP。假设中断类型码为N,那么获得中断入口地址为IP = (N * 4),CS = (N * 4 )+2.

于此同时,我们可以根据该特性,设置中断程序的重定向,设置新的中断程序,只要将入口地址改为我们编写的程序的入口地址就可以。

常规将自己编写的中断程序存放在00:0200h开始的位置

另,int指令和iret指令结合使用,类似call 和ret指令,但是多出一步。分别是标志寄存器入栈和标志寄存器入栈出栈操作。

;---------------------------外中断------------------------------

外部中断需要和端口相关联。因此在第十四章专门讲了端口的内容。

CPU可以直接访问的3个地方的数据:

CPU内部寄存器,如AX,BX等内存单元,如DS:[0010]端口(各种接口芯片的寄存器)CPU通过端口和各种接口芯片或者外设进行交互。外部中断来自外部,因此优先级没有内部中断高。由此可分为两类:可屏蔽中断和不可屏蔽中断。

但是通过设置cli和sti可以修改外中断的类型。
文章介绍了键盘响应的外中断。通过修改int 9中断程序,可以修改对键盘的响应。外中断比较简单,将实验十五的答案附在下面,不过多解释。

assume cs:codecode segmentdata segmentdw 0,0data endsstart:mov ax,0mov es,axpush cspop dsmov si,offset int9mov di,204hmov cx,offset int9ends-offset int9cldrep movsbpush es:[9*4]pop es:[200h]push es:[9*4+2]pop es:[202h]climov word ptr es:[9*4],204hmov word ptr es:[9*4+2],0stimov ax,4c00Hint 21hint9:push axpush espush bxpush cxin al,60hpushfcall dword ptr cs:[200H]cmp al,9eH;松开A键jne int9retmov ax,0b800hmov es,axmov bx,0mov cx,2000s2:mov byte ptr es:[bx],'A' add bx,2loop s2 int9ret:pop cxpop bxpop espop axiretint9ends:nopcode endsend start