汇编语言[王爽]-12 内中断

内中断的产生

来源及中断码

  1. 除法错误:0
  2. 单步执行:1
  3. 执行into指令:4
  4. 执行int n指令:n

中断向量表

Untitled

Untitled

中断过程

CPU收到中断信息后,根据中断向量表,跳转到相应的中断程序中处理中断,这一过程称为中断过程

  1. 从中断信息中取得中断向量码N
  2. 标志寄存器入栈(因为中断过程中要改变标志寄存器的值)
  3. 设置标志寄存器的第8位TF和第9位IF的值为0
  4. CS入栈
  5. IP入栈
  6. (IP)=(4N) ; (CS)=(4N+2)

更简洁的表示

1, 取得中断向量码N
2,pushf
3,TF=0,IF=0
4,push cs
5.push ip
6,(IP)=(N*4) ; (CS)=(N*4+2)

中断处理程序和iret指令

编写中断处理程序的步骤和子程序相似,下面是基本步骤:

  1. 保存用到的寄存器
  2. 处理中断
  3. 恢复用到的寄存器
  4. iret 返回

iret 指令用汇编语法描述为

pop ip
pop cs
popf

编写0号中断

目标:当发生除法错时,在屏幕显示“overflow!”,返回DOS

步骤:

  1. 编写可以显示“overflow!”的中断处理程序:do0
  2. 安装程序,将do0传送在内存0000:0200处
  3. 设置中断向量表,将do0的入口地址存储在中断向量表0号表项中

do0为什么存储在0000:0200处

Untitled

assume cs:code

code segment 
start:	
	;将中断例程复制到0000:0200h处
	mov ax,cs
	mov ds,ax
	mov si,offset do0
	mov ax,0
	mov es,ax
	mov di,0200h
	
	mov cx,offset do0end-offset do0
	cld
	rep movsb

	;将中断例程的地址,添加到中断向量表
	mov ax,0
	mov es,ax
	mov word ptr es:[0*4],0200h
	mov word ptr es:[0*4+2],0

	mov ax,1
	mov bl,0
	div bl

	mov ax,4c00h
	int 21h

	;0号中断例程,显示字符串overflow!
do0:
	jmp short do0start
	db 'overflow!'
do0start:
	mov ax,cs
	mov ds,ax
	mov si,202h

	mov ax,0b800h
	mov es,ax
	mov di,12*160+36*2

	mov cx,9
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

Untitled

为什么此处的中断例程没有iret而是结束程序了?因为题目要求触发除法中断后直接返回DOS,而不是主程序

posted @ 2025-09-15 16:06  Miaops  阅读(11)  评论(0)    收藏  举报