汇编调试器如何操作寄存器?
How does an assembly debugger manipulates registers?
调试器如何操作工作中的寄存器 CPU?
我正在使用 nasm 和带有 dosbox 的 afd(不知道也不能使用任何替代设置,因为我的大学需要此设置)。 运行 赢 10。
组装真的很新。阅读
但一切都超出了我的想象。所以请像我 5 岁一样解释一下。也许可以参考初学者
DOSBOX 内置的调试器很简单:它有一个侧通道来访问整个机器状态。
在多任务OS下,有像Linuxptrace
这样的系统调用可以操纵另一个进程的状态。
在 DOS 下,调试器必须将自己插入到与正在调试的程序不同的内存区域。 x86 ISA 本身具有用于单步执行的 FLAGS(跟踪标志)中的 TF 等调试功能。
一旦调试器控制了 CPU(即 CPU 正在执行调试器代码),它可以将寄存器的旧值保存在某处(在堆栈或静态位置)。
它可以将它们全部恢复(使用 mov
指令)和 return 到正在调试的程序,方法是使用从内存加载 CS:IP 和 FLAGS 的 iret
。 SS:SP 必须有效才能正常工作(return 信息将位于被调试进程的 SS:SP
正下方)。所以实模式 DOS 调试是 "intrusive",并且会在 SS:SP 以下破坏 space。不像在多任务下 OS 有虚拟内存。
另一种不使用任何寄存器(即恢复所有内容后)返回正在调试的进程的方法是 far jmp cs:[mem]
使用绝对寻址模式。但是那不能恢复FLAGS,所以如果你想在恢复执行正在调试的进程时设置TF是行不通的。
调试器如何操作工作中的寄存器 CPU?
我正在使用 nasm 和带有 dosbox 的 afd(不知道也不能使用任何替代设置,因为我的大学需要此设置)。 运行 赢 10。
组装真的很新。阅读
DOSBOX 内置的调试器很简单:它有一个侧通道来访问整个机器状态。
在多任务OS下,有像Linuxptrace
这样的系统调用可以操纵另一个进程的状态。
在 DOS 下,调试器必须将自己插入到与正在调试的程序不同的内存区域。 x86 ISA 本身具有用于单步执行的 FLAGS(跟踪标志)中的 TF 等调试功能。
一旦调试器控制了 CPU(即 CPU 正在执行调试器代码),它可以将寄存器的旧值保存在某处(在堆栈或静态位置)。
它可以将它们全部恢复(使用 mov
指令)和 return 到正在调试的程序,方法是使用从内存加载 CS:IP 和 FLAGS 的 iret
。 SS:SP 必须有效才能正常工作(return 信息将位于被调试进程的 SS:SP
正下方)。所以实模式 DOS 调试是 "intrusive",并且会在 SS:SP 以下破坏 space。不像在多任务下 OS 有虚拟内存。
另一种不使用任何寄存器(即恢复所有内容后)返回正在调试的进程的方法是 far jmp cs:[mem]
使用绝对寻址模式。但是那不能恢复FLAGS,所以如果你想在恢复执行正在调试的进程时设置TF是行不通的。