第12章解析
检测点12.1
(1).用Debug查看内存,情况如下:
则3号中断源对应的中断处理程序的入口地址为:0070:018B。
解析: 在中断向量表中,1个表项存放一个中断向量,也就是1个中断处理程序的入口地址,对于8086CPU,这个入口地址包括段地址和偏移地址,所以1个表项占两个字(四个字节),高地址字存放段地址,低地址字存放偏移地址,所以N号中断源地址从N*4开始,3号中断源从第12个字节开始。
(2).存储N号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为: Nx4。
存储N号中断源对应的中断处理程序入口的段地址的内存单元的地址为:Nx4+2。
实验12 编写0号中断的处理程序
编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。
assume cs:code
code segment
start:
;中断处理程序安装前的准备工作
mov ax,cs
mov ds,ax ;ds指向中断处理程序的段地址
mov si,offset do0 ;si指向中断处理程序的偏移地址
mov ax,0
mov es,ax ;es指向存放中断处理程序的内存单元的段地址
mov di,200H ;di指向存放中断处理程序的内存单元的偏移地址
mov cx,offset do0end - offset do0 ;计算中断处理程序的空间
cld ;设置传输方向为正
rep movsb ;将ds:di指向的内存单元中的字节送入es:di中(即将中断处理程序送入0000:0200)
;设置中断向量
mov ax,0
mov es,ax ;es指向中断向量表
mov word ptr es:[0*4],200h ;将do0中断处理程序的入口地址送入0号表项中(偏移地址)
mov word ptr es:[0*4+2],0 ;将do0中断处理程序的入口地址送入0号表项中(段地址)
;除法溢出测试
mov ax,1000H
mov bh,1
div bh
mov ax,4c00h
int 21h
;中断处理程序
do0:jmp short do0start
db "divide error!"
do0start:mov ax,cs
mov ds,ax ;ds指向字符串
mov si,202h ;使用si访问字符串
mov ax,0b800h ;显存空间地址从0B800h开始
mov es,ax ;es指向显存空间
mov di,12*160+36*2 ;使用di访问显存空间
mov cx,13 ;一共13个字符,循环13次
s:mov al,[si] ;将单个字符取出放入al中
mov es:[di],al ;将字符写入显存空间
inc si ;si+1指向下一个字符
add di,2 ;di+2指向下一个显存空间
loop s
mov ax,4c00h
int 21h
do0end:nop
code ends
end start
在DOS中执行程序后效果如下: