Изменится ли базовый указатель, если я изменю указатель стека в x86? - PullRequest
0 голосов
/ 25 января 2019

В начале% ebp обычно устанавливается на% esp.Если я установлю указатель стека на определенное место, базовый указатель также изменится?

И нужно ли мне изменить его на новое местоположение, скажем, $ (newstacklocation - 4)?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Инструкции делают только то, что говорят в руководстве Intel / AMD, в разделе «Операция».

sub $12, %esp ничем не отличается от sub $12, %eax. SUB изменяет регистр назначения (и EFLAGS с кодами условий), это all .

И EIP переходит к следующей инструкции, как и всегда.Обычно не упоминается для инструкций, не связанных с ветвями, но выполнение любой инструкции продвигает EIP.

Никакого другого магического эффекта на архитектурное состояние нет. Это язык ассемблера.Все просто байты в памяти или регистры.Все, что вы хотите, чтобы происходило с этими байтами, вы должны сделать так, чтобы это происходило самостоятельно, с помощью инструкций по запуску процессора.

Если вы используете инструкцию, подобную leave, тогда да, это изменит как ESP, так и EBP,эквивалентно

mov  %ebp, %esp
pop  %ebp

Потому что именно так сказано в руководстве по leave.

0 голосов
/ 25 января 2019

Базовый указатель и указатель стека являются отдельными регистрами. Базовый указатель изменяется только тогда, когда вы устанавливаете его на новое значение. Установка указателя стека не изменяет неявно любые другие регистры общего назначения.

Кстати, в этом и заключается причина сохранения базового указателя: если вы толкаете или выталкиваете стек, указатель стека изменяется, как и все esp -относительные смещения. Однако базовый указатель не изменяется, поэтому относительные смещения ebp для переменных в стеке остаются постоянными. Это значительно облегчает написание функций в сборке, так как вы можете изменить кадр стека, не исправляя все смещения стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...