Вопрос по computer-science, microprocessors – Какова роль стека в микропроцессоре?

5

Какова роль стека в микропроцессоре?

Домашняя работа утомляет тебя? Chris

Ваш Ответ

10   ответов
1

Стек используется дляstore and retrieve return addresses во время вызовов функций. Его полезно использовать во время вызовов вложенных функций или рекурсивных вызовов функций. Он также используется дляtransfer arguments to a function.

На микропроцессоре он также используется дляstore the status register contents перед переключением контекста.

ура

0

Некоторые микропроцессоры имеютstack registers чтобы повысить эффективность, взгляните наSPARC статья в википедии; у других есть микростек для микропрограмм ... На самом деле это очень широкий термин.

0

http://www.hobbyprojects.com/microprocessor_systems/images/stack.gif

Стек является временным хранилищем данных.

Процессор может помещать важные данные в стек во время обработки других данных.

Когда он завершает эту задачу, он вытягивает сохраненные данные из стека.

Это как куча тарелок. Нижняя пластина - это первый бит данных, который был помещен в стек. Верхняя пластина - это последние данные, которые нужно нажать. Верхняя пластина вытягивается первой, а нижняя пластина - последние извлекаемые данные. Это стек LAST IN, FIRST OUT.

На диаграммах сначала нажимается X, затем Y и, наконец, A. Процессор уходит, чтобы обработать другие данные. По завершении этой задачи он возвращается, чтобы извлечь сохраненные данные. Сначала тянут A, затем Y и, наконец, X.

Инструкция для отправки данных - PHA. Только данные в аккумуляторе могут быть помещены в стек. Другие данные могут быть переданы, если они сначала передаются в аккумулятор.

Инструкция по извлечению данных из стека - PLA. Данные в стеке передаются в аккумулятор.

Стек 6502 состоит из 256 байтов и занимает страницу 1, адреса от 256 до 511.

4

На самом низком уровне стек - это место, где определенные инструкции хранят или извлекают данные и где данные хранятся при возникновении прерывания. Микропроцессоры различаются, но существует 5 основных типов инструкций для стека:

PUSH - put data onto the stack POP (or PULL) - "remove" data from the stack CALL - jump to a subroutine and put the return address on the stack RETURN - return from a subroutine by loading the program counter with the stack top INT (or SWI) - software interrupt; a specialized CALL

Когда происходит прерывание процессора (из-за внешнего устройства), CPU сохраняет текущий счетчик программы и (обычно) флаги записываются в стек и переходят к подпрограмме обработки. Это позволяет подпрограмме обработки обрабатывать прерывание и возвращаться к тому, что процессор делал с сохранением его текущего состояния.

В то время как микропроцессор имеет только один активный стек одновременно, операционная система может заставить его выглядеть так, как будто существует несколько стеков. Как минимум один для ОС, один для каждого процесса и один для каждого потока. Фактически, сами потоки могут реализовывать несколько стеков.

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

На этом завершается мое объяснение стека снизу вверх.

When a processor interrupt occurs (due to an external device), the CPU will save the current program counter and (usually) the flags register on the stack and jump to the handling subroutine Как это соотносится с PCB и переключение контекста?
0

Просто чтобы добавить к некоторым из этих ответов, некоторые младшие микро, такие как линия PIC имеютhardware callstack, что означает, что он не может быть динамически выделен, как в аппаратном обеспечении.

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

0

Стек является реализацией буфера LIFO (Last In - First Out). FIFO (First In - First Out) также известен как очередь. Но вернемся к ЛИФО.

Стеки в архитектуре x86 позволяют разработчикам программного обеспечения обходиться без таких странных вещей, как регистры обратных адресов и регистры обратных адресов прерываний, которые встречаются в процессорах RISC.Everything может находиться в стеке, что означает, что существует единый стандартизированный и унифицированный метод обработки вызовов / возвратов, параметров / локальных переменных и прерываний / возвратов прерываний. Использование метода в отдельных стеках упрощает реализацию многопоточности.

RISC, напротив, использует стекоподобный буфер, хотя он хранит значительную часть связанной информации в другом месте. RISC "стеки" может быть быстрее (не уверен), но их определенно сложнее понять, чем у x86.

7

Стек используется в основном во время вызова функции, но в зависимости от языка и уровня программирования он может использоваться для временного хранения данных регистра процессора или других переменных.

Кроме того, стек может также использоваться для кратковременного крупномасштабного хранения данных при использованииrecursive functions которые хранят частичные данные в стеке и снова вызывают себя.

общее использование стека для,

Return address return value parameters to called function local variables in the called function processor registers that will be reused in the called function

И, да, стек также используется дляexploits.
Его природа переноса адреса возврата туда, куда вызванная функция возвращается, в сочетании со слабостью проверок границ массива вC язык, дает очень хороший способ вызватьпереполнение буфера в стеке уязвимой (небезопасно написанной) программы.

2

В первые дни вычислений вызовы подпрограмм обрабатывались с помощью памяти RAM в каждой подпрограмме, чтобы указать, откуда она была вызвана. Чтобы вызвать подпрограмму, нужно сделать что-то вроде:

  load foo_return with #LABEL_123
  goto foo
#LABEL_123:
  ...code to execute after return from foo


foo:
  ... do stuff
  goto foo_return

Этот шаблон может быть оптимизирован, если вызывающий объект поместит адрес возврата в регистр, а подпрограмма сохранит его в «return». место на входе. Этот шаблон работал, но у него было несколько проблем. Мало того, что он обычно тратит память - у него также не было средств для работы с рекурсивным или реентерабельным кодом. Добавление стека позволило упростить код, сказав, что вызывающая сторона просто скажет «сохранить адрес возврата в подходящем месте», не мешая каким-либо более ранним адресам, а вызываемая функция просто скажет «вернуться к самой последней вызывающей стороне, которая не имела». ; т был возвращен еще ". Это позволило разработать реентерабельный код и означало, что необходимо было хранить только достаточное количество адресов возврата для обработки самой глубокой вложенной цепочки вызовов функций, которая когда-либо могла бы произойти.

Если древние технологии актуальны, то сначала вы должны описать, что такое счеты и как они работают.
Вероятно, я бы не сказал ничего, если бы не слово «древний». Это субъективно с негативными коннотациями. Технология, которую вы описываете, является чрезвычайно базовой и существовала бы только в процессорах, которые были всего лишь калькулятором.
Мы вступаем в дискуссию, и Stackoverflow не предназначен для этого. Я думаю, что мы должны согласиться не согласиться. Я думаю, что это "древний" является субъективным и Stackoverflow не предназначен для субъективного обсуждения. Поэтому отвечайте, как хотите, но не предполагайте, что я согласен с ним, если не отвечу.
@ user34660: Технология, которую я описываю, насколько я понимаю, работала с ранними компиляторами FORTRAN. Я бы не охарактеризовал их как «всего лишь калькулятор». Хотя использование команд вызова подпрограммы часто более эффективно, чем попытка настроить вектор возврата вручную, последний подход все еще может работать достаточно хорошо для языков, которые не поддерживают рекурсию.
@ user34660: Цель стека состояла в том, чтобы улучшить существующую технологию, которая на самом деле задействовала компьютеры. Машины, которые хранят адреса возврата без использования стека или ожидания того, что программисты будут делать то же самое, долгое время не были распространены, но понимание того, как они работают, имеет отношение к пониманию того, для чего предназначен стек.
1

Это зависит от микропроцессора. Обычно его роль заключается в сохранении локальных переменных и функций & apos; параметры.

И на самом деле он не в микропроцессоре, а в центральной памяти.

Он не сказал, что стек находится в микропроцессоре.
Стек может иметьrole в микропроцессоре безbeing в микропроцессоре. Например, a7 является указателем стека в 68000, так что вы, конечно, можете сказать, что стек играет роль в микропроцессоре без физической памяти стека в микропроцессоре.
Ну, он сказал «стек в микропроцессоре» поэтому я полагаю, что это полезное разъяснение.
-5

На самом деле стек не является терминологией для процессора, он используется для рутинного вызова языка. Подпрограмма может использовать стек для получения параметров и сохранения локальных переменных, а также вызывать другие подпрограммы.

@arsane: Когда я смотрю на MIPS, я вижу стек, стек, стек.en.wikibooks.org/wiki/MIPS_Assembly/Subroutines
Не терминология для процессора? Инструкция по сборке PUSH / POP кто-нибудь? :П
@Nosredna, это вид программирования, конечно, вы можете использовать сборку для реализации стека, но это не значит, что стек предназначен для процессора. Стек предназначен для обычного вызова языка. Сам процессор просто берет на себя ответственность за переход / ветвь / освобождение / загрузку / сохранение.
@Thorarin, процессор Cisc, такой как Intel, предоставляет инструкцию сборки push / pop для явной поддержки работы стека, также имеет sp-регистр; но другой процессор риска, такой как MIPS, не предоставляет команду push / pop для операции стека, регистр sp не указан. Хотя все они могут быть использованы для реализации стека, но я действительно думаю, что стек - это концепция языка, как c, как java. Вы можете написать сборку для процессора без необходимости использования stck.

Похожие вопросы