EBP, ESP и стековая рама в сборе

У меня есть несколько вопросов о EBP, ESP и кадре стека в следующем коде.

  1. Почему мы вычли 28 из esp? У нас есть две локальные переменные x и y в main. Так почему мы не вычли 8?

  2. И разве мы не помещаем значения в стек справа (или сверху) налево (или снизу)? Так почему же мы добавили 1 к [eax+8] вместо [eax+4]?


func(int a, int b, int c)
{
  return a+b+c;
}
main()
{
 int x, y=3;
 x=func(y,2,1);
}

Передача параметров в сборку


person Figen Güngör    schedule 06.01.2013    source источник
comment
Я и мой товарищ - процессор, очевидно;)   -  person Aleksey Ivchenko    schedule 07.01.2013
comment
Похоже, это было скомпилировано с gcc -faccumulate-outgoing-args, чтобы избежать push, вместо этого резервируя место и используя mov относительно ESP.   -  person Peter Cordes    schedule 27.04.2021
comment
Режимов адресации [eax+4] или [eax+8] нет, и адреса назначения не добавляются. Если вы хотите отредактировать эту часть вопроса так, чтобы она имела какой-то смысл и соответствовала данному ответу, это, вероятно, было бы хорошо, если бы вы могли понять, о чем вы думали 8 лет назад. (Или если кто-то еще хочет отредактировать.)   -  person Peter Cordes    schedule 27.04.2021


Ответы (1)


  1. Указатель стека вычитается из 28, потому что вам нужно 8 байтов для ваших двух локальных переменных и 12 байтов для параметров, чтобы они функционировали. Дополнительные 8 байтов, вероятно, связаны с попыткой вашего компилятора выровнять стек main с 16-байтовой границей (в стеке уже есть 4 байта для адреса возврата main и еще 4 байта, когда EBP был нажат, чтобы установить кадр стека в первой инструкции main ). См. -mpreferred-stack-boundary если вы используете GCC.

  2. Параметры передаются справа налево. Поскольку пространство стека уже было выделено для трех параметров, когда оно было вычтено из указателя стека, 1 перемещается в «самую высокую» позицию относительно текущего указателя стека (+8), 2 перемещается в середину (+4) , а значение y перемещается в сам указатель стека. Это то же самое, что поместить в стек 1, затем поместить в стек 2, а затем поместить в стек y. В последней инструкции push 1 соответствует +8 от ESP, 2 — +4 от ESP, а y — +0 от ESP. Обратите внимание, что внутри func к этим смещениям нужно добавить 8, потому что адрес возврата помещается в стек из инструкции call, а func помещает EBP для установления кадра стека.

  3. Запутались, какая структура?

person Peter Huene    schedule 06.01.2013