Увеличение %esp и CDECL

Я читал о стеке x86 и соглашении CDECL и прочитал кое-что, что меня смутило.

Среди перечисленных обязанностей вызывающей стороны было извлечение параметров, их использование или просто увеличение %esp для их удаления.

Как работает последняя часть?

Например, предположим, что начальное значение %esp равно 0x105000, и вы уменьшаете его на $0x1c для текущего кадра стека. Вы выделяете некоторые данные, а затем увеличиваете их обратно - в этом случае эти данные не будут по-прежнему плавать в памяти? Как очищается память? Приведет ли доступ к 0x104FF4 к ошибке сегментации, и если да, то что там очистило данные?


person user8814    schedule 09.07.2014    source источник
comment
Как вы думаете, на что похоже ясное воспоминание? Как вы плаваете в памяти?   -  person Kerrek SB    schedule 10.07.2014
comment
Эм, под «очистить», я полагаю, я имел в виду байты, которые были использованы для возврата к значению по умолчанию, которое они удерживали, прежде чем они были установлены на что-то еще в только что извлеченном кадре стека - если такое значение по умолчанию вообще существует. И под «плавающим» я имел в виду, что эти байты сохраняют значение, установленное во всплывающем кадре.   -  person user8814    schedule 10.07.2014
comment
Извините, если я не очень понимаю, я все еще пытаюсь понять, как работает стек и чем он отличается от кучи. Я просто был сбит с толку, придется ли вам освобождать стек подобно тому, как вы освобождаете выделенную структуру в C - сначала каждый элемент, а затем всю структуру; или ОС сделала это за вас; или вам вообще не нужно его освобождать.   -  person user8814    schedule 10.07.2014


Ответы (1)


POP просто перемещает данные в регистр и корректирует указатель стека. Он не стирает данные и не имеет других побочных эффектов.

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

Это также потенциально более эффективно. Вам всегда понадобится только одна инструкция ADD, а не серия POP, которые могут быть медленнее или привести к увеличению кода.

Данные все еще существуют в памяти, но будут перезаписаны, когда вы в следующий раз поместите данные в стек.

person JCx    schedule 09.07.2014
comment
Большое спасибо! А если данные никогда не перезаписываются, к ним можно получить доступ? - person user8814; 09.07.2014
comment
Да, точно. Хотя, возможно, это не рекомендуемое занятие. - person JCx; 09.07.2014