关于杨季文80*86中断处理实例T10-6.ASM的疑问
演示任务的代码段
DemoCodeSEG SEGMENT PARA USE16
ASSUME CS:DemoCodeSEG,DS:DemoDataSEG
DemoBegin:
MOV AX,DemoStack_SEL
MOV SS,AX
MOV SP,DemoStackLEN ;置堆栈
MOV AX,DemoData_SEL
MOV DS,AX ;置数据段
MOV ES,AX
MOV FS,AX
MOV GS,AX
;
MOV AL,11111110B ;置中断屏蔽寄存器
OUT IMREGP,AL ;仅开放时钟中断
STI ;开中断
DemoConti:
CMP FLAG,0 ;判标志
JZ DemoConti ;为0继续
;
CLI ;关中断
;转回临时代码段,准备回实方式
OVER: JUMP16 TempCode_SEL,<OFFSET ToDOS>
;8H号(时钟)中断处理程序的代码段
TICodeSEG SEGMENT PARA USE16
ASSUME CS:TICodeSEG,DS:TIDataSEG
TIBegin:
PUSH EAX
PUSH DS
PUSH FS ;保护现场
PUSH GS
MOV AX,TIData_SEL
MOV DS,AX ;置中断处理程序数据段
MOV AX,EchoData_SEL
MOV FS,AX ;置显示过程数据段
MOV AX,DemoData_SEL
MOV GS,AX ;置演示程序数据段
;
CMP COUNT,0
JNZ TI2 ;计数非0表示未到一秒
MOV COUNT,18 ;每秒约18次
INT 0FEH ;调用0FEH号中断处理程序显示
CMP FS:MESS,'0'
JNZ TI1
MOV GS:FLAG,1 ;显示符号'0'时置标记
TI1: DEC FS:MESS ;调整显示符号
TI2: DEC COUNT ;调整计数
POP GS
POP FS
POP DS
MOV AL,EOICOM
OUT ICREGP,AL ;通知中断控制器中断处理结束
POP EAX
IRETD ;中断返回
TICodeLEN = $ - TICodeSEG
TICodeSEG ENDS
在演示代码段中,调用8h中断的代码是:
STI ;开中断
DemoConti:
CMP FLAG,0 ;判标志
JZ DemoConti ;为0继续
;
CLI ;关中断
那么为什么在8h中断处理程序中,并没有开中断的代码,如果没有的话,cpu在处理中断程序时,不是自动关中断吗,那么我理解8h在运行一次之后,没有开中断的代码,就不能再继续被调用了,有没有大神告知8h中断到底是怎么被调用的呢?