Расположение EIP и других регистров в x86

Я работаю с инструкциями x86, и теперь я не понимаю, где хранятся регистры x86 (например, EIP, ESP и т. д.).

Например, когда я использую ollydbg, я могу видеть фактическое значение регистра EIP и как оно меняется.
Если они хранятся в памяти, то где их фактическое местоположение? (Например, в .data .text или .bss)

И можно ли изменить EIP другого процесса вручную? Как?


person sinaw    schedule 23.05.2016    source источник


Ответы (2)


У вас серьезное заблуждение о том, что такое регистр.

Регистр фактически является регистром, т.е. очень маленький участок памяти в процессоре, который может содержать операнды или может быть целью инструкции ЦП. У него нет адреса в памяти - он действительно адресуемый, как и регистр.

Оперативная память — это нечто совершенно другое: программа x86 может работать полностью без оперативной памяти, но нет операции, которая не работает с регистрами. Например, чтобы добавить два числа, которые находятся где-то в ОЗУ, вы используете инструкции LOAD для загрузки этих двух чисел в два регистра, а затем некоторую инструкцию ADD для добавления одного числа к другому, нацеленную на регистр, а затем есть некоторая инструкция STORE, которая принимает значение регистра и записывает его по некоторому адресу в ОЗУ.

Таким образом, нет никаких «специфических для процесса» регистров. Каждое ядро ​​ЦП имеет ровно один набор регистров (несмотря на некоторые особенности, такие как виртуализация), и существуют механизмы для хранения регистров в ОЗУ и их восстановления из ОЗУ, например, при вызове функции или переключении контекстов.

person Marcus Müller    schedule 23.05.2016

Регистры хранятся в регистрах, а не в собственной памяти процесса.

Отладчики используют специальный интерфейс, предоставляемый ОС, для изменения регистров запущенного процесса, в том числе EIP. В Linux это ptrace(2)API.

Возможность изменять регистры процесса извне связана с тем, как ОС сохраняет архитектурное состояние процесса в памяти для переключатели контекста.

person Peter Cordes    schedule 23.05.2016