×
嵌入式 > 技术百科 > 详情

汇编入门学习笔记 (十一)—— 内中断

发布时间:2020-06-15 发布时间:
|
疯狂的暑假学习之  汇编入门学习笔记 (十一)——  内中段

 

参考: 《汇编语言》 王爽 第12章

 

    中断是指CPU在执行完当前指令后收到某种信息(中断信息),就不在接向下执行,而去对接收到的信息进行处理。中断信息可以来自CPU内部和外部,分内中断,外中断。

 

1. 内中断的产生

 

下面4中情况会产生内中断:

(1)除法错误。如:div除法溢出

(2)单步执行。如debug中的单步调试

(3)执行into指令。

(4)执行int指令

 

 

2. 处理中断信息

 

    中断信息中包含8位的中断类型吗,用来表示要执行的中断程序。但是,一个程序入口要cs和ip,8位不够。这样,系统中就有一个中断向量表保存中断程序的cs和ip,8位中断类型吗表示是中断向量表中的第几个。并且中断向量表存放在 0000:0000到0000:03ff的1024个单元中。

 

3. 中断过程

 

    例如:div除法溢出 的中断类型是0,产生div除法溢出后,cpu知道中断类型位0,cpu先保存标志位,cs、ip,设置TF=0、IF=0,然后去到中断向量表取出对应中断处理程序的cs和ip(ip=(0*4),cs=(0*4+2)) 然后执行中断程序。

即:

(1)取得中断类型吗N

(2)pushf

(3)TF=0,IF=0

(4)push cs

(5)push ip

(6)(ip)=(N*4),(cs)=(N*4+2)

 

4. 中断处理程序和iret指令

 

iret指令相当于:

pop ip

pop cs

pop f

 

一般中断处理程序的步骤:

(1)保存到寄存器

(2)处理中断

(3)恢复到寄存器

(4)iret

 

5. 写一个中断处理程序

 

0中断是div除法溢出例如下面程序debug中就会产生overflow错误,在屏幕上显示“Divide overflow”

  1. assume cs:code  
  2.   
  3. code segment  
  4. start:    
  5.     mov ax,1000H  
  6.     mov bl,1  
  7.     div bl  
  8. code ends  
  9.   
  10. end start  

 

 

下面就修改0中断的中断程序,让产生div除法溢出时,在屏幕上显示“Welcome to masm!”

 

  1. assume cs:code  
  2.   
  3.   
  4. code segment  
  5. start:  
  6.     mov ax,cs  
  7.     mov ds,ax  
  8.     mov si,offset do0  
  9.     mov ax,0  
  10.     mov es,ax  
  11.     mov di,200h  
  12.     mov cx,offset do0end - offset do0    ;计算写入大小  
  13.     cld  
  14.     rep movsb             ;把do0~do0end的代码写到0:200开始的内存空间中去  
  15.       
  16.     mov ax,0  
  17.     mov es,ax  
  18.     mov word ptr es:[0*4],200h   ;改变0中断的中断向量表,是0中断指向我们要的中断处理程序的位置  
  19.     mov word ptr es:[0*4+2],0  
  20.       
  21.       
  22.     mov ax,4c00h  
  23.     int 21h  
  24.       
  25. do0:  
  26.     jmp short do0start  
  27.     db 'Welcome to masm!'   ;保存要显示的信息  
  28.       
  29. do0start:  
  30.     mov ax,cs  
  31.     mov ds,ax  
  32.     mov si,202h    ;设置要显示信息在代码中的位置  
  33.       
  34.     mov ax,0b800h  
  35.     mov es,ax  
  36.     mov di,12*160+36*2    ;显示的位置  
  37.     mov cx,16  
  38. s:  
  39.     mov al,[si]  
  40.     mov es:[di],al  
  41.     inc si  
  42.     add di,1  
  43.     mov al,02h       ;显示的颜色等信息  
  44.     mov es:[di],al  
  45.     add di,1  
  46.     loop s  
  47.       
  48.     mov ax,4c00h  
  49.     int 21h  
  50. do0end:  
  51.     nop  
  52. code ends  
  53.   
  54. end start  

 

先运行上面代码生成的程序,把中断程序拷贝到安全的内存中,改变中断向量表。然后debug会发生div除法溢出的程序,就会看到屏幕中间显示绿色 的“Welcome to masm!”。

 

 

6. 单步中断

 

  CPU每执行完一条指令后,如果检测到标志寄存器的TF为1,则会产生单步中断,引发中断过程。 单步中断的中断类型吗位1。

过程:

(1)取得中断类型吗1。

(2)标志寄存器入栈,TF,IF设置为0

(3)CS,IP入栈

(4)(IP)=(1*4),(CS)=(1*4+2)

 

7.  响应中断的特殊情况

 

一般情况,如果CPU检测到中断信息,就会响应中断。但有特殊情况。

当在执行完向ss寄存器传送的指令后,如果发现中断,CPU不会响应。因为如果ss改变,sp没有改变,ss:sp就不是指向正确的栈顶了。

所以改变ss于改变sp的命令要写在一起

如:

 

  1. mov ax,1000h  
  2. mov ss,ax  
  3. mov sp,0  
  4.  

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器