您的位置:首页 > 其它

(2011.11.03)汇编_王爽_第12章_学习小结

2011-11-03 18:07 281 查看
(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: