. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
主题 : :  请教一个知识点,关于TF和IF的问题  [待解决] 回复[ 30次 ]   点击[ 2069次 ]  
philmei
[帖 主] [ 发表时间:2007-12-19 00:35 ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
我想请教2个问题。

一、
我的理解:
当CPU执行完某条指令后,会自动检察TF的值是否为1,如果TF=1则引发内中断
然后会
1.取得中断类型码
2.将标志寄存器入栈
3.将TF和IF都设为0
4.将当前CS和IP入栈
5.到"中断向量表"中"中断类型码"所对应的位置找"中断例程"的地址,再将"中断例程"的IP和CS分别出栈

请问:
1.在没有发生任何中断的时候,TF应该默认为0吧?不然TF=1会引发内中断。
2.当某一情况引发了中断的时候,TF变为1,而后,CPU响应中断,取得中断类型码,再将标志寄存器入栈,入栈

时TF是否也等于1?还是说当CPU采用中断后会自动将TF设回0?
3.如果当时将TF=1入栈了,等中断程序执行完后我们用iret将标志寄存器出栈,那时TF不是又为1了吗?又会引

发中断,但无缘无故引发的中断,中断类型码又是多少?相信CPU不会同意TF为1的。

二、
再请教一个有关可屏蔽中断的问题
书中P262页最后一段中说:“几乎所有由外设引发的外中断,都是可屏蔽中断。”
书中P262页最上边一段中说:“可屏蔽中断是CPU可以不响应的外中断。CPU是否响应可屏蔽中断,要看标志寄存

器的IF位的设置。当CPU检测到可屏蔽中断信息时,如果IF=1,则CPU在执行完当前指令后响应中断,引发中断过

程;如果IF=0,则不响应可屏蔽中断。”

请问:
假设一种情况,硬盘此时正在copy数据,此时打开记事本,在其中打字。
有时会发现字显示的很慢的情况,但最后都可显示出来。
根据这一情况,我推想,打字时引发了外中断,而且当时IF=1,因为CPU必竟响应了键盘输入。之所以没有立刻

显示出来,是因为程序运行时将IF设为了0。
1.CPU在不处理程序的时候,IF是不是始终保持在IF=1的状态?以便随时等待接收输入设备的信号
2.不响应可屏蔽中断的情况是否'有,且只有'当CPU调用某一中断时将IF设为了0的时候?

再假设一种情况,就是当我用电脑打游戏的时候,比如“魂斗罗或反恐精英CS”,相信大伙都玩过的。
跳起来打枪的现象。
操作全过程:让小人儿向前跳,跳起来时打枪,后落地。
当我按前和跳的时候,小人儿向前跳了起来。此时应该会引发一个外中断,因为我的输入被CPU执行了。而我又

在小人儿没落地之前开枪了,CPU也执行了,说明又引发了一个外中断。但我之前跳的这一下还没落地,也就是

说之前起跳外中断还没结束,那时IF应该等于0,CPU怎么会又执行了新的外中断?
我又思考,难道说起跳的外中断就是只管起跳,当跳起后,起跳的外中断就已经执行完成了?落地时CPU又再次

确定落点?

可能我第二次分析的对,但我不确定。

总结一下我提出的问题,以便于回答:
1.在CPU不执行程序时,TF是否默认为0?如果是那么
2.中断引发的标志寄存器入栈,当时TF是否为1?
3.中断例程执行完后,咱们用iret将标志寄存器出栈,TF的值为多少?
4.CPU不执行中断时,IF是否默认为1,以便随时等待接收输入信号?
5.是否只有在处理中断的过程时,IF才会等于0?

以上是我学习这章时的疑问,望前辈们给予指点。谢谢!
yezuopou
[第21楼] [ 回复时间:2009-12-16 17:12 ] 
荣誉值:0
信誉值:0
注册日期:2009-12-06 23:23
“其实在我们的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就行了。

说得很啰嗦,呵呵!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved