Если Вы хотите совместно использовать общую функциональность между страницами, я предлагаю, чтобы Вы посмотрели на пользовательские теги. Они вполне легки создать и очень мощны.
кроме того, шаблоны могут расшириться из других шаблонов . Это позволяет Вам иметь основной шаблон, чтобы настроить расположение страницы и совместно использовать это между другими шаблонами, которые восполняют пробелы. Можно вложить шаблоны на любую глубину; разрешение Вам определить расположение на отдельных группах связанных страниц в одном месте.
Указатель стека хранит адрес самой последней записи, которая была помещена в стек.
Чтобы поместить значение в стек, стек указатель увеличивается, чтобы указывать на следующий адрес физической памяти, и новое значение копируется по этому адресу в памяти.
Чтобы извлечь значение из стека, значение копируется из адреса указателя стека, и из стека указатель декрементируется, указывая на следующий доступный элемент в стеке.
Наиболее типичным использованием аппаратного стека является сохранение адреса возврата вызова подпрограммы. Когда подпрограмма завершит выполнение,
Стек представляет собой структуру данных LIFO (последний вошел, первый вышел - последняя запись, которую вы вставляете в стек, является первой, которую вы возвращаете, когда вы открываете) структура данных, которая обычно используется для хранения кадров стека (биты стек, принадлежащий текущей функции).
Это включает, но не ограничивается:
Вы помещаете элементы в стек и выталкиваете их. В микропроцессоре стек может использоваться как для пользовательских данных (таких как локальные переменные и переданные параметры) , так и для данных ЦП (например, адресов возврата при вызове подпрограмм).
Фактическая реализация стека зависит от архитектуры микропроцессора. Он может увеличиваться или уменьшаться в памяти и может перемещаться либо до, либо после операций push / pop.
Операции, которые обычно влияют на стек, следующие:
Рассмотрим следующую программу на моем (вымышленном) языке ассемблера:
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
Теперь давайте проследим за выполнением, описывая шаги, показанные в комментариях выше:
Надеюсь, из этого описания станет ясно. Итог: стек полезен для хранения состояния в формате 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 |
| | | | | |
| | | | | |
| | | | | |
+--------+ +--------+ +--------+
Для 8085: Указатель стека - это 16-разрядный регистр специального назначения в микропроцессоре, который содержит адрес вершины стека.
Регистр указателя стека в компьютере становится доступным для общего использования программами, выполняющимися с более низкими уровнями привилегий, чем обработчики прерываний. Набор инструкций в таких программах, за исключением операций со стеком, хранит данные, отличные от указателя стека, такие как операнды и т.п. в регистре указателя стека. При переключении выполнения на обработчик прерывания по прерыванию данные адреса возврата для выполняющейся в данный момент программы помещаются в стек на уровне привилегий обработчика прерывания. Таким образом, сохранение других данных в регистре указателя стека не приводит к повреждению стека. Кроме того, эти инструкции могут сохранять данные в временной части сегмента стека за пределами текущего указателя стека.
Прочтите этот для получения дополнительной информации.
Указатель стека содержит адрес вершины стека. Стек позволяет функциям передавать друг другу аргументы, хранящиеся в стеке, и создавать переменные с областью действия . Область действия в этом контексте означает, что переменная извлекается из стека, когда фрейм стека уходит, и / или когда функция возвращается. Без стека вам нужно было бы использовать явные адреса памяти для всего. Это сделало бы невозможным (или, по крайней мере, очень сложным) разработку языков программирования высокого уровня для архитектуры. Кроме того, каждый режим ЦП обычно имеет свой собственный указатель стека в банке. Поэтому, когда возникают исключения (например, прерывания), процедура обработки исключений может использовать свой собственный стек, не повреждая пользовательский процесс.
Если вам когда-нибудь понадобится более глубокое понимание, я искренне рекомендую Паттерсон и Хеннесси в качестве вступления и Хеннесси и Паттерсон в качестве текста от среднего до продвинутого. Они дорогие, но по-настоящему неуместны; Я просто хотел бы, чтобы один или оба были доступны, когда я получил степень магистра и поступил на работу, разрабатывая для них микросхемы, системы и части системного программного обеспечения (но, увы, это было слишком давно ;-). Указатели стека настолько важны (и различие между микропроцессором и любым другим типом ЦП так важно в этом контексте ... или, если на то пошло, в ЛЮБОМ другом контексте, в последние несколько десятилетий.
Указатель стека хранит адрес самой последней записи, которая была помещена в стек.
Чтобы поместить значение в стек, указатель стека увеличивается, чтобы указать на следующий физический адрес памяти, и новое значение копируется по этому адресу в памяти.
Чтобы извлечь значение из стека, значение копируется из адреса указателя стека, и указатель стека уменьшается на единицу, указывая на следующее доступный элемент в стеке.
Наиболее типичным использованием аппаратного стека является хранение адреса возврата вызова подпрограммы. Когда подпрограмма завершает выполнение, адрес возврата извлекается из верхней части стека и помещается в регистр программного счетчика, заставляя процессор возобновить выполнение со следующей инструкции, следующей за вызовом подпрограммы.
http: // en.wikipedia. org / wiki / Stack_% 28data_structure% 29 # Hardware_stacks