11.2节单步中断中讲DEBUG设置TF为1,使得CPU进入单步模式。单步模式下,每完成一条指令的执行,都会进入单步中断例程。
但我考虑,DEBUG设置TF为1也需要执行指令啊,如果按书上讲法“CPU每执行完一条指令后,如果检测到为1,则产生单步中断”的说法,那DEBUG设置TF的指令岂不会产生调试中断,那又岂能进行接下来的调试。
于是我考虑这个TF的检测是不是在指令执行之前呢,如果先判断TF,再执行的话,那DEBUG修改TF就可以讲通了。
我又查了一些资料,发现IA手册上讲:
TF Trap (bit 8) — Set to enable single-step mode for debugging; clear to
disable single-step mode. In single-step mode, the processor generates a
debug exception after each instruction. This allows the execution state of a
program to be inspected after each instruction. If an application program
sets the TF flag using a POPF, POPFD, or IRET instruction, a debug exception
is generated after the instruction that follows the POPF, POPFD, or IRET.
TF陷入(第8位):设值的时候激活调试的单步执行模式;清零则禁止单步执行模式。在单步执行模式下,处理器会在每条指令执行后产生一个调试异常中断,中断后允许查看每条指令执行后程序的状态。当程序用OPPF,OPOFD,或IRET指令来设置TF标识的时候,POPF,POPFD,IRET后的第一条指令会诱发一个调试异常中断。
按照这个说法,修改TF的指令不会产生单步中断,那在完成指令执行后检测TF,也可以讲通DEBUG修改TF的指令不产生中断的问题了。
但找了一下IA32手册,并没有讲这个CPU何时检测TF,只提到了“The processor generates a single-step debug exception if (while an instruction is being executed) it detects that the TF flag in the EFLAGS register is set."
这里用的是while,也就是当,也就是没有明确的说是指令执行前、执行中、还是执行后。
希望大家发表一下自己的看法,讨论一下这个问题~~~~~~~~~~
另外王爽老师的书12.11节,在“CPU在执行完一条指令之后”一句前用了“基本上”,那是不是有特殊的、另外的情况呢,希望大家探讨一下。
下面是我搜到的与这个问题有关的一些资料:
http://bbs.pediy.com/showthread.php?t=65515
http://wenku.baidu.com/view/20ecd82d7375a417866f8fde.html |