Правильно ли создан этот кадр стека? - PullRequest
8 голосов
/ 08 июня 2011

На вопросе, который я делаю, у меня есть вопрос по фреймам стека:

Рассмотрим следующую функцию в Nada (выдуманный язык), язык, используемый в лекциях:

function f(x,y)
begin
var z
z := y - x;
return z * z;
end;

Такая функция может быть вызвана так:

n := f(a+2,b*3)

Используя диаграммы, чтобы проиллюстрировать ваш ответ, объясните последовательность событий при выполнении вышеупомянутого вызова функции, показывая, как кадр стека строится при входе в функцию и разрушается при выходе из нее, и как используется регистр базового указателя. при доступе к параметрам x и y и локальной переменной z.

Я ответил на этот вопрос, и это кадр стека, который я создал:

sackframe I produced

Я просто хочу, чтобы кто-то исправил это для меня, если его части были неправильными ... или создал новый кадр стека (если у кого-то есть время). Я буду очень признателен за помощь.

1 Ответ

1 голос
/ 13 апреля 2012

Это зависит от соглашений о вызовах.

Но если вы предполагаете, что он использует соглашение о вызовах _cdecl, так как вы упоминаете базовый указатель:

http://i.stack.imgur.com/5vQVB.jpg

Другие соглашения о вызовах могут использовать регистры и т. Д. Оптимизация может дополнительно изменить это, так как компилятор встроит код, сделает разные вещи для перестановки кода для конвейерной обработки ЦП и т. Д.

...