中断
中断向量表
共256个表项,每个表项4个字节。共1024个字节。



中断发生时 CPU做了什么事情
1) 得到中断的类型号
2) 标志寄存器的值入栈
3) 设置标志寄存器中的TF和IF为0
4) CS的内容、IP的内容入栈(为了中断处理完成后恢复程序的执行)
5) 根据中断的类型号从中断向量表中找到中断处理程序的入口地址
a) 中断向量表中是一个四字节的数,高位表示段地址,地位表示段内偏移地址
b) 设置CS为高地址,IP为低地址的值
(IP)=中断类型码*4 【字单元】
(CS)=中断类型码*4+2 【字单元】

中断过程中寄存器的入栈顺序是:标志寄存器 、 CS、IP 而iret的出栈顺序是IP、CS、标志寄存器。iret 指令执行后,cpu回到执行中断处理程序前的执行点继续执行程序。

怎样编写中断处理程序
例如:除0中断是0号中断,
1. 中断向量表在内存: 0000:0000~0000:03FF
2. 一般情况下,从0000:0200~0000:02FF的256字节的空间所对应的向量表项是空的。
思路:
l 把do0中断处理程序的内容写到0000:0200开始的地址中(不能超过256个字节)怎么写?
l 然后把中断向量表中0号中断的段地址、IP地址设置成0000、0200。这个好办。
l 为了改写中断向量号的段地址、IP地址,就需要知道中断号,除0是0号,中断处理程序怎么知道中断号的?cpu把中断号传给处理程序吗?怎么传?
怎么写?
最初始的程序设计
0.0(原始社会)
设计一个do0安装程序
assumecs:code
codesegment
start:
设置es:di指向目的地址 ; 0000:0200
设置ds:si指向源地址 ;代码段的地址起始位置
设置cx为传输长度 ;do0程序的字节长度
设置传输的方向为正
rep movsb ;重复传
设置中断向量表
mov ax,4c00H
int 21h
do0:
显示字符串"overflow!jacob"
mov ax,4c00h
int 21h
code ends
end start
1) 源地址怎么得到?
a) 段地址code,偏移量:offset do0;
b) 传送的目的地址: 0:200;
c) 传输的长度; do0部分代码的长度
d) 传输的方向: 正向
0.1(奴隶社会)
assume cs:code
code segment
start:
movax,cs
movds,ax
movsi, offset do0
movax,0
moves,ax
movdi,200h
mov cx,do0部分代码的长度
cld
repmovsb