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