反汇编器在分析目标文件时如何维护寄存器的值?
How disassemblers maintain the value of registers while analyzing object files?
当我们使用gdb 或任何反汇编程序分析目标文件时,我们会在其中放置断点。它随时显示寄存器的当前状态。后台可以有多个程序运行。这些程序中的每一个也将使用这些寄存器并可以更改它们的值。
当其他进程可能不断更改它时,反汇编器如何为我们的程序维护寄存器的值?
像 objdump -d
这样的反汇编程序 不是 运行 程序并且没有寄存器值。他们只有机器代码,所以他们可以打印每条指令使用的寄存器,但不能打印指令 运行s.
时它将持有什么值
任何给定的指令(如 dec edx
)在程序的生命周期中可能 运行 多次,EDX 有多个不同的值。所以很明显,您不能只是静态地为反汇编列表中的指令打印单个寄存器值。
你问的是调试器,它实际上运行程序并在断点处停止它或single-stepping.
在 multi-tasking OS 如 Linux、MacOS 或 Windows 中,OS 提供系统调用来跟踪另一个过程,例如Linux ptrace
。这允许 GDB 插入断点,或 single-step。并且当目标进程停止时,GDB可以使用ptrace
读取保存的架构状态(寄存器值)。
运行 一个 CPU 上的多个任务由 OS 完成,使用“上下文切换”保存寄存器状态旧任务,并为新任务恢复状态。 每个任务都有自己的寄存器状态,只要它实际 运行ning 就会加载到架构寄存器中。
这是基本的操作系统知识,如果您想了解更多信息,请获取教科书或google其中一些关键字。
当我们使用gdb 或任何反汇编程序分析目标文件时,我们会在其中放置断点。它随时显示寄存器的当前状态。后台可以有多个程序运行。这些程序中的每一个也将使用这些寄存器并可以更改它们的值。
当其他进程可能不断更改它时,反汇编器如何为我们的程序维护寄存器的值?
像 objdump -d
这样的反汇编程序 不是 运行 程序并且没有寄存器值。他们只有机器代码,所以他们可以打印每条指令使用的寄存器,但不能打印指令 运行s.
任何给定的指令(如 dec edx
)在程序的生命周期中可能 运行 多次,EDX 有多个不同的值。所以很明显,您不能只是静态地为反汇编列表中的指令打印单个寄存器值。
你问的是调试器,它实际上运行程序并在断点处停止它或single-stepping.
在 multi-tasking OS 如 Linux、MacOS 或 Windows 中,OS 提供系统调用来跟踪另一个过程,例如Linux ptrace
。这允许 GDB 插入断点,或 single-step。并且当目标进程停止时,GDB可以使用ptrace
读取保存的架构状态(寄存器值)。
运行 一个 CPU 上的多个任务由 OS 完成,使用“上下文切换”保存寄存器状态旧任务,并为新任务恢复状态。 每个任务都有自己的寄存器状态,只要它实际 运行ning 就会加载到架构寄存器中。
这是基本的操作系统知识,如果您想了解更多信息,请获取教科书或google其中一些关键字。