内中断笔记

0.操作数可以是表达式(如mov ax,(4+7/2)*5)
1.内中断源于cpu内部
2.下列情况产生内中断:
(1)除法错误(除法溢出)
(2)单步执行
(3)执行into指令
(4)执行int指令
3.中断类型码标识中断来源,为1个字节,可表示256种中断
上述中断的类型码:
(1)除法错误:0
(2)单步执行:1
(3)执行into指令:4
(4)执行int指令:int n   n是字节型立即数,为中断类型码
4.中断向量:中断处理程序的入口地址
5.中断向量表:0000:0000——0000:03ff,共1024个字节(256种*4byte/种)
6.一个中断向量为4字节,高字为cs,低字为ip。
7.中断过程:(由硬件完成)
(1)取得中断类型码n
(2)pushf
(3)TF=0,IF=0
(4)push cs
(5)push ip
(6)(ip)=(n*4),(cs)=(n*4+2)
8.中断处理程序:
(1)保存用到的寄存器
(2)处理中断
(3)恢复用到的寄存器
(4)iret返回
iret等效指令:
pop ip
pop cs
popf
9.中断向量表中0000:0200——0000:02ff的256个字节为空,可用于放代码和数据
10.下面给出重写0号中断的程序:
assume cs:code
code segment
start:
;;;;;;;;;;;;;;;;;;;安装
mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset do0
mov di,200h
mov cx,offset do0end-do0    ;计算代码长度

cld
rep movsb
;;;;;;;;;;;;;;;;;;改写中断向量表,即注册
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    ’hello shadow!’
do0start:
push ax                ;书上的程序并未保护现场,但我认为保存用到的寄存器的值更好些?
push bx
push si
push di
push cx
mov ax,cs
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,202h
mov di,12*160+36*2
mov cx,13

s:    mov al,[si]
mov es:[di],al
inc si
add di,2
loop s

pop cx                ;恢复现场
pop di
pop si
pop bx
pop ax

mov ax,4c00h
int 21h
do0end:nop        ;为了计算do0的长度
code ends
end start
11.tf=1时触发单步中断,在中断过程中tf=0这步是为了防止死循环(每步执行完,cpu都会检测tf位)
12.个人认为可以通过在中断处理程序(1号中断)中置tf=1,达到循环执行某段代码的目的(死循环),本菜鸟暂时未想到这个有什么应用(恶作剧程序?。。)。。
13.注意点:执行修改ss段寄存器的指令后,cpu不响应任何中断,所以t单步后ss后的指令还是会被执行。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>