检测点15.1

来源:互联网 发布:淘宝购物车登录 编辑:程序博客网 时间:2024/05/01 21:08

题目(一):仔细分析一下上面的int9中断例程,看看是否可以精简?

对于程序段:

可以精简为:

___(1)_____

___(2)_____

 

解答:因为是在int9中调用原来的int 9中断例程,而在我们进入int9这个中断程序时要做以下步骤:
(1_1)取得中断类型码N;  
(1_2)标志寄存器入栈,TF=0、IF=0;  
(1_3)CS、IP入栈;  
(1_4)(IP)=(N*4),(CS)=(N*4+2)。 
当做完以上步骤再来执行程序。在执行程序得 过程中需要调用原来的int 9中断例程。所以也要进行相应的设置:

(2_1)取得中断类型码N;  
(2_2)标志寄存器入栈,TF=0、IF=0;  
(2_3)CS、IP入栈;  
(2_4)(IP)=(N*4),(CS)=(N*4+2)。 
但是我们知道在(1_2)时已经把tf、if设置为0 。所以(2_2)这一步的设置tf、if为0可以省略掉了.所以可以精简为:

题目(二):仔细分析上面的程序中的主程序,看看有什么潜在问题?

在主程序中,如果在执行设置int 9中断例程的段地址和偏移地址的指令之间发生了键盘中断,则cpu将转去一个错误的地址执行,将发生错误。着处这样的程序段,改写他们,排除潜在的问题。

源代码:

分析:也就是在执行这两条指令时:

可能会发生错误,建设执行了mov word ptr es:[984】,offset int9这句指令后,接收到了键盘中断,那么cpu就要相应中断,就要设置cs、ip,但是这时ip的值是改变了,但是cs的值却还没有来得及改变。则此时cs:ip将会指向一个既不是新int 9中断例程的入口处,也不是指向旧int9中断例程的入口处。这时肯定会引起错误。所以我们要把屏蔽掉键盘中断。即先要设置if=0。执行完之后再恢复这两条指令后再将其设置为1。

所以上面的两条指令应该改为:

原创粉丝点击