Подтвердить что ты не робот

Что такое указатель стека, используемый в микропроцессорах?

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

4b9b3361

Ответ 1

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

Это включает, но не ограничивается:

  • обратный адрес.
  • место для возвращаемого значения.
  • переданы параметры.
  • локальные переменные.

Вы нажимаете элементы на стек и выталкиваете их. В микропроцессоре стек может использоваться как для пользовательских данных (таких как локальные переменные и переданные параметры), так и для данных ЦП (таких как обратные адреса при вызове подпрограмм).

Фактическая реализация стека зависит от архитектуры микропроцессора. Он может расти вверх или вниз в памяти и может перемещаться до или после операций push/pop.

Операция, которая обычно влияет на стек:

  • вызовы и возвраты подпрограмм.
  • прерывать вызовы и возвращает.
  • явно выталкивает и записывает записи.
  • Прямая обработка регистра SP.

Рассмотрим на моей (вымышленной) ассемблере следующую программу:

Addr  Opcodes   Instructions    ; Comments
----  --------  --------------  ----------
                                ; 1: pc<-0000, sp<-8000
0000  01 00 07  load r0,7       ; 2: pc<-0003, r0<-7
0003  02 00     push r0         ; 3: pc<-0005, sp<-7ffe, (sp:7ffe)<-0007
0005  03 00 00  call 000b       ; 4: pc<-000b, sp<-7ffc, (sp:7ffc)<-0008
0008  04 00     pop r0          ; 7: pc<-000a, r0<-(sp:7ffe[0007]), sp<-8000
000a  05        halt            ; 8: pc<-000a
000b  06 01 02  load r1,[sp+2]  ; 5: pc<-000e, r1<-(sp+2:7ffe[0007])
000e  07        ret             ; 6: pc<-(sp:7ffc[0008]), sp<-7ffe

Теперь позвольте выполнить выполнение, описывая шаги, указанные в комментариях выше:

  • Это начальное условие, в котором счетчик программ равен нулю, а указатель стека - 8000 (все эти числа шестнадцатеричные).
  • Это просто загружает регистр r0 с непосредственным значением 7 и переходит к следующему шагу (я предполагаю, что вы понимаете, что поведение по умолчанию будет состоять в том, чтобы перейти к следующему шагу, если не указано иное).
  • Это подталкивает r0 в стек, уменьшая указатель стека на два, затем сохраняя значение регистра в этом месте.
  • Это вызывает подпрограмму. То, что было бы счетчиком программы, подталкивается к стеку аналогично r0 на предыдущем шаге, а затем счетчик программ устанавливается на его новое значение. Это ничем не отличается от нажатия на уровне пользователя, отличного от того, что он сделал больше как вещь на системном уровне.
  • Это загружает r1 из ячейки памяти, вычисленной из указателя стека, - это показывает способ передачи параметров в функции.
  • Оператор return извлекает значение, из которого указывает указатель стека, и загружает его в счетчик программ, одновременно настраивая указатель стека. Это похоже на системный уровень (см. Следующий шаг).
  • Попадание r0 из стека включает извлечение значения, из которого указывает указатель стека, затем корректировка указателя стека вверх.
  • Команда Halt просто оставляет счетчик программ, где он есть, бесконечный цикл.

Надеюсь, из этого описания станет ясно. Нижняя строка: стек полезен для хранения состояния по методу LIFO, и это, как правило, идеально подходит для того, как большинство микропроцессоров выполняют вызовы подпрограмм.

Если вы, конечно, SPARC, в этом случае вы используете круговой буфер для своего стека: -)

Обновление. Чтобы прояснить шаги, предпринятые при нажатии и повторении значений в приведенном выше примере (явно или по вызову/возврату), см. следующие примеры:

LOAD R0,7
PUSH R0
                     Adjust sp       Store val
sp-> +--------+      +--------+      +--------+
     |  xxxx  |  sp->|  xxxx  |  sp->|  0007  |
     |        |      |        |      |        |
     |        |      |        |      |        |
     |        |      |        |      |        |
     +--------+      +--------+      +--------+

