您的位置 首页 5G

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

疯狂的暑假学习之汇编入门学习笔记(十一)——内中段参考:《汇编语言》王爽第12章中断是指CPU在执行完当前指令后收到某…

张狂的暑假学习之 汇编入门学习笔记 (十一)—— 内中段

参阅: 《汇编语言》 王爽 第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. assumecs:code
  2. codesegment
  3. start:
  4. movax,1000H
  5. movbl,1
  6. divbl
  7. codeends
  8. endstart

下面就修正0中止的中止程序,让发生div除法溢出时,在屏幕上显现“Welcome to masm!”

  1. assumecs:code
  2. codesegment
  3. start:
  4. movax,cs
  5. movds,ax
  6. movsi,offsetdo0
  7. movax,0
  8. moves,ax
  9. movdi,200h
  10. movcx,offsetdo0end-offsetdo0;核算写入巨细
  11. cld
  12. repmovsb;把do0~do0end的代码写到0:200开端的内存空间中去
  13. movax,0
  14. moves,ax
  15. movwordptres:[0*4],200h;改动0中止的中止向量表,是0中止指向咱们要的中止处理程序的方位
  16. movwordptres:[0*4+2],0
  17. movax,4c00h
  18. int21h
  19. do0:
  20. jmpshortdo0start
  21. dbWelcometomasm!;保存要显现的信息
  22. do0start:
  23. movax,cs
  24. movds,ax
  25. movsi,202h;设置要显现信息在代码中的方位
  26. movax,0b800h
  27. moves,ax
  28. movdi,12*160+36*2;显现的方位
  29. movcx,16
  30. s:
  31. moval,[si]
  32. moves:[di],al
  33. incsi
  34. adddi,1
  35. moval,02h;显现的色彩等信息
  36. moves:[di],al
  37. adddi,1
  38. loops
  39. movax,4c00h
  40. int21h
  41. do0end:
  42. nop
  43. codeends
  44. endstart

先运转上面代码生成的程序,把中止程序拷贝到安全的内存中,改动中止向量表。然后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. movax,1000h
  2. movss,ax
  3. movsp,0

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/276848.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部