дизассемблеры типа objdump -d
do not запускают программу и не имеют значений регистров.Все, что у них есть, это машинный код, так что они могут печатать, какие регистры использует каждая инструкция, но не то, какое значение она будет держать при выполнении инструкции.
Любая данная инструкция (например, dec edx
) может выполняться несколько разжизнь программы, с несколькими различными значениями для EDX.Очевидно, что вы не можете просто статически напечатать одно значение регистра для инструкции в листинге разборки.
Вы спрашиваете о отладчиках , которыедействительно запускать программу, а также останавливать ее в точках останова или в один шаг.
В многозадачной ОС, такой как Linux, MacOS или Windows, ОС предоставляет системные вызовы для отслеживания другого процесса, например Linux ptrace
.Это позволяет GDB вставлять точки останова или одношаговые.И когда целевой процесс останавливается, GDB может использовать ptrace
для чтения сохраненного архитектурного состояния (значений регистра).
Выполнение нескольких задач на одном CPU выполняется ОС с помощью переключателей контекста "" ", которые сохраняют состояние регистра для старой задачи и восстанавливают состояние для новой задачи. Каждое задание имеет свое собственное состояние регистра, которое загружается в архитектурные регистры всякий раз, когда оно фактически выполняется.
Это базовый материал по операционным системам, получите учебник или Google некоторые из этих ключевых слов, если хотитеузнать больше.