POP R0
                     Get value       Adjust sp
     +--------+      +--------+  sp->+--------+
sp-> |  0007  |  sp->|  0007  |      |  0007  |
     |        |      |        |      |        |
     |        |      |        |      |        |
     |        |      |        |      |        |
     +--------+      +--------+      +--------+

Ответ 2

Указатель стека хранит адрес самой последней записи, которая была помещена в стек.

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

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

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

http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks

Ответ 3

У тебя больше подготовки к экзамену ;-)

Указатель стека - это регистр, который содержит адрес следующего доступного места в стеке.

Стек - это область в памяти, которая зарезервирована для хранения стека, то есть контейнер типа LIFO (Last In First Out), где мы храним локальные переменные и адрес возврата, что позволяет легко управлять вложением вызовов функций в типичная программа.

См. эту статью в Википедии, где приведено базовое объяснение управления стеком.

Ответ 4

Для 8085: указатель стека - это 16-разрядный регистр специального назначения в микропроцессоре, который содержит адрес вершины стека.

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

Прочтите это для получения дополнительной информации.

Использование указателя указателя стека общего назначения

Ответ 5

Stack - это область памяти для хранения временных данных. Stack используется инструкцией CALL для сохранения обратного адреса для процедур. Команда возврата RET получает это значение из стека и возвращается к этому смещению. То же самое происходит, когда команда INT вызывает прерывание. Он хранит в стеке регистр флагов, сегмент кода и смещение. Команда IRET используется для возврата из вызова прерывания.

Stack - это память Last In First Out (LIFO). Данные помещаются в стек с инструкцией PUSH и удаляются с помощью инструкции POP. Память стека поддерживается двумя регистрами: указателем стека (SP) и регистром сегмента стека (SS). Когда слово данных помещается в стек, 8-разрядный байт высокого порядка помещается в местоположение SP-1, а младший 8-разрядный байт помещается в местоположение SP-2. Затем SP уменьшается на 2. SP добавляет к регистру (SS x 10H), чтобы сформировать адрес физической памяти стека. Обратная последовательность возникает, когда данные POPPED из Stack. Когда слово данных ПОПУЛЯЕТ из стека, 8-разрядный байт высокого порядка получается в местоположении SP-1, а младший 8-разрядный байт получается в местоположении SP-2. Затем SP увеличивается на 2.

Ответ 6

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

Ответ 7

Если вам когда-нибудь понадобится более глубокое понимание, я от всей души рекомендую Паттерсона и Хеннесси в качестве вступления, а Хеннесси и Паттерсона - в качестве промежуточного и продвинутого текста. Они дорогие, но на самом деле не pareil; Я просто хотел бы, чтобы один или оба были доступны, когда я получил степень магистра и поступил на работу в персонал по разработке микросхем, систем и частей системного программного обеспечения для них (но, увы!, Это было СЛИШКОМ слишком давно ;-). Указатели стеков настолько важны (и различие между микропроцессором и любым другим типом ЦП, настолько значимым в этом контексте... или, в этом отношении, в ЛЮБОМ другом контексте, в последние несколько десятилетий...! -), что Я сомневаюсь во всем, но пара глубоких переподготовок может помочь! -)

Ответ 8

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

В то время как аппаратный стек имеет некоторые преимущества (например, push и pop не добавляют времени на вызов/возврат), имея регистры, которые могут быть загружены двумя источниками, добавляет стоимость. Если стек становится очень большим, дешевле будет заменить толкающие регистры на адресную память. Даже если для этого используется небольшая выделенная память, дешевле иметь 32 адресуемых регистра и 5-битовый регистр указателей с логикой увеличения/уменьшения, чем он должен иметь 32 регистра с двумя входами. Если для приложения может потребоваться больше стека, чем было бы легко вписываться в CPU, можно использовать указатель стека вместе с логикой для хранения/получения данных стека из основной ОЗУ.

Ответ 9

Указатель стека представляет собой небольшой регистр, в котором хранится адрес вершины стека. Он используется для указания адреса вершины стека.