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

  

(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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值