(2011.11.03)汇编_王爽_第12章_学习小结
本章内容:
1. 了解什么是内中断。
2. 如何处理内中断。
3. iret指令与中断处理程序的写法。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一.概念
1. 内中断:
CPU可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息(中断信息),并且可以立即对所接收到的信息进行处理。
2. 中断源
中断信息的事件,即中断信息的来源。
3. 中断向量表
中断处理程序入口地址的列表。
(在内存中保存着256个中断源所对应的中断处理程序入口0000:0000~0000:03FF)
4. 中断过程
CPU收到中断信息后,要对中断信息进行处理,首先将引发中断过程。
二. 产生中断原因:
1. 除法错误,比如,执行div指令产生的除法溢出(中断内型码0)
2. 单步执行(中断内型码1)
3. 执行into指令(中断内型码4)
4. 执行 int 指令
二. 中断过程主要任务
用中断码在中断向量表中找到中断程序的入口地址,设置CS和IP。
1. 取得中断类型码N
2. pushf
3. TF = 0, IF = 0
4. push CS
5. push IP
6. (IP) = (N*4), (CS) = (N*4+2)
三. 中断处理程序的编写
1. 保存用到的寄存器
2. 处理中断
3. 恢复用到的寄存器
4. 用iret指令返回
功能指令:iret
指令说明:pop IP -> pop CS -> popf
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:1201_内中断_编写中断处理程序.asm
; 程序功能:编写可以显示"overflow!"的中断处理程序.
assume cs:code
code segment
start:
; 第一步:
; -----------------------------------------------------------------------------------
; 将程序安装到程序向量表中
; 即将由do0至doend段中的代码复制到向量表中
mov ax, cs
mov ds, ax
mov si, offset do0 ; 设置ds:si指向源地址
mov ax, 0
mov es, ax
mov di, 200h ; 设置es:di指向目的地址
mov cx, offset do0end - offset do0 ; 设置cx为传输长度
; 常数可以直接相加减,由编译器计算
; 标号地址相减可得长度
cld ; 设置传输方向为正
rep movsb
; 第二步:
; ----------------------------------------------------------------------------------
; 设置中断向量表
mov ax, 0 ; 0号中断向量表项为0:0
mov es, ax
mov word ptr es:[0*4], 200h ; 偏移地址[低] -- 0:0
mov word ptr es:[0*4+2], 0 ; 段地址[高] -- 0:2
; ----------------------------------------------------------------------------------
mov ax, 4c00h
int 21h
; 第三步,开始中断处理子程序
; -----------------------------------------------------------------------------------
; 将字符串段写在代码段code中,可以防止被覆盖
do0:
jmp short do0start
db "overflow!"
; -----------------------------------------------------------------------------------
do0start:
mov ax, cs
mov ds, ax
mov si, 202h ; 设置ds:si指向字符串
mov ax, 0b800h
mov es, ax
mov di, 12*160+36+2 ; 设置es:di 指向显存空间的中间位置
mov cx, 9 ; 设置cx为字符串长度
s:
mov al, [si]
mov es:[di], al
inc si
add di, 2
loop s
mov ax, 4c00h
int 21h
do0end:
nop ; 空操作,不执行指令
; ------------------------------------------------------------------------------------
code ends
end start