欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编实验三——中断及查看中断向量地址

程序员文章站 2022-06-08 22:56:49
...

一、实验要求

  1. 查看中断类型码 0H
  2. 查看中断类型码 60H

二、实现原理

1、中断类型码 0H
功能:程序终止产生中断,所以我们可以写一个内存有问题的子程序,调用它就会产生一个 0H 中断

例如:200H / 0H 等于无穷,导致程序内存溢出终止,产生 0H 号中断

key_I:	MOV	AX,200H				;程序错误中断0(200H / 0 = ∞)	
		MOV	BL,0 
		DIV	BL
		JMP	wait

2、中断类型码 60H
这是给用户自定义的中断类型码,所以要产生中断就要调用 60H 中断即可

例如:自己编写 60H 中断,然后调用即可

key_I:	int 60h          		;显示调用,自己定义 60H 中断
		NOP  					;空操作,延时一个机器周期,保证读写    
		JMP wait

三、代码及解释

wait——循环(自己定义的,和关键字重复了,可以修改)
key_Q——程序正常退出
key_I——调用中断
store——保存原来这里的数据
init——设置中断向量
restore——恢复原来这里的数据
newint——中断产生后执行程序

		ASSUME	DS:seg1,CS:seg2
		
seg1	SEGMENT
		intoff	DW	?			;用于保存原中断向量偏移地址
		intseg	DW	?			;用于保存原中断向量段地址
seg1	ENDS

seg2	SEGMENT
start:	MOV AX,seg1
		MOV	DS,AX
		MOV	AX,0
		MOV	ES,AX
		CALL store
		CALL init
		
wait:	MOV	AH,01H				;01H 键盘输入并回显
		INT	21H					;21H DOS系统功能调用
		CMP	AL,'Q'				;根据输入跳转子程序
		JE	key_Q
		CMP	AL,'I'
		JE	key_I
		JMP	wait

key_Q:	CALL restore			
		MOV	AH,4CH				;4CH 带返回码结束
		INT	21H

key_I:	MOV	AX,200H				;程序错误中断0(200H / 0 = ∞)	
		MOV	BL,0 
		DIV	BL
		JMP	wait

store:	MOV	AX,ES:[00H*4]		;保存原来这里的数据
		MOV	intoff,AX
		MOV	AX,ES:[00H*4+2]
		MOV	intseg,AX
		RET
		
init:	MOV	AX,OFFSET newint	;设置中断	;取中断程序偏移地址
		MOV	ES:[00H*4],AX		
		MOV	AX,SEG newint		;取中断程序段地址
		MOV	ES:[00H*4+2],AX
		RET
		
restore:MOV	AX,intoff			;恢复原来这里的数据
		MOV	ES:[00H*4],AX
		MOV	AX,intseg
		MOV	ES:[00H*4+2],AX
		RET
		
		
key_I:	int 60h          		;显示调用,自己定义 60H 中断
		NOP  					;空操作,延时一个机器周期,保证读写    
		JMP wait
		
; store:	MOV	AX,ES:[60H*4]		;保存原来这里的数据
		; MOV	intoff,AX
		; MOV	AX,ES:[60H*4+2]
		; MOV	intseg,AX
		; RET
		
; init:	MOV	AX,OFFSET newint	;取中断程序偏移地址
		; MOV	ES:[60H*4],AX		
		; MOV	AX,SEG newint		;取中断程序段地址
		; MOV	ES:[60H*4+2],AX
		; RET
		
; restore:MOV	AX,intoff			;恢复原来这里的数据
		; MOV	ES:[60H*4],AX
		; MOV	AX,intseg
		; MOV	ES:[60H*4+2],AX
		; RET

newint:	MOV	BP,SP				;开中断,保护寄存器
		ADD	WORD PTR [BP],2
		MOV	AH,02H				;02H 显示输出
		MOV	DL,'A'				;输出 A
		INT	21H
		IRET

seg2	ENDS
		END	start

四、结果

调试输入

-u 				反汇编查看中断调用的地址
-g [address] 	执行到指定地址
-d DS:0 		查看保存原始数据
-d ES:0 		查看中断向量地址
-d ES:180 		查看中断向量地址

1、中断类型码 0H
0H * 4 = 0
可以看到在 ES 中 0000-0003 保存了调用中断的地址,DS 中是以前的保存数据
汇编实验三——中断及查看中断向量地址

2、中断类型码 60H
60H * 4 = 180H
可以看到在 ES 中 0180-0183 保存了调用中断的地址,DS 中是以前的保存数据
汇编实验三——中断及查看中断向量地址

相关标签: 中断