ck17951 发表于 2017-12-23 01:38:13

关于中断tf和if标志的疑问

我又来找大神解惑了,真心求教
比如 int9中断例程:
(1). 取得中断类型码N;

(2). pushf

(3). 设置TF=0, IF=0

(4). push CS

(5). push IP

(6). (IP)=(N*4), (CS)=(N*4+2)

在中断最后要popf

那么popf后if的标志还是1,
这时候如果再有可屏蔽的外部中断,不是又要继续进入中断例程了?这个if=1就一直不管他么?还是说要手动cli

或者说这个if开始就是0,不处理一切可屏蔽中断,
       又或者if开始就是1,要处理一切可平补中断,

还有这个tf单步中断

(2). pushf

(3). 设置TF=0, IF=0

(4). push CS

(5). push IP

(6). (IP)=(N*4), (CS)=(N*4+2)
popf后tf=1,下一次又是单步,岂不是无限单步了?还是有什么别的机制,能让我想什么时候单步就单步中断,不想的时候就连续执行代码
请大神指点迷津

ck17951 发表于 2017-12-23 13:56:44

快来大神

qq1242009750 发表于 2018-1-2 17:08:31

首先你要理解的是 IF和 TF 标志位;

IF:中断标志位(1为响应中断)   TF:单步执行标志位(1为单步执行)

当我们进入中断的时候 要把IF和TF都置零,IF:是因为 你已经进入了中断,就不能在响应别的中断了. TF:单步执行中断的程序也是由一条条的汇编代码组成的,如果不把单步执行去掉的话,则永远会进入到单步执行的中断中。

当我们执行完中断后,把之前的CS IP 和 标志位 恢复到没有进入中断前的样子。
PS:在中断里是不会发生中断的(因为已经把中断标志位屏蔽了)。

理想小青年 发表于 2018-8-26 09:49:11

问题书中有明确的介绍:
CPU在执行完之后将进一步引发单步中断,中断处理的程序也是由一条条程序组成,如果TF入栈之前=1,那么将进入死循环。解决办法入进入中断处理程序之前,设置TF = 0.避免CPU在执行中断程序的时候发生单补中断。也就是说TF=0,IF=0的含义。
那么你的意思汇编代码应该是这样???
TF = 1、 IF = 1;(响应中断之前的寄存器状态)
(1)取得中断类型码N
(2)pushf(这里入栈寄存器包含TF = 1, IF = 1)
(3)TF = 0, IF = 0
(4)cs、ip入栈
(5)(ip) = (N*4), (cs) = (N*4+2)
popf(取出寄存器包含TF = 1, IF = 1,CS , IP)
这时候IF=1 所以如果有可屏蔽中断他就会继续进入中断?
这时候TF=1 所以就单步中断?
而你不想中断这些可屏蔽中断?
@人造人

1113727163 发表于 2019-6-25 13:32:37

理想小青年 发表于 2018-8-26 09:49
问题书中有明确的介绍:
CPU在执行完之后将进一步引发单步中断,中断处理的程序也是由一条条程序组成,如 ...

回答个问题还带着气?最后也没说明白,反而你成了提问题的了
页: [1]
查看完整版本: 关于中断tf和if标志的疑问