我在这里搜索了:
陷阱标志(T) -此标志用于片上调试.设置陷阱标志会使微处理器进入单步模式进行调试。在单步执行中,微处理器执行指令并进入单步ISR。 如果设置了陷阱标志(1),CPU在每条指令之后自动生成内部中断,允许在通过指令执行指令时检查程序。 如果重新设置了陷阱标志(0),则不执行任何功能。
现在我正在对emu-8086进行编码。如前所述,要使调试器工作,就必须设置TF。
发布于 2018-10-23 15:36:53
我从未使用过emu8086,但是通过查看它的一些屏幕截图,并根据它的名称判断它可能是一个仿真器 -这意味着它不是以本地方式运行代码。
每条指令都在改变虚拟8086 CPU的状态(表示为内存中的数据结构),而不是改变实际CPU的状态。
通过这种模拟,emu8086不需要依赖TF标志来实现程序的单步执行,它只需要在一步仿真之后停止,然后等待您按下另一个按钮。
这也是为什么你可以找到像“退一步”这样的东西。
如果您想知道如果调试的程序(而不是模拟的程序)设置TF标志会发生什么,那么答案是它取决于调试器。
正确的行为是调试器接收异常,但这很难正确处理(因为调试器本身使用TF标志)。
有些调试器只是不关心和吞下异常(即,他们不将其转发到正在调试的程序),前提是编写良好的程序不需要使用TF标志。
不幸的是,恶意软件通常使用一组反调试技术,包括设置TF并检查它回/等待异常以检测调试器的存在。
真正透明的调试器必须小心地处理RFLAGS寄存器。
在使用断点进行调试时,在程序执行时不设置TF,因此没有什么可担心的。但是,当在下一条指令中设置TF单步时,这在pushfd/q期间是有问题的,调试器必须显式地处理这种情况以避免检测。如果调试器设置TF,调试器必须将调试异常传递给程序--在当前操作系统下,TF不会超过一条指令,因为操作系统将捕获异常,将其转换为信号,并在清除TF的同时将其发送给程序。因此,调试器可以在进入popfd/q指令之前简单地进行检查。
如果TF没有被操作系统清除,调试器必须使用副本有效地模拟RFLAGS。
发布于 2018-10-21 19:43:58
调试器根据需要设置TF。正在调试的代码不应修改TF。
https://stackoverflow.com/questions/52919089
复制相似问题