2009-09-22 7 views
2

Я хотел бы знать, какой из них отвечает за очистку стекаКто несет ответственность за очистку?

Предположим, у вас есть функция весело позволяет сказать, как это:

var = fun(int x, int y, float z, char x); 

когда fun будет вызван он будет идти в стек вместе с параметры, тогда, когда функция возвращает того, кто отвечает за очистку стека, это функция it self или «var», которая будет удерживать возвращаемое значение.

Еще одна вещь, может ли кто-нибудь объяснить концепции вызова конвенций?

ответ

5

calling convention относится к тому, кто выполняет очистку стека; вызывающего абонента или вызываемого абонента.

соглашения о вызовах могут отличаться:

  • , где параметры и возвращаемые значения помещаются (в регистрах, на вызов стека; сочетание обоих)
  • порядок, в котором передаются параметры (или части одного параметра )
  • как задача установки и очистки вызова функции делится между вызывающим и вызываемым абонентом.
  • , который регистрирует, которые могут быть использованы непосредственно вызываемым иногда могут также быть включены

Architectures почти всегда имеют более , чем один из возможных соглашение о вызовах.

0

К тому времени, когда эта строка будет завершена, var сохранит значение, возвращаемое fun(), и любая память в стеке, используемая потехой, исчезнет: «push», «pop» all tidy.

Вызывающие условные обозначения: все, что организует компилятор, чтобы развлечение могло выполнять свою работу. Рассмотрим те параметры x, y, z. Какой порядок они попадают в стек (действительно, они проходят через стек)? Не имеет значения, пока соглашатель и собеседник согласны! Это соглашение.

9

Вы ссылались на ответ самостоятельно: вызывать конвенции.

Вызывающая конвенция аналогична договору . Он решает следующие вопросы:

  • Кто несет ответственность за очистку параметров.
  • Как и в каком порядке параметры передаются вызываемой функции.
  • Где хранится возвращаемое значение.

Существует множество различных соглашений о вызовах, в зависимости от платформы и среды программирования.Две общие соглашения о вызове на x86 платформах:

STDCALL

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

Cdecl

Параметры передаются в стек справа налево. Функция , вызывающая, очищает стек.

В обоих случаях возвращаемое значение в EAX регистре (или ST0 для значений с плавающей точкой)

Многие языки программирования для платформы x86 позволяют определять соглашение о вызовах, например:

Delphi

function MyFunc(x: Integer): Integer; stdcall; 

Microsoft C/C++

int __stdcall myFunc(int x) 

Некоторые замечания по использованию:

При создании простого приложения это редко бывает необходимо изменить или знать о вызовах, но есть два типичных случая, где вам необходимо обратиться к конвенциям:

  • При вызове внешних библиотек API Win32, например: You ha чтобы использовать совместимые соглашения о вызовах, иначе стек может быть поврежден.
  • При создании встроенного ассемблерного кода: вы должны знать, в каких регистрах и где в стеке вы найдете переменные.

Для получения более подробной информации я рекомендую эти статьи Википедии: