Для чего используется указатель вершины стека в микропроцессорах?

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

кроме того, шаблоны могут расшириться из других шаблонов . Это позволяет Вам иметь основной шаблон, чтобы настроить расположение страницы и совместно использовать это между другими шаблонами, которые восполняют пробелы. Можно вложить шаблоны на любую глубину; разрешение Вам определить расположение на отдельных группах связанных страниц в одном месте.

48
задан Mangu Singh Rajpurohit 25 May 2016 в 04:00
поделиться

6 ответов

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

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

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

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

6
ответ дан 26 November 2019 в 18:36
поделиться

Стек представляет собой структуру данных 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

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

  1. Это начальное условие, при котором счетчик программы равен нулю, а стек указатель равен 8000 (все эти числа шестнадцатеричные).
  2. Это просто загружает регистр r0 с непосредственным значением 7 и переходит к следующему шагу (я предполагаю, что вы понимаете, что поведение по умолчанию будет переходить к следующему шагу, если иначе указано).
  3. Это помещает r0 в стек, уменьшая указатель стека на два, а затем сохраняя значение регистра в этом месте.
  4. Это вызывает подпрограмму. То, что было бы , программный счетчик помещается в стек аналогично r0 на предыдущем шаге, а затем программный счетчик устанавливается на новое значение. Это не отличается от push на уровне пользователя, за исключением того, что это делается больше как вещь на уровне системы.
  5. Это загружает r1 из области памяти, вычисленной из указателя стека - это показывает способ передачи параметров функциям.
  6. Оператор return извлекает значение, из которого указывает указатель стека, и загружает его в счетчик программы, одновременно увеличивая указатель стека. Это похоже на всплывающее сообщение на системном уровне (см. Следующий шаг).
  7. Извлечение r0 из стека включает извлечение значения, из которого указывает указатель стека, и последующее изменение этого указателя стека.
  8. Команда 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  |
     |        |      |        |      |        |
     |        |      |        |      |        |
     |        |      |        |      |        |
     +--------+      +--------+      +--------+
91
ответ дан 26 November 2019 в 18:36
поделиться

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

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

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

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

3
ответ дан 26 November 2019 в 18:36
поделиться

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

1
ответ дан 26 November 2019 в 18:36
поделиться

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

1
ответ дан 26 November 2019 в 18:36
поделиться

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

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

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

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

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

11
ответ дан 26 November 2019 в 18:36
поделиться
Другие вопросы по тегам:

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