如果在8086微处理器中将TF(陷阱标志)设置为0,会发生什么?

时间:2018-10-21 19:32:05

标签: debugging assembly flags emu8086

我在这里搜索:

  

陷阱标志(T)–该标志用于片上调试。设定陷阱   标志使微处理器进入单步模式进行调试。在   单步执行,微处理器执行一条指令并进入   进入单步ISR。
  如果设置了陷阱标志(1),则CPU将自动生成一个内部   在每条指令之后中断,从而允许检查程序   因为它逐条指令执行。
  如果将陷阱标志重置为(0),则不执行任何功能。

https://en.wikipedia.org/wiki/Trap_flag

现在我正在emu-8086上编码。如前所述,必须设置TF才能进行调试器工作。

  • 我应该总是自己设置TF还是自动设置TF?
  • 如果我以某种方式将TF设置为0,则整个计算机系统调试器将正常工作还是仅emu-8086不会调试?

2 个答案:

答案 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。