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

一、实验要求

  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 中是以前的保存数据
在这里插入图片描述

发布了113 篇原创文章 · 获赞 109 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_42109012/article/details/103160728