“其实在我们的int9中断例程中,模拟int指令调用原int9中断例程的程序是可以精简的,因为在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了。”
我不理解,为什么IF和TF都已经置0了?
==================
中断过程如下:
(1)标志寄存器入栈
(2)IF=0;TF=0
(2)call dword ptr sa:[idata]
在原来的int9中断过程中,(1)(2)步骤并不是在int9这个程序的源代码中执行的,而在我们的程序中我们在我们的int9中断中调用了以前的int9中断的代码部分,这种调用相当于普通的子程序调用,cpu不会进行(1)(2)步的设置,所以,我们手动进行了设置,但是我们知道,当键盘中断产生调用我们的int9中断前已经执行了(1)(2)步,也就是说进入我们的int9后TF,IF都已经是0了,所以,在我们调用原来的int9之前,没有必要在进行TF和IF归0的设置了。
------------------
回复:那为什么检测点15.1又说“如果在执行设置int9中断例程的段地址和偏移地址的指令之间发生了键盘中断”???如果当时IF为0的话不是不会响应这个中断吗?
这帖子好早哦……还是希望有人来回答下啊
虽然帖子比较早,但我说下我的理解:
(1)产生键盘中断-->(2)找到0000:[9*4],0000:[9*4+2]这地方的偏移定址和段地址-->(3)转到上一步段地址和偏移地址指定的程序-->(4)在这个程序里调用call word ptr ds:[0]处理其他硬件细节-->(5)返回
在第(1)步时就已经设置了if=0,tf=0,所以当我们进入第(3)步(也就是我们自己写的int9子程序)时就不用再设置if=0,tf=0了
回复:那为什么检测点15.1又说“如果在执行设置int9中断例程的段地址和偏移地址的指令之间发生了键盘中断”???如果当时IF为0的话不是不会响应这个中断吗?
这帖子好早哦……还是希望有人来回答下啊
这个问题和上面所说的问题应该没什么联系,这里说的是设置int9中断例程,也就是
(1)mov word ptr es:[9*4],offset int9
(2)mov es:[9*4+2],cs
“如果在执行设置int9中断例程的段地址和偏移地址的指令之间发生了键盘中断”这段话其实很好理解
假如原来的es:[9*4]和es:[9*4+2]是0000:0001,而offset int9=0003,cs=00002.这样我们做完第(1)步后
中断例程的地址就变成了0001:0003,如果这是发生了一个键盘中断(如果此时if=1,cpu响应中断)那么cpu就会去执行0001:0003的程序,而不是我们希望的0002:0003,因为这时第(2)步还没执行。
总之就是要保证(1)(2)中间不能有中断,它们要一次完成。就好像设置了ss后,cpu不响应中断而是直接接着设置sp。只要在(1)前面加上cli,在(2)后面加上sti就行了。
说得很啰嗦,呵呵! |