Как EBP, ESP и область между предыдущим ESP и текущим EBP выровнены в стеке вызовов с помощью gcc? - PullRequest
0 голосов
/ 05 июня 2019

Насколько я понимаю, для размещения расширения x86 Streaming SIM Extensions (SSE) gcc выравнивает стек по 16-байтовым границам.Рассмотрим Ubuntu 16.04 (32-битная x86) с gcc версии 4.8.4.Какие разделы стека выровнены по 16-байтовой границе?

Мой вопрос в целом касается выравнивания данных в стеке и того, как стек выравнивается с помощью gcc.Мне интересно узнать о трех позициях: EBP, ESP и область между предыдущим ESP и новым EBP.

Из учебников я знаю, что EBP указывает на адрес, где хранится указатель предыдущего кадра.Считается ли EBP дном стека?Вставляется ли заполнение до или после нажатия указателя предыдущего кадра в стек?

Я также знаю, что ESP указывает на вершину стека.Должен ли ESP также быть выровнен на 16 байт?Есть ли в верхней части стека отступы для выравнивания ESP по 16-байтовой границе?

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

Для меня это серая область.Я проанализировал стек, используя gdb, но мне неясно как стек выровнен и почему это сделано именно так.Я надеюсь, что кто-то в SO сможет пролить свет на дизайн стека вызовов с помощью gcc.

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

...