关于JNB TF0,$这条指令,问问大家,恳请哪位大虾给小弟解答一下

[复制链接]
7475|9
 楼主| dqstar 发表于 2007-8-20 18:29 | 显示全部楼层 |阅读模式
JNB (中断标志位),$
这条指令,原地等待中断,
例如:
JNB TF0,$

有一个问题,当发生中断时,
执行完中断服务程序返回后,
糸统从哪里开始执行??
继续执行这一个指令,还是执行这条指令的下一条指令??

我用KEIL C51仿真的时候,如果用串行口仿真的输入框,手动将TF0置为1,执行中断服务程序,RETI返回后,从这个条指令的下一条指令开始执行

但是如果我不是手动置TF0,一直单步运行,或直接运行到光标处(光标设在中断服务程序里),RETI返回后,还在执行这条指令......
zpf111 发表于 2007-8-20 18:53 | 显示全部楼层

等待 TF0 变为 1(忘记了是变为1还是0),否则一直执行这条语句。
conwh 发表于 2007-8-20 19:00 | 显示全部楼层

既然用中断了,还检测它干什么。

diannaoza 发表于 2007-8-20 19:31 | 显示全部楼层

同时开中断并查询中断位的问题?

开了中断,并在同时查询中断

jnb tf0,$
;;等中断。
当时间溢出置tf0=1,并进入了中断00bh
执行00bh后硬件自动清tf0为0.
接者再jnb tf0,$,此时当然还在运行此句。

原因:
jnb 为2周期指令。

而中断采样为每个周期的s5p2进行采样。自然比jnb更快执行。

所以中断完后,还会在这条语句:jnb tf0,$.


有见解的说说,谢谢!

 楼主| dqstar 发表于 2007-8-20 19:43 | 显示全部楼层

为什么手动将TF0置为1,中断返回后,执行下面一条语句?

为什么仿真时
手动将TF0置为1,中断返回后,执行下面一条语句?

我想让它先等待中断,中断后,执行中断服务程序,返回时,再往下执行
diannaoza 发表于 2007-8-20 19:46 | 显示全部楼层

手动将TF0置为1,中断返回后,执行下面一条语句?

我的理解为什么手动会产生,执行了jnb tf0,$,的下一条指令。

因为:你的手动执tf0=1时,不是在s5p2进行,你也不可能做到。
不知我说的对否.
 楼主| dqstar 发表于 2007-8-20 19:54 | 显示全部楼层

我觉得执行下一条语句是合理的

我认为:
TF0=1时,虽然要进入中断,但是糸统仍然要等当前这条指令 JNB TF0,$ 执行完,
此时,如果无中断服务程序,PC会指向下一条语句,所以进入中断时,压入堆栈的是这个语句的下一条语句的地址;
我觉得这样是合理的,不知道为什么它还在那里转
diannaoza 发表于 2007-8-20 20:45 | 显示全部楼层

统仍然要等当前这条指令 JNB TF0,$ 执行完

没错是执行完,此时也符合tf=0,因为没有发生中断。
执行完后接着就进入了000bh
执行后硬件自动清tf0为0
再返回(reti)
此时再执行你的jnb tf0,$
因为发了中断出来,此时的tf0=0.
所以不会执行下条语句。

我的理解如上。
 楼主| dqstar 发表于 2007-8-20 21:04 | 显示全部楼层

谢谢diannaoza

嗯,我还是不太明白,佑计可能和时序有关糸
不过还是要谢谢diannaoza
twz8858877 发表于 2007-8-20 21:37 | 显示全部楼层

diannaoza说的对

中断响应时会将下一条指令的入口地址压栈,由于JNB TF0,$的下一条指令入口地址就是该条指令,所以中断响应后还在原地。一般这条指令用在未开放中断的场合,或者需要软件清除中断标志的场合,如TF2、RI、TI等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部