编程语言
首页 > 编程语言> > 中断程序设计(微机原理实验三)

中断程序设计(微机原理实验三)

作者:互联网

实验三 中断程序设计
实验目的:
1.掌握中断概念,掌握中断程序设计方法;
2.掌握中断程序调试方法。
实验步骤与任务:
任务一(占总分30%):
1.编辑
利用编辑器(记事本,也可采用其它编辑器)建立一个名为ASM3.ASM的文本文件,内容如下:
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
INT 21H
CMP AL,‘Q’
JE key_Q
CMP AL,‘I’
JE key_I
JMP wait

key_Q: CALL restore
MOV AH,4CH
INT 21H

key_I: MOV AX,200H
MOV BL,0
DIV BL
JMP wait

store: MOV AX,ES:[00H4]
MOV intoff,AX
MOV AX,ES:[00H4+2]
MOV intseg,AX
RET

init: MOV AX,OFFSET newint
MOV ES:[00H4],AX ; 中断类型0的偏移地址送物理地址00004H
MOV AX,SEG newint
MOV ES:[00H4+2],AX
RET

restore: MOV AX,intoff
MOV ES:[00H4],AX
MOV AX,intseg
MOV ES:[00H4+2],AX
RET

newint: MOV BP,SP
ADD WORD PTR [BP],2
MOV AH,02H
MOV DL,‘A’
INT 21H
IRET

seg2 ENDS

	END		start

1
2.运行
经过汇编和链接后,运行程序并记录运行过程。
3.调试
利用DEBUG命令载入程序。
利用DEBUG命令单步运行,观察并记录00H中断向量的变化情况。
利用DEBUG命令设置断点在newint行,当中断产生时,观察并记录程序的运行过程。
任务二(占总分20%):
1.编写60H中断程序
将程序改写为响应60H中断请求,并要求使用DOS功能调用的方式设置中断向量。
重复任务一中的步骤3的调试。
(1) 提示思路:将中断类型00H改为60H
例如原来store子程序为:
store: MOV AX,ES:[00H4]
MOV intoff,AX
MOV AX,ES:[00H4+2]
MOV intseg,AX
RET
改为:
store: MOV AX,ES:[60H4]
MOV intoff,AX
MOV AX,ES:[60H4+2]
MOV intseg,AX
RET
其他2处类似。

(2) 改写key_I:标号后的代码
key_I: int 60h ;显示调用
NOP
JMP wait
预习(预习报告占总分20%):

学习中断过程,写出查看内存中的中断向量的0、中断向量60H的DEBUG命令。
按任务二的要求编写程序主要片段。
实验报告要求(实验报告占总分30%):
1.首先写出预习任务:任务二中的要求,写出源程序。
2.记录任务一、任务二的调试的操作及其结果。可用屏幕拷贝记录,打印后贴在报告中。
3.回答以下问题:
(1) 程序中init部分的作用是什么?
(2) 程序中store和restore部分的作用是什么?去掉后对程序运行有何影响?
(3) 程序中newint部分什么时候被调用运行?
(4) 任务二中改写的程序中newint部分什么时候被调用运行?如何产生60H中断事件?
重要提示:必须完成预习任务,方可进入实验室完成实验。
代码
代码一:shiyan31.asm
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 ;代码段CS的初始地址
CALL store
CALL init

wait: MOV AH,01H ;主函数
INT 21H ;输入送至AL
CMP AL,‘Q’
JE key_Q
CMP AL,‘I’
JE key_I
JMP wait

key_Q: CALL restore ;重载初始中断服务程序
MOV AH,4CH ;退出至DOS
INT 21H ;程序结束

key_I: MOV AX,200H
MOV BL,0
DIV BL
JMP wait

store: MOV AX,ES:[00H4] ;存储原始0号中断向量
MOV intoff,AX
MOV AX,ES:[00H4+2]
MOV intseg,AX
RET

init: MOV AX,OFFSET newint ;自定义中断类型0的偏移地址以及段地址
MOV ES:[00H4],AX
MOV AX,SEG newint
MOV ES:[00H4+2],AX
RET

restore: MOV AX,intoff ;中断向量复位
MOV ES:[00H4],AX
MOV AX,intseg
MOV ES:[00H4+2],AX
RET

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

seg2 ENDS

	END		start

1
代码二:shiyan32.asm
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
waitfor: MOV AH,01H
INT 21H
CMP AL,‘Q’
JE key_Q
CMP AL,‘I’
JE key_I
JMP waitfor

key_Q: CALL restore
MOV AH,4CH
INT 21H

key_I: CLI
PUSH DS
MOV DX, OFFSET newint
MOV AX, SEG newint
MOV DS, AX
MOV AH, 60H
MOV AL, 0
INT 60H
POP DS
STI
JMP waitfor

store: MOV AX,ES:[60H4]
MOV intoff,AX
MOV AX,ES:[60H4+2]
MOV intseg,AX
RET

init: MOV AX,OFFSET newint
MOV ES:[60H4],AX
MOV AX,SEG newint
MOV ES:[60H4+2],AX
RET

restore: MOV AX,intoff
MOV ES:[60H4],AX
MOV AX,intseg
MOV ES:[60H4+2],AX
RET

newint: MOV BP,SP
ADD WORD PTR [BP],2
MOV AH,02H
MOV DL,‘A’
INT 21H
IRET

seg2 ENDS

	END		start

————————————————
版权声明:本文为CSDN博主「执著的追求者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_48173199/article/details/115336285

标签:newint,中断,MOV,00H4,微机,key,AX,程序设计,ES
来源: https://blog.csdn.net/qq_48173199/article/details/115336393