Что означают первые строки кода в сборке? - PullRequest
0 голосов
/ 26 июня 2011
pushl %ebp      
movl %esp, %ebp

Это мое понимание:

  1. Перемещается на вершину стека.Однако я не уверен, что находится в% ebp или что хранится в регистре% ebp.

  2. Если я использую базовое понимание этого% esp - Sourche, а% ebp - назначение,Поэтому я перемещаю то, что находится в регистре% esp, в регистр% ebp.Что находится в реестре% esp?

Ответы [ 3 ]

1 голос
/ 26 июня 2011

По соглашению esp - указатель стека, а ebp - указатель фрейма.См. Условные обозначения вызовов функций Intel x86 - представление сборки .

Таким образом, согласно этому условию, когда выполняется вызов, указатель текущего кадра (например, указатель кадра вызывающего)сохраняется (чтобы его можно было восстановить при возврате к вызывающему объекту - поэтому с точки зрения вызывающего его указатель кадра никогда не изменяется).Затем текущий указатель стека (esp) сохраняется в ebp, что делает его указателем кадра для вызываемого кода.

0 голосов
/ 26 июня 2011
    pushl %ebp      
    movl %esp, %ebp
  • сохранить регистр ebp в стеке
  • переместить (скопировать) содержимое регистра esp в регистр ebp

«Стиль» куска кода таков, что source - это первый аргумент, а destination - второй; в стиле Intel вы увидите что-то вроде

    push ebp
    mov  ebp, esp

Это простое объяснение этих строк кода. Смысл зависит. Обычно это общий пролог для функций, генерируемых языком высокого уровня (например, C), с соблюдением некоторого соглашения о вызовах. Эпилог должен выглядеть как

    movl %ebp, %esp
    popl %ebp
    ret

Пространство для локальных переменных можно «создать» в стеке, уменьшив значение esp и используя ebp для доступа к данным, сохранив обычное использование esp, например. для другого вызова другой функции (адрес возврата помещается в стек) и избегается перезапись локальных переменных: память между уменьшенным esp и базовым ebp является чем-то вроде «зарезервированной области» в стеке, которую может использовать текущая функция.

Поскольку каждая введенная функция сохраняет как ebp, так и esp, рекурсивный вызов функции (до достижения предела стека) довольно естественен в этом механизме соглашения о вызовах, и вложенная функция может вызываться ad libitum (до тех пор, пока стек заканчивается!).

0 голосов
/ 26 июня 2011

%esp - текущий указатель стека, т.е.вершина этого.%ebp представляет базовый указатель текущей функции.Это необходимо, чтобы функция знала, где начинается ее стек.Вам нужно сохранить %ebp (pushl %ebp) предыдущей функции в стеке, чтобы иметь возможность назначать свои собственные.

Позже, когда вы снова поднимаетесь в стек, каждой функции будет восстановлен базовый указатель науметь продолжать работать.

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