我在这里搜索:
陷阱标志(T)–该标志用于片上调试。设定陷阱 标志使微处理器进入单步模式进行调试。在 单步执行,微处理器执行一条指令并进入 进入单步ISR。
如果设置了陷阱标志(1),则CPU将自动生成一个内部 在每条指令之后中断,从而允许检查程序 因为它逐条指令执行。
如果将陷阱标志重置为(0),则不执行任何功能。
https://en.wikipedia.org/wiki/Trap_flag
现在我正在emu-8086上编码。如前所述,必须设置TF才能进行调试器工作。
答案 0 :(得分:4)
我从未使用过emu8086,但是通过查看它的一些屏幕截图并按其名称判断它可能是emulator-这意味着它不是本机运行代码。
每条指令都会更改虚拟8086 CPU的状态(表示为内存中的数据结构),而不是真实CPU的状态。
通过这种仿真,emu8086不需要依靠TF
标志来单步执行程序,只需要在仿真一步之后停止并等待您按下另一个按钮即可。
这也是为什么您可以找到诸如“后退”之类的原因的原因。
如果您想知道如果已调试程序(而不是模拟程序)设置TF
标志会发生什么情况,那么答案是它取决于调试器。
正确的行为是被调试对象接收到异常的行为,但这很难正确处理(因为调试器本身使用TF
标志)。
假设编写良好的程序不需要使用TF
标志,则某些调试器只是不在乎并吞下该异常(即,它们不会将其转发给正在调试的程序)。
不幸的是,恶意软件通常会使用一套反调试技术,包括设置TF
并对其进行检查/等待异常以检测调试器的存在。
真正透明的调试器必须仔细处理RFLAGS
寄存器。
使用断点进行调试时,在程序执行时未设置TF,因此无需担心。
但是,当在下一条指令期间设置单步TF时,这在pushfd/q
期间会出现问题,调试器必须明确处理该情况以避免检测。
如果被调试者设置了TF,则调试器必须将调试异常传递给程序-在当前操作系统下,TF的作用时间不会超过一条指令,因为操作系统会捕获该异常,
在清除TF的同时,将其转换为信号并分发给程序。因此,调试器可以在进入popfd/q
指令之前简单地进行检查。
在操作系统未清除TF的情况下,调试器必须有效地复制副本RFLAGS
。
答案 1 :(得分:1)
调试器根据其需要设置TF。正在调试的代码不应修改TF。