《汇编语言》第12章主要介绍8086CPU的内中断的机制,包括:4种类型的内中断、中断类型码(byte-256)、中断向量表(IVT)、中断过程、中断处理函数的基本模型和iret中断返回指令。文中以“除0”中断为例,演示了中断的处理过程和如何编写及安装中断处理函数。本文将以一张思维导图总结内中断的知识点,并给出文中的所有习题答案。
一、知识图谱
三个经典问题
1,如何让一个内存单元成为栈顶?
将它的地址放入SS、SP中
2,如何让一个内存单元中的信息被CPU当作指令来执行?
将它的地址放入CS、IP中
3,如何让一段程序成为N号中断处理程序?
将它的入口地址放入中断向量表的N号表项中
二、习题答案
检测点12.1
(1)用dubug查看内存,情况如下:
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00
则3号中断源对应的中断处理程序的入口地址为:0070:018B
解释:一个中断项占两个字单元,高地址字段存段地址,低地址字段存偏移地址。而一个字内,低字节在前,高字节在后。
(2)存储N号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:N*4
存储N号中断源对应的中断处理程序入口的段地址的内存单元的地址为:N*4+2
实验12
编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回DOS
1,测试方法:
1)进入debug模式
2)使用“a”命令输入如下代码(assembly)
mov ax,10003)使用“u”命令查看是否输入正确
mov bh,1
div bh
4)使用“t”命令单步执行(step through)
2,源代码
assume cs:code
code segment
start:mov ax,0000h
mov es,ax
mov di,0200h
mov ax,cs
mov ds,ax
mov si,offset do0
mov cx,offset do0end - offset do0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
mov ax,4c00h
int 21h
do0:jmp short do0start
db "overflow!"
do0start:mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,9
s:mov al,[si]
mov ah,0cah
mov es:[di],ax
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end:nop
code ends
end start
注意,可以直接运行该程序,然后通过debug测试即可。
待显示的字符串需要放在do0代码段内定义。