加载中…
个人资料
筑基2017
筑基2017
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,978
  • 关注人气:8
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

汇编语言(王爽第三版)实验12编写0号中断的处理程序

(2017-04-23 17:35:30)
标签:

汇编

王爽

it

教育

分类: 汇编语言(王爽第三版)实验

实验12 编写0号中断的处理程序

       编写0号中断处理程序,使得在除法溢出时,在屏幕中间显示字符串'divide error!',然后返回dos

       实验分析:

       1)按照12.9小节中分析的,编写一个do0程序,这个不难,

    ;------

    ;程序名称:do0

    ;功能:在屏幕中央显示字符串,显示“除法溢出”。

    ;入口参数:无

    ;返回值:无

    ;------

       2)编写一个装载do0的程序,并设置中断向量指向do0入口。

       这个在书中前面几个小节都有详细的介绍。

       3)下面的测试重要。

       程序汇编代码如下(将do0 0号中断处理程序装载到0000:200H中,并设置中断向量表0号表项的中断向量指向该程序入口。):

assume cs:code

code segment

start:    mov ax, code

      mov ds, ax

      mov si, offset do0  ;设置源内存单元地址

     

      mov ax, 0000H

      mov es, ax

      mov di, 0200H       ;设置目标内存单元地址0000:0200H

     

      mov cx, offset do0end - offset do0  ;设置传输的长度。

      cld                 ;传输方向为正,即sidi增加。

      rep movsb

      ;设置中断向量表,0号中断向量设置为0000:0200H

      mov ax, 0000H

      mov es, ax

      mov word ptr es:[0*4], 0200H

      mov word ptr es:[0*4+2], 0000H

     

      mov ax, 4c00H

      int 21H

  ;------

  ;程序名称:do0  0号中断处理程序,装载到0000:200H

  ;功能:在屏幕中央显示字符串,显示“除法溢出”。

  ;入口参数:无

  ;返回值:无

  ;------

  do0:    jmp short do0start

          db 'divide error!'

     

  do0start:

          mov ax, cs

          mov ds, ax

          mov si, 0202H   ;设置ds:si指向字符串。  

         

          mov ax, 0b800H

          mov es, ax

          mov di, 12*160+36*2 ;设置es:di指向显存,(屏幕中央)

         

          mov cx, 13      ;字符串长度13

      s: mov al, [si]

          mov es:[di], al ;

          inc si

          add di, 2       ;显存2个字节代表一个字,其中奇数代表字符。

          loop s

         

          mov ax, 4c00H

          int 21H

  do0end: nop

 

code ends

end start

       程序说明:

       1)此程序的目的是将do0这个中断处理程序的指令代码的机器码装载到内存0000:200h处,并设置中断向量指向该程序入口。也就是说,此程序执行完毕后,有一个新的中断程序do0,实时的驻留在内存中,并实时响应中断类型码为0的事件。

       2)关于rep movsb它是把 DS:SI 所指地址的一个字节搬移到 ES:DI 所指的地址上,注意源内存和目的内存的表示方法。

       3)为什么有do0end:       nop?如果没有这个指令,我们无法自动的统计出do0这个程序的机器码的长度,有这个指令在do0机器码的最后结尾作为标记,我们就能使用offset do0end - offset do0这个获得do0的长度了。

       程序调试跟踪:

       1)此程序编译连接后,可以直接就运行它的exe文件,也可以在debug中逐步调试。

       2)运行完这个程序后,只要不退出dos模式窗口,我们发现:0号中断向量的指向改变了,指向了0000:0200H,如图(在命令提示符下,直接键入debug即可):

-d 0000:0

0000:0000  00 02 00 00 8B 01 70 00-16 00 9E 03 8B 01 70 00   ......p.......p.

       3)查看0000:0200H内存内容:

-d 0000:200

0000:0200  EB 0D 64 69 76 69 64 65-20 65 72 72 6F 72 21 8C   ..divide error!.

0000:0210  C8 8E D8 BE 02 02 B8 00-B8 8E C0 BF C8 07 B9 0D   ................

0000:0220  00 8A 04 26 88 05 46 83-C7 02 E2 F5 B8 00 4C CD   ...&..F.......L.

0000:0230  21 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   !...............

       果然在这段内存存储着do0的机器码。

       4)在debug下,或自己编写个小程序,执行下,看看除法溢出的结果。

       测试小程序如下:

assume cs:code

code segment

start:  mov ax, 1000H

        mov bl, 1H

        div bl

       

        mov ax, 4c00H

        int 21H

code ends

end start

       结果:

http://s14/bmiddle/006LW9dSzy7awPlwWhD1d&690

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有