一起学习。
①那个call指令就是将程序jmp到指定的地址,原int 9的新入口地址。在call的这个时候,已经在执行新int 9了。书上说,当有键盘输入并到达60h端口时,引发int 9。在中断向量表已改为自己的int 9的入口地址后,就可开始执行自己的int 9中断例程。虽然修改中断向量表之后的任何时刻都可能执行新int 9,但更多时候是在delay子程序的循环中执行新int 9。
过程大致为:(主程序—子程序执行体)按下按键—>引发新int 9 —>调用旧int 9 —>iret—>返回新int 9—>iret—>返回(主程序—子程序执行体)
②cli指令就是使IF标志位设置为0,这样,之后的代码段就不会受到可屏蔽中断的干扰,直至sti指令使IF复位为1。
如果不加入cli,而恰好在执行“mov word ptr es:[9*4],200h”时引发了中断,ip已改为新值,但“mov word ptr es:[9*4+2],0”没有接着执行,cs没有被改为新值0,cs:ip被扭曲成不匹配的地址对,cpu就转到错误的地方去执行了。 |