. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  请教一个知识点,关于TF和IF的问题  [待解决] 回复[ 30次 ]   点击[ 2067次 ]  
philmei
[帖 主]   [ 发表时间:2007-12-19 00:35 ]   [引用]   [回复]   [ top ] 
荣誉值: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
[第1楼]   [ 回复时间:2007-12-19 00:56 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
补提一个问题

在书中P271页检测点15.1中的这么一句话
“其实在我们的int9中断例程中,模拟int指令调用原int9中断例程的程序是可以精简的,因为在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了。”
我不理解,为什么IF和TF都已经置0了?
如果在模拟int9时不手动置0,会不会引发TF=1时的错误?

这跟问题跟我上边问的属于一个范畴,上边那个问题要是我懂了这个就也能懂了。
fishboy
[第2楼]   [ 回复时间:2007-12-19 06:48 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
1.在没有发生任何中断的时候,TF应该默认为0吧?不然TF=1会引发内中断。
============
首先确定一点,TF引发的是单步中断。TF的置位并不一定是中断程序,任何程序都能够将其置位。所以,在没有任何中断的时候,TF的值也很难确定是什么的。当然,可以从现象上看出TF是否为1,那就是看是否发生了单步中断。比如说,我们在debug下,在我们输入T之前,TF=0,输入T之后,就会在执行一条指令后引发中断然后返回到debug。
 
2.当某一情况引发了中断的时候,TF变为1,而后,CPU响应中断,取得中断类型码,再将标志寄存器入栈,入栈 
时TF是否也等于1?还是说当CPU采用中断后会自动将TF设回0? 
================
在TF=1时,既然入栈的是标志寄存器,当然入栈是TF=1了。由于中断最后做了一个popf,所以,推断TF=0是在中断完毕后cpu自动设置的吧。

3.如果当时将TF=1入栈了,等中断程序执行完后我们用iret将标志寄存器出栈,那时TF不是又为1了吗?又会引 
发中断,但无缘无故引入的中断,中断类型码又是多少?相信CPU不会同意TF为1的。 
===============
这和上面的问题是一个问题,应该是cpu在中断后做了TF=0的操作。说上有一句“iret通常和硬件自动完成的中断过程配合使用”是不是包含着这个意思呢。
fishboy
[第3楼]   [ 回复时间:2007-12-19 06:53 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
我又思考,难道说起跳的外中断就是只管起跳,当跳起后,起跳的外中断就已经执行完成了?落地时CPU又再次 
确定落点? 
=====================
对于你的第二个方面的问题,我就有一个看法:你说的情况基本是多任务操作系统的。即使是单任务操作系统,比如说DOS,我们依然能够模拟多任务现象,所以,你看到的都是现象,不能这样下结论的吧。
fishboy
[第4楼]   [ 回复时间:2007-12-19 07:02 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
1.在CPU不执行程序时,TF是否默认为0?如果是那么 
==========
不执行程序是个什么概念?如果压根一点程序都没有执行,TF为0为1的考虑好像就没有什么意义了吧。我觉得应该是我们在什么情况下将TF保持0,什么情况下保持1。只要之前的运行环境适合了那种情况,那么TF就应该为响应的值。至于默认值,我觉得在绝对意义上的“没执行程序”的时候,应该为0吧。因为这样才不会影响任何程序。可能观点说的有点歪,是因为我实在不知道怎么追究那个根。呵呵

2.中断引发的标志寄存器入栈,当时TF是否为1? 
======
应该是。

3.中断例程执行完后,咱们用iret将标志寄存器出栈,TF的值为多少?
====================
之前入栈的值。
 
4.CPU不执行中断时,IF是否默认为1,以便随时等待接收输入信号?
=================
从分析TF=0的角度来说,我也倾向于你的看法。
 
5.是否只有在处理中断的过程时,IF才会等于0? 
================
你可以在你的任何程序中使用cli和sti来设置IF的值。
fishboy
[第5楼]   [ 回复时间:2007-12-19 07:03 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
以上只代表本人的个人观点!欢迎指正!
philmei
[第6楼]   [ 回复时间:2007-12-19 07:57 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
兄弟你这么早啊?呵呵
我的问题有点意思吧?
fishboy
[第7楼]   [ 回复时间:2007-12-19 08:03 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
老有意思了!!!
philmei
[第8楼]   [ 回复时间:2007-12-19 09:48 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
如果CPU在出栈后将TF归0了,那么是否也将IF设成1了呢?
不然怎么随时接收键盘等等的输入信号呢?

请看我在第1楼中的问题
----------------------------------------------------------------------
在书中P271页检测点15.1中的这么一句话 
“其实在我们的int9中断例程中,模拟int指令调用原int9中断例程的程序是可以精简的,因为在进入中断例程后,IF和TF都已经置0,没有必要再进行设置了。” 
我不理解,为什么IF和TF都已经置0了? 
----------------------------------------------------------------------

照您的说法,TF置0说的通了,那么IF为什么也是0呢?
如果CPU在出栈后把TF置0了,为什么这么重要的事王老师都不在书中也不提一下哇!!!

您的解答哪条是有把握的,哪条是自己的推想,可否告知呀,我还等着做题哇,愁死我了。
philmei
[第9楼]   [ 回复时间:2007-12-19 10:30 ]   [引用]   [回复]   [ top ] 
荣誉值: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?




您别挑理,我这人学东西就这脾气,总是喜欢刨根问底,心里存着疑问想不开就会特别扭,咱们一块来讨论讨论
sgyy
[第10楼]   [ 回复时间:2007-12-19 19:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-24 10:41
支持楼主刨根问底的劲头~
mouse
[第11楼]   [ 回复时间:2007-12-20 09:01 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
看不懂,路过了。。。
Wednesday
[第12楼]   [ 回复时间:2007-12-21 13:19 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
进入中断例程之前,中断控制逻辑已经为中断例程的执行和中断调用的合理返回搭建了所需环境,这个环境的搭建包括保存现场过程和相关寄存器调整工作。

所有的问题,都能够按照这个思路获得答案,不然的话,很多问题是无法解答的。个人观点。
fishboy
[第13楼]   [ 回复时间:2007-12-23 11:02 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
您的解答哪条是有把握的,哪条是自己的推想,可否告知呀,我还等着做题哇,愁死我了。
======================
如果说我所有回答的问题都是自己推断的,楼主是不是就一句话都不信了呢?每个人知识都有局限性,我只是在我的知识基础上做自己认为合理的推断。我要说我什么都会,那不是骗你,那是骗我自己!

如果CPU在出栈后把TF置0了,为什么这么重要的事王老师都不在书中也不提一下哇!!! 
=========================
其实好多重要的知识王老师都没有在“应该提到”的地方提到。一是,那些地方可能不提及会更有利于学习者;二是,有些知识,在现在的知识基础上提出,估计会使读者反受其乱。这也是我自己的观点。
fishboy
[第14楼]   [ 回复时间:2007-12-23 11:25 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
“其实在我们的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的设置了。
taotling
[第15楼]   [ 回复时间:2008-03-08 04:46 ]   [引用]   [回复]   [ top ] 
荣誉值:53
信誉值:0
注册日期:2008-02-09 02:55
philmei,哥们你太有意思了,
这帖子看得我一直在笑,
看来你一直对单步中断的引发过程中TF的值和单步中断例程执行完后的TF值很困惑。
呵呵。

我是这样觉得的,
CPU看到TF=1就要去做引发中断过程的那几件事,这几件事是一气呵成不可中断的,包括:
1.取得中断类型码 
2.将标志寄存器入栈 
3.将TF和IF都设为0 
4.将当前CS和IP入栈 
5.到"中断向量表"中"中断类型码"所对应的位置找"中断例程"的地址,再将"中断例程"的IP和CS分别出栈 

当执行完这个中断的中断例程后,
IRET
肯定TF=1

那么什么时候TF=0?
等着你给CPU指令,当你给CPU指令后CPU肯定执行相应的指令去更改TF,使得TF=0,
从而跳出单步状态。
jhszcn
[第16楼]   [ 回复时间:2008-04-11 12:56 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
这里错了
我的理解: 
当CPU执行完某条指令后,会自动检察TF的值是否为1,如果TF=1则引发内中断 
然后会 
1.取得中断类型码 
2.将标志寄存器入栈 
3.将TF和IF都设为0 
4.将当前CS和IP入栈 
5.到"中断向量表"中"中断类型码"所对应的位置找"中断例程"的地址,再将"中断例程"的IP和CS分别出栈 
=============================================
第五步,再将"中断例程"的IP和CS分别出栈这里不对,是跳转到中断例程对应位置
sinawear
[第17楼]   [ 回复时间:2009-06-11 23:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
看到各位的帖子可谓,上天入地.上及魂斗罗,下及TF,透漏出无数的迷茫..好啊.隐约感觉此帖,被王老师看过.赶急回帖吧.
小弟也想参一卡,可是你们看得是第一版,小弟看的是第二版,有了版沟....
============================================
总结一下我提出的问题,以便于回答:
1.在CPU不执行程序时,TF是否默认为0?如果是那么
2.中断引发的标志寄存器入栈,当时TF是否为1?
3.中断例程执行完后,咱们用iret将标志寄存器出栈,TF的值为多少?
4.CPU不执行中断时,IF是否默认为1,以便随时等待接收输入信号?
5.是否只有在处理中断的过程时,IF才会等于0? 
=============================================
1.答:以我知识,当然为0呀.
2.答:如果指的是入栈的TF,TF=0(因为它以前就是0),如果说入栈的下一毫秒的话,我的理解是TF是单步中断位,既然没有单步中断,那么,去理TF干吗呢?
3.答:TF值当然还是0.
4.答:恩
5.答:不知道.
zhy_zhy
[第18楼]   [ 回复时间:2009-08-03 22:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-06-29 14:39
“其实在我们的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的话不是不会响应这个中断吗?
这帖子好早哦……还是希望有人来回答下啊
891204dh
[第19楼]   [ 回复时间:2009-08-31 04:27 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
这个问题啊?认真看书就懂了.希望大家都能认真的看书,分析书上是怎么说的!
fyjava
[第20楼]   [ 回复时间:2009-11-21 15:52 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
值得探讨,这个问题我也没搞清
yezuopou
[第21楼]   [ 回复时间:2009-12-16 17:12 ]   [引用]   [回复]   [ top ] 
荣誉值: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就行了。

说得很啰嗦,呵呵!
pamire
[第22楼]   [ 回复时间:2010-03-07 12:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-21 10:17
taotling[15楼](16楼补纠正)已经说清楚了
个人理解:
dos是单任务执行,正常情况下要从逻辑上顺序执行完一段程序之后才执行下一段程序,当更重要更紧急的程序需要处理时,这时就采用中断方式来处理,就有了中断情况

在处理中断过程中设置:"3.将TF和IF都设为0" 的目的是为了原子操作(不可分割的意思)完当前的中断例程,不允许被其它的中断例程打断,也就是处理当前中断例程时CPU不会立即执行其它的中断请求

上面说的也是对第2版p273
"将IF置0的原因就是,在进入中断处理程序后,禁止其它的可屏蔽中断"的理解
ly153870727
[第23楼]   [ 回复时间:2012-03-11 17:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-03-09 14:40
我也仔细看了看   我觉得taotling 【15楼】已经讲的很清楚了。。 个人认为也是这样的。。中断过程都是硬件自动完成的,在完成中断过程中是不可以被再中断的。。
vsoft
[第24楼]   [ 回复时间:2019-02-21 16:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-11-27 16:20
[
再假设一种情况,就是当我用电脑打游戏的时候,比如“魂斗罗或反恐精英CS”,相信大伙都玩过的。 
跳起来打枪的现象。 
操作全过程:让小人儿向前跳,跳起来时打枪,后落地。 
当我按前和跳的时候,小人儿向前跳了起来。此时应该会引发一个外中断,因为我的输入被CPU执行了。而我又 

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

说之前起跳外中断还没结束,那时IF应该等于0,CPU怎么会又执行了新的外中断? 
],其中“但我之前跳的这一下还没落地,也就是说之前起跳外中断还没结束”,CPU一秒钟可以执行几千万到几十亿次指令,你竟然会认为小人落地的时候中断还没结束.....老哥,这有点逗了,小人跳上跳下那一会CPU估计都跑了几百万条指令了吧。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved