批注:
在装载新的int 9中断程序后,键盘按下某键会按照以下流程触发相应事件。
1、CPU取中断类型码9;
2、标志寄存器入栈;
3、设置IF=0,TF=0;
4、CS、IP入栈;
5、读取0:24h的内容,IP=204H,CS=0H,进入新的int 9例程;
6、标志寄存器入栈(47行);
7、因在步骤2中,已经设置IF=0,TF=0了,所以此处不需再设置;
8、call dword ptr cs:[200h],实现了CS、IP入栈,IP=200H,CS=0H,跳转至原int 9例程;
9、iret(66行),CS、IP出栈(对应的是步骤8中的CS、IP入栈),标志寄存器出栈(对应的是步骤6的标志寄存器入栈操作);
10、CS、IP出栈(对应的是步骤4中的入栈操作);
11、标志寄存器出栈(对应的是步骤2中的标志寄存器入栈);
在装载新的int 9中断程序后,键盘按下某键会按照以下流程触发相应事件。
1、CPU取中断类型码9;
2、标志寄存器入栈;
3、设置IF=0,TF=0;
4、CS、IP入栈;
5、读取0:24h的内容,IP=204H,CS=0H,进入新的int 9例程;
6、标志寄存器入栈(47行);
7、因在步骤2中,已经设置IF=0,TF=0了,所以此处不需再设置;
8、call dword ptr cs:[200h],实现了CS、IP入栈,IP=200H,CS=0H,跳转至原int 9例程;
9、iret(66行),CS、IP出栈(对应的是步骤8中的CS、IP入栈),标志寄存器出栈(对应的是步骤6的标志寄存器入栈操作);
10、CS、IP出栈(对应的是步骤4中的入栈操作);
11、标志寄存器出栈(对应的是步骤2中的标志寄存器入栈);
12、继续执行其他程序,直到键盘发生操作继续从步骤1开始新的中断程序。
assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9 ;将ds:si指向源地址