. : : 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?

以上是我学习这章时的疑问,望前辈们给予指点。谢谢!
philmei
[第9楼] [ 回复时间:2007-12-19 10:30 ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
====================================================================
首先确定一点,TF引发的是单步中断。TF的置位并不一定是中断程序,任何程序都能够将其置位。所以,在没有任何中断的时候,TF的值也很难确定是什么的。当然,可以从现象上看出TF是否为1,那就是看是否发生了单步中断。比如说,我们在debug下,在我们输入T之前,TF=0,输入T之后,就会在执行一条指令后引发中断然后返回到debug。
====================================================================
回复:
我说一下我的理解,当然不一定对哈,如果错了您再指教。
CPU在执行完一条指令后,就会自动检测TF的值,如果为1就会引发内中断----单步中断。
这个事儿在书中P239页上数第三段的第一句话中有提到。
TF的值是多变的,因为在不引发中断的平静状态时,它为0;在引发中断时的一瞬间它为1
我的描述言语可能很差劲,您能看懂我的意思不?




====================================================================
在TF=1时,既然入栈的是标志寄存器,当然入栈是TF=1了。由于中断最后做了一个popf,所以,推断TF=0是在中断完毕后cpu自动设置的吧。
====================================================================
回复:
popf指令只是将标志寄存器出栈,但出栈后的TF应该为1,然后CPU会自动将TF设成0,是这个意思吧?
可我总放不下心来这样认为,CPU会做这事儿?




====================================================================
我又思考,难道说起跳的外中断就是只管起跳,当跳起后,起跳的外中断就已经执行完成了?落地时CPU又再次  
确定落点?  
===================== 
对于你的第二个方面的问题,我就有一个看法:你说的情况基本是多任务操作系统的。即使是单任务操作系统,比如说DOS,我们依然能够模拟多任务现象,所以,你看到的都是现象,不能这样下结论的吧。
====================================================================
回复:
什么是多任务操作系统?与单任务操作系统的工作原理不一样吗?这个我就不清楚了,请指教。
但我觉得,虽然看到的是现象,但起码跳起跟开枪都要向CPU传送指令吧?原理应该差不多吧?




====================================================================
不执行程序是个什么概念?如果压根一点程序都没有执行,TF为0为1的考虑好像就没有什么意义了吧。我觉得应该是我们在什么情况下将TF保持0,什么情况下保持1。只要之前的运行环境适合了那种情况,那么TF就应该为响应的值。至于默认值,我觉得在绝对意义上的“没执行程序”的时候,应该为0吧。因为这样才不会影响任何程序。可能观点说的有点歪,是因为我实在不知道怎么追究那个根。呵呵 
====================================================================
回复:
用文字描述我心里想的CPU当时的状态我比较笨,哈哈,我想的不执行程序的时候就是在没有发生任何中断的时候。
对了,单步中断是一个单独的概念吗?还是说所有的中断引发的都是单步中断的?




====================================================================
5.是否只有在处理中断的过程时,IF才会等于0?  
================ 
你可以在你的任何程序中使用cli和sti来设置IF的值。
====================================================================
回复:
嗯,是可以用cli和sti设置IF的值,这在书中P262页中提到了。
如果不人为的改变IF的值,那么是否只有在处理中断的过程时,IF才会等于0?




您别挑理,我这人学东西就这脾气,总是喜欢刨根问底,心里存着疑问想不开就会特别扭,咱们一块来讨论讨论
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved