《汇编语言》学习(十二)内中断

时间:2021-10-07 01:26:12

    《汇编语言》第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,1000
mov bh,1
div bh
3)使用“u”命令查看是否输入正确

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代码段内定义。