Как понять сборку ниже? - PullRequest
1 голос
/ 25 марта 2011
     __asm__ __volatile__ (

            "movl 0x4(%ebp), %eax \n"

            "addl $15, %eax \n"

            "movl %eax, 0x4(%ebp)"

     );

Я знаю, %eax хранит возвращаемое значение, но для чего здесь %ebp?

Ответы [ 4 ]

4 голосов
/ 25 марта 2011

Предполагается, что пролог вашей функции выглядит следующим образом:

pushl %ebp
movl %esp, %ebp
...

% ebp будет регистром, хранящим базовый указатель (также называемый указателем кадра). Базовый указатель - это то место, где в стеке начинается текущий кадр стека. Так как в x86 стек растет вниз, местные жители упоминаются как отрицательное смещение от% ebp. На параметры и обратный адрес ссылаются положительные смещения из% ebp. Значение в% ebp указывает на значение% ebp вызывающего абонента в стеке (которое было выдвинуто прологом). Это эффективно формирует связанный список базовых указателей, которые можно использовать для «обхода» стека. Примечание: это предполагает, что каждый кадр стека имеет базовый указатель; Существует оптимизация, называемая пропуском указателей кадров (FPO), которая освобождает% ebp для других целей.

Таким образом, при наличии функции с этим прологом, и если она была вызвана с помощью инструкции вызова (т. Е. Адрес возврата вызывающей стороны был помещен в стек), то 0x4 (% ebp) сохранит адрес возврата, поскольку это был последний отправленный элемент в стек до выполнения пролога вызываемого. Следовательно, ваш фрагмент кода приведет к выполнению следующей инструкции после того, как вызываемый абонент получит 15 байтов от конца инструкции вызова вызывающего, вместо следующей инструкции после вызова.

Edit: мои многочисленные правки до сих пор были для того, чтобы лучше объяснить мой ответ.

2 голосов
/ 25 марта 2011

ebp - указатель кадра. ebp вместе с esp отмечает фрейм стека текущего процесса.

0x4 (% ebp) на самом деле является адресом возврата, адресом, на который должна возвращаться функция после завершения вызова.

Проверьте кадр стека на этом рисунке.

enter image description here

1 голос
/ 25 марта 2011

Регистр %ebp указывает на текущий кадр стека , где хранятся параметры функции и локальные переменные.Этот код обращается к значению по смещению 0x4 из% ebp (то, что представляет это значение, не показано).

0 голосов
/ 25 марта 2011

ebp - базовый указатель. Параметры функции хранятся в стеке, сначала в стеке находится адрес возврата, поэтому (если мы используем 32-битную машину) 0x4 (% ebp) указывает на первый параметр функции.

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