码迷,mamicode.com
首页 > 编程语言 > 详细

学习<<汇编语言 -王爽>>,自已完成的一道实试题 (6)

时间:2015-03-06 19:17:00      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:汇编   中断   汇编语言   

实验13  编写、应用中断例程 第一小题(材料详见书上262页)


题目描述:

(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。

参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。

以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其要注意观察int、iret指令执行前后CS、IP和栈中的状态。


以下是我解答的完整的代码:

:>----------------------------------------------------------------------------------------

[t1.asm] 文件内容(用于测试中断程序)

;程序功能:测试安将好的中断类型码为7ch的中断处理程

;参数:dh-行数,dl-列数,cl-属性字节,ds-字符串的段地址,si-偏移量

assume cs:codesg, ds:datasg, ss:stacksg


datasg segment

  db ‘Welcome to masm!‘,0

datasg ends


stacksg segment

  dw 16 dup(0)

stacksg ends


codesg segment

  start: mov ax, stacksg

         mov ss, ax

         mov sp, 20h

         mov dh, 10

         mov dl, 10

         mov cl, 2

         mov ax, datasg

         mov ds, ax

         mov si, 0

          ;下面将转向中断处理程序

         int 7ch


         mov ax, 4c00h

         int 21h

codesg ends


end start


[t2.asm] 文件内容 (用来安装中断程序)

;程序功能:安装中断类型码为7ch的中断处理程序到0000:0200

;并且修改中断向量表,使产生7ch中断时跳转到中断程序的入口

assume cs:codesg


codesg segment

  start: mov ax, 0

         mov es, ax

         mov di, 200h

         mov ax, cs

         mov ds, ax

         mov si, offset do7c

          ;由masm编译器计算要复制的字节量

         mov cx, offset do7cend - offset do7c

          ;清除DF标志,即设置DF为0(表示si、di将自增)

         cld

          ;把由ds:si指向的地址中的数据, 逐个字节复制到由es:di指向的地址空间

          ;复制的数量由cx指定

         rep movsb

          ;以下设置中断类型码为7ch的中断处理程序入口, 改为0000:0200

         mov word ptr es:[7ch*4], 200h

         mov es:[7ch*4+2], es

         mov ax, 4c00h

         int 21h


   ;中断类型码为7ch的中断处理程序

   do7c: push es

         push si

         push di

         push ax

         push cx

         push dx

          ;以上保存程序中使用了的寄存器

         mov ax, 0B800h

         mov es, ax

         mov al, 160

         mul dh

         mov di, ax

         mov al, 2

         mul dl

         add di, ax 

          ;以上用di保存根据参数行、列指定在显存中的偏移量

         mov dl, cl

          ;以上用dl暂存参数-字符的显示属性字节, 因为下面要用jcxz来跳转

         mov ch, 0

      s0:mov cl, ds:[si]

         jcxz ok

         mov es:[di], cl

         mov es:[di].1, dl

         inc si

         add di, 2

         jmp s0

          ;以上根据字符信息、属性字节设置对应的显存内容

      ok:pop dx

         pop cx

         pop ax

         pop di

         pop si

         pop es

         iret

         mov ax, 4c00H

         int 21H

 do7cend:nop


codesg ends


end start

:<----------------------------------------------------------------------------------------


总结:

    中断也可以以子程序调用的形式使用就像使用call指令。编译的时候 mov es:[7ch*4+2], es 我之前写成了

mov es:[7ch*4+2], 0 发现出错了,原来是不能直接将立即数传给段寄存器,须用通用寄存器当中介。在使用Debug调试t1.exe时,执行到 int 7ch 后正常的跳向中断处理程序入口,但不知道为什么在执行到 mov ax, 0B800h 时就出现下面的弹框:

技术分享

原来是测试程序t1.exe中的栈设置的有点小。

   正确               错误

dw 16 dup(0) 之前为 dw 8 dup(0)

mov sp, 20h  之前为 mov sp, 10h


-------------   以上的习题部分及代码引用于王爽老师的<<汇编语言>>第二版  ----------------


本文出自 “9256624” 博客,请务必保留此出处http://9266624.blog.51cto.com/9256624/1618034

学习<<汇编语言 -王爽>>,自已完成的一道实试题 (6)

标签:汇编   中断   汇编语言   

原文地址:http://9266624.blog.51cto.com/9256624/1618034

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!