当我们使用gdb或任何反汇编程序分析目标文件时,会在其中插入断点。它随时显示寄存器的当前状态。可能有许多程序在后台运行。每个程序都将使用这些寄存器,并可以更改其值。
当其他进程可能不断更改它时,反汇编程序如何维护我们程序的寄存器值?
答案 0 :(得分:4)
objdump -d
之类的反汇编程序不会运行程序,并且没有寄存器值。他们所拥有的只是机器代码,因此他们可以打印出每条指令使用的寄存器,但不能打印出指令运行时它将保留的值。
任何给定的指令(如dec edx
)都可以在程序的生命周期内多次运行,并且具有多个不同的EDX值。因此,显然,您不能只为反汇编列表中的指令静态打印单个寄存器值。
您要询问的是调试器 ,这些调试器实际上在运行程序以及在断点或单步执行时将其停止。
在Linux,MacOS或Windows等多任务操作系统中,该OS提供系统调用以跟踪另一个进程,例如Linux ptrace
。这使GDB可以插入断点或单步执行。并且当目标进程停止时,GDB可以使用ptrace
读取保存的体系结构状态(寄存器值)。
操作系统在一个CPU上运行多个任务,并通过“ 上下文开关”来保存旧任务的寄存器状态,并恢复新任务的状态。 每个任务都有自己的寄存器状态,该寄存器状态在每次实际运行时都会加载到体系结构寄存器中。
这是基本的操作系统内容,如果您想了解更多信息,请获取教科书或google其中一些关键字。