|
主题 : : 书中的中断过程是不是有问题? [待解决] |
回复[ 11次 ]
点击[ 596次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-11-25 12:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
1,取得中断类码N:
2,PUSHF
3,TF=O,IF=0
4,PUSH CS
5,PUSH IP
6,IP=N*4,CS=N*4+2
这里的2步和3步是不是应该换一下.
1,3,2,4,5,6这个顺序 | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-11-25 13:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42 |
楼主记得这样一句话么?
当你用到某个寄存器的时候,一定要保存当前寄存器的值,以免在你程序完成后不能够正确返回之前的运行状态。
2、3颠倒了,如果你程序执行完了,你还能得到你程序运行前的标志寄存器的内容么? | | |
|
|
|
|
[第2楼]
[ 回复时间:2007-11-27 11:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
你自已想一下PUSHF 那TF=1,IF=1好等中断程序完了后IRET,TF=1,IF=1又要中断. | | |
|
|
|
|
[第3楼]
[ 回复时间:2007-11-27 11:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
你自已想一下PUSHF 那TF=1,IF=1好等中断程序完了后IRET,TF=1,IF=1又要中断. | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-12-12 11:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:19
信誉值:0
注册日期:2007-07-05 17:25 |
TF=1,IF=1是允许中断不是又要中断,中断也是要调用的。只有允许了调用可屏蔽中断才会执行。楼主明白。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2007-12-13 14:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
你说的意思是IRET后TF=1,IF=1是允许了就不需要执行了. | | |
|
|
|
|
[第6楼]
[ 回复时间:2007-12-13 14:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
|
|
|
|
|
[第7楼]
[ 回复时间:2007-12-13 14:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
你先看清楚我问的是什么在多想一下在来答4楼的.没有想就来答,TF=1,IF=1允许了中断但不中断这种话你也说的出来.你还是在看一下单步中断.如果像你说的那样何必把IF,TF置0呢. | | |
|
|
|
|
[第8楼]
[ 回复时间:2007-12-20 00:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32 |
我挺你abc!咱俩考虑的是同一个问题。不过我觉得应该是这样
1,取得中断类码N:
2,PUSHF
3,TF=O,IF=0
4,PUSH CS
5,PUSH IP
6,IP=N*4,CS=N*4+2
...........
7,iret
8,TF=0,IF=1 ;CPU可能在这地方这样整了,只是书上没说,我不确定,我推理的。
你有这样的顾虑是因为你考虑到了pushf之前TF的值为1,担心出栈后又再次引发中断,对吧?
挺你! | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-03-08 04:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:53
信誉值:0
注册日期:2008-02-09 02:55 |
明白楼主以及楼上的意思。
1,取得中断类码N:
2,PUSHF
3,TF=O,IF=0
4,PUSH CS
5,PUSH IP
6,IP=N*4,CS=N*4+2
首先:
因为从第一步取得中断类码N之前TF已经是1了,
那么取得中断码N就先不说了,
CPU执行PUSHF的时候,TF不也是1吗?
那么PUSHF执行完后,CPU发现TF=1,
又从头要去引发1号中断,
......
那么1号中断的引发过程看来永远都引发不完了?
其实,以上只是引发中断的一个过程,
CPU在执行上面几步的时候,
是一个连续的一气呵成不可中断的过程。
再次:
1号中断的目的就是要使得CPU进入单步执行中,
所以在IRET后,又使得TF=1了,再次进入单步中断。
这是正常的一个过程。当值TF=1,引发单步中断后,
可以简单的认为我们往后执行的指令是处于单步中断状态这样一个中断例程之中。
有人想,如此TF永远是1,那不是进入死循环了?
没有。
如果你不想再继续单步中断,
你可以在单步中断状态下(或者说在单步中断例程执行的时候)对TF的值进行设置,
使得当初被压入栈中的标志寄存器的TF=0,这样,弹栈后的TF=0,
就不再处于单步中断状态了。
不知道中断例程中都有些什么指令,
但我觉得中断例程中应该有改变被压入栈的TF的指令,
使得弹栈出来的标志寄存器的TF=0,比如:
修改栈中的TF值可以这样:
push bp
mov bp,sp
AND [bp+2],1111111011111111B
.
.
.
IRET
这样,在POPF后,TF肯定不是1了。
就不进入触发1号中断的死循环了。
楼上所说的
7,iret
8,TF=0,IF=1
差不多是这个意思,
但是第8步,要放在第7步之前进行,而且只能修改栈中的TF。 | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-04-09 18:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-03-22 13:14 |
'考虑到了pushf之前TF的值为1,担心出栈后又再次引发中断'
不继续中断,那怎么响应以后的键盘中断?难道中断一次,以后就不响应键盘了吗?中断一次,以后键盘就不让用了?你这么设计CPU啊 | | |
|
|
|
|
[第11楼]
[ 回复时间:2008-04-11 13:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23 |
|