ASM Stack Usage - PullRequest
       5

ASM Stack Usage

0 голосов
/ 06 января 2012

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

Ответы [ 2 ]

1 голос
/ 06 января 2012

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

Не увлекайтесь слишком большим, чем просто пониманием того, какнабор инструкций / аппаратная часть работает.Обычно называемые push и pop, эти инструкции обычно принимают регистр, обычно регистр указателя выделенного стека, который содержит адрес в ram.Когда происходит передача, адрес в этом регистре, указатель стека, используется для записи / передачи этих данных в оперативную память, и содержимое регистра указателя стека, адрес оперативной памяти, соответствующим образом корректируется.Все это делается аппаратно на основе использования этой инструкции.С другой стороны, ram читается на основе адреса указателя стека и разновидности инструкции pop, содержимое ram размещается где-то на основе разновидности инструкции pop, и содержимое регистра указателя стека корректируется соответствующим образом.

Чтоадрес оперативной памяти используется и почему?Который, как я думаю, вы спрашиваете.Что ж, это обычно зависит от разработчиков системы: люди берут оперативную память в систему и делят ее на программы, данные, кучу и стек.Часто вы видите, что если у вас есть один линейный блок памяти, вы работаете с самой нижней (адресной) частью памяти, у которой есть сама программа, инструкции, поверх которой находятся данные, используемые этой программой, а остальныеиз памяти это ничейная земля.От основания этой памяти к вершине часто там, где живет куча.Компилятор не знает, сколько кучи требуется для mallocs, знает только программист.Стек часто начинается в верхней части этого открытого пространства и растет вниз, каждая вещь, которую вы помещаете в стек, помещается в нижнюю часть последней вещи, которую вы помещали в стек, и она уменьшается.Существует очень реальный риск столкновения стека и кучи, и это задача программиста (обычно, некоторые языки / компиляторы сжигают много дополнительного кода, чтобы попытаться предотвратить его, если вы об этом попросите).Поэтому, как правило, стек располагается вместе с кучей, которая находится рядом с областями данных и bss.Конечно, это не всегда так, в некоторых встроенных системах у вас есть программа на rom, а данные и куча (если вы достаточно смелы, чтобы использовать кучу во встроенной системе) находятся в разделе оперативной памяти, и стек можетнаходиться в отдельном разделе оперативной памяти, а не рядом с оперативной памятью данных / кучи.возможно потому что таран быстрее например.Хорошим примером этого является продвижение в пользу геймбоя: 256 КБ памяти, которая не содержит микросхемы и медленнее для общего назначения, и встроенная внутренняя 32 КБ, которая намного быстрее, что является хорошим местом для размещения вашего стека (и критичного по скорости кода).ROM, содержащий саму программу (с некоторым аппаратным ускорением, чтобы сделать ее не слишком медленной).Иногда у вас есть процессоры, такие как 6502, где инструкции стека работают только в определенной области памяти, 256 я думаю по адресу 0x200 или что-то в этом роде, встроенные в аппаратное обеспечение таким образом.На чипе не выкл.некоторые процессоры, такие как ARM в режиме ARM, не имеют указателя стека, может использоваться любой регистр, и нет push и pop, они являются псевдонимами для описания команд загрузки и хранения общего назначения.По соглашению конкретный регистр часто резервируется / используется компилятором в качестве указателя стека, но это не требуется, как это делается для других процессоров.Предоставлены другие наборы инструкций arm, такие как thumb и thumb2, чтобы уменьшить размер команды, удалите универсальную природу и жестко закодируйте обычный r13 в качестве указателя стека, поэтому для тех режимов, которые у вас нет выбора, вы получаете r13 и не используете общего назначения.инструкция вы специально используете инструкции push и pop.

Возьмите все это и поместите в Windows, Linux или другую многопоточную операционную систему. Ничего не меняется, процессор не перенаправляет свой набор инструкций только для операционной системы на лету, вы получаете один и тот же набор инструкций, независимо от того, какое программное обеспечение вы используете на этом процессоре. Операционная система - это MMU, чтобы у каждой программы была иллюзия наличия относительно небольшого фиксированного объема памяти, в котором живут пространство программы, пространство данных, куча и стек. MMU дает программам иллюзию того, что все они имеют одинаковое адресное пространство, например, все программы могут подумать, что их программы начинаются с адреса 0x8000, все программы не могут жить по одному адресу, 0x8000 - это виртуальный адрес, mmu отображает его на физический адрес, и каждая программа имеет различный набор физических адресов. Когда операционная система переключается на следующую задачу / программу / поток, она сохраняет указатель стека и другие регистры, а также загружает регистры для следующей программы (щекочет MMU) и дает ему некоторое время на процессоре, где она также считает, что это имеет свое собственное пространство памяти с программным пространством, пространством данных, кучей и стеком.

Большая часть понимания стека смотрит на набор инструкций. Остальная часть истории - как выбирается адрес указателя стека, который может варьироваться в зависимости от платформы, операционной системы и компиляторов. Во многих случаях у сценария компоновщика или процесса компоновки есть пользовательское правило для этого. Вы, как программист / пользователь, возможно, не понимаете, что вы контролируете это, поскольку вы, вероятно, просто используете компилятор по умолчанию, но для популярных компиляторов (хорошо компоновщиков) у вас есть выбор изменить его.

1 голос
/ 06 января 2012

Каждый процесс имеет потоки, а каждый поток имеет стек.Каждый процесс имеет свое собственное пространство, называемое адресным пространством процесса.Потоки размещают свой стек в этом адресном пространстве процесса.Это пространство является виртуальным, что означает, что процесс получает 4 ГБ пространства процесса, что не всегда может быть в оперативной памяти.Он может быть выгружен во вторичную память, когда другому процессу требуется ОЗУ.По сути, вы можете предположить, что стек является частью памяти, управляемой ОС, перемещаясь между вторичной памятью, ОЗУ, кешем и т. Д., Чтобы оптимизировать время чтения / записи.Вышеуказанные утверждения верны для окон.Я не уверен насчет других операционных систем.

...