汇编实验三——中断及查看中断向量地址
程序员文章站
2022-06-08 22:56:49
...
一、实验要求
- 查看中断类型码 0H
- 查看中断类型码 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 中是以前的保存数据
推荐阅读