|
主题 : : P271页检测点15.1,请教知识点 [待解决] |
回复[ 17次 ]
点击[ 1152次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-12-20 00:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32 |
在书中P271页检测点15.1中有这么一句话:
“其实在我们的int9中断例程中,模拟int指令调用原int9中断例程的程序是可以精简的,因为在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了。”
我不理解,为什么IF和TF都已经置0了? 重点回答这个 | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-12-20 08:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34 |
|
|
|
|
|
[第2楼]
[ 回复时间:2007-12-20 15:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
|
|
|
|
|
[第3楼]
[ 回复时间:2007-12-20 17:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:32
信誉值:0
注册日期:2007-07-14 19:06 |
我们的int9中断执行前已经将IF,TF设为零了。所以我们在中断程序中再模拟int指令调用中断的时候就不用再设置这两个标志位了。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-12-20 23:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32 |
楼上的回答不能让人满意,呵呵
根据这句“在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了。”是可以推断出IF和TF已经设0了,但为什么会设0呢?哪句指令设的?这才是我想问的。
TF=1时会出现单步中断,因为程序一直没有出现单步中断,因此可以推想出TF=0,是吗?
那么IF为什么会是0?
书中在单步中断那一节中提到过,请看这一段
-------------------------------------------------------------------------------------------
CPU当然不能让这种情况发生,解决的办法就是,在进入中断处理程序之前,设置TF=0。从而避免CPU在执行中断处理程序的时候发生单步中断。这就是为什么在中断过程中有TF=0这个步骤,我们再来看一下中断过程:
(1)取得中断类型码N;
(2)标志寄存器入栈,TF=0、IF=0;
(3)CS、IP入栈;
(4)(IP)=(N*4),(CS)=(N*4+2)。
-------------------------------------------------------------------------------------------
如果我没理解错的话,当中断发生时,CPU会做出如下反应,就是(1)、(2)、(3)、(4)步骤。
那么为什么在我们模拟中断的时候,可以省略TF=0、IF=0呢?
难道不担心会出现单步中断吗?
请前辈解答,谢谢! | | |
|
|
|
|
[第5楼]
[ 回复时间:2007-12-21 13:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53 |
在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了。
---------------------------------------
中断机制保证的
进入中断例程之前,中断控制逻辑已经为中断例程的执行和中断调用的合理返回搭建了所需环境,这个环境的搭建包括保存现场过程和相关寄存器调整工作。
所有的问题,又能够按照这个思路获得答案。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2007-12-22 13:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
有些事情不是非要软件指令来做的,有些事情是硬件来做就像是人类的条件反射一样不是非要你想了以后才去做的. | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-03-08 04:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:53
信誉值:0
注册日期:2008-02-09 02:55 |
1.只要按键就引发中断,要引发中断CPU就会做以下一气呵成的工作:
(1)取得中断类型码N;
(2)标志寄存器入栈,TF=0、IF=0;
(3)CS、IP入栈;
(4)(IP)=(N*4),(CS)=(N*4+2)。
2.自己写的中断例程中,模拟中断的时候,可省略TF=0、IF=0的设置。
想想CPU是怎么执行到我们写的中断例程中的?是触发了INT 9,只要触发了中断,不管其例程是什么,
CPU都会上面1里面的那几步,其中包括TF=0,IF=0,这就是为什么CPU执行到我们的模拟中断处的TF、IF均为零的原因。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2008-04-09 18:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-03-22 13:14 |
(1)取得中断类型码N;
(2)标志寄存器入栈,TF=0、IF=0;
(3)CS、IP入栈;
(4)(IP)=(N*4),(CS)=(N*4+2)。
以上这几个步骤,任何人关于不了,包括任何程序,那是CPU里面的逻辑电路在起作用,他们通过晶体管传递的高低电平在控制标寄存器的关闭和打开(也就是让它归0或赋值为1),CPU设计的时候就有这些开关,并彼此相连接,产生逻辑关系.
这就好像,你爸把灯关了,你还用再去再关一次吗?你爸下达的是硬指令. | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-09-02 22:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-07-09 11:14 |
既然"在进入中断例程后,IF和TF都已经置0"是由硬件引起,"没有必要再进行设置了。”,那么"标志寄存器入栈"也必然由硬件做了. 那么我们的“模拟中断”里是否可以再 删一个"pushf", 要是这样,还能和最后的 iret 吻合吗? | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-10-24 07:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-10-15 19:31 |
这就好像,你爸把灯关了,你还用再去再关一次吗?你爸下达的是硬指令.
你是个流氓! | | |
|
|
|
|
[第11楼]
[ 回复时间:2009-02-07 10:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-09 12:50 |
回复:[第7楼]
------------------
如果一气呵成的完成您说的这4步工作,那这道题还可以再精简,把pushf去了应该也没问题,第二步都把这些工作做了啊。还望指教。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2009-02-07 11:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-09 12:50 |
刚刚想了想,应该是这样,首先不能省去pushf
因为我们编写的这个例程中,在调用系统提供的int19之前,cpu是不会做pushf 等那四步工作的,然而在这个例程执行完毕后在两处执行了iret,一是系统的int19结尾,一是我们编写的这个例程结尾,为了与系统int19例程结尾的iret配对,在调用系统的int19前我们需要pushf
至于if,tf是可以省去的,原因书上说的很清楚了。 | | |
|
|
|
|
[第13楼]
[ 回复时间:2009-02-07 11:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-09 12:50 |
|
|
|
|
|
[第14楼]
[ 回复时间:2009-05-06 23:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-04 17:34 |
|
|
|
|
|
[第15楼]
[ 回复时间:2009-09-14 11:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2009-08-16 13:20 |
同意7楼的说法,因为是在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)可以省略掉了 | | |
|
|
|
|
[第16楼]
[ 回复时间:2009-09-14 11:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2009-08-16 13:20 |
最后一句话说得不严谨,应该是"所以(2_2)的设置tf、if为0就可以省略掉了" | | |
|
|
|
|
[第17楼]
[ 回复时间:2010-11-04 16:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-16 19:16 |
我觉得楼上说得不对。一个程序是不是中断例程,关键是它的入口地址有没有在中断向量表里。我们编写的新int9程序的入口已经覆盖了原来的int9程序的入口了(旧的入口地址放于ds:[0]处),那么,对cpu来说,旧的int9程序不就相当于一个普通程序吗?这样的话,应该是不会执行以下4步的。。
取得中断类型码N;
)标志寄存器入栈,TF=0、IF=0;
CS、IP入栈;
(IP)=(N*4),(CS)=(N*4+2)。
按一次键,就只能引发一次中断,相关的设置,也只能一次。
个人见解,求指教。 | | |