30.3.2.1. СТЕК



Бывают архитектуры, где stack pointer аппаратно фиксирован,
например для x86 - есть масса комманд которые используют только SP.
Например:
	CALL
	PUSH
	INT

A есть архитектуры без явного выделения stack pointer, там регистр который
используется в качестве SP, определяется ABI.

Могут быть вообще ситуации когда для передач управления один стек, а для 
данных другой.

В принципе стек может расти как вверх (к старшим адрессам) так и вниз 
(к младшим адрессам)


Stack
	FILO (First In-Last Out)
	LIFO (Last  In-First Out)


	|         |
	|---------|	как магазин в автомате (из которого стреляют)
	|---------|
	|---------|
	+---------+


Операции со стеком:

        +---------+
	|         |	поместить в стек
	+---------+
             |
	|    V	  |
	|---------|
	|---------|
	|---------|
	+---------+


        +---------+
	|         |	выбрать из стека
	+---------+
             ^
	|    |	  |
	|---------|
	|---------|
	|---------|
	+---------+

Как реально это происходит:


	+---------+
	|	  |
	|	  |
	|         |
	+---------+ <--- SP  (Stack pointer)
	|	  |
	|	  |
	+---------+

Помещение в stack:
		Записать по адрессу [SP] данные
		Отнять/Прибавить SP на XX (размер данных)

Выборка из stacka:
		Прибавить/Отнять SP на XX (размер данных)
		Прочитать данные по адрессу [SP]


	+---------+
	|	  |
	|	  |
	+---------+ <--- previous SP
	| element |
	+---------+ <--- new SP
	|	  |
	+---------+




Примеры как используется стек: Прерывание:

Вызов подпрограммы:

Вызов подпрограммы с передачей параметров:

Выделение локальных переменных в стеке:


Использование стека в стековых архитектурах

Операции: +---------+ +---------+ | A | | A + B | +---------+ + +---------+ | B | (OP) | C | +---------+ +---------+ | C | | | +---------+ | | Типичный пример JVM (Java Virtual Machine), и соответсвенно picoJava процессор. iadd 60 ladd 61 fadd 62 dadd 63 isub 64 ... imul 68 ... idiv 6c irem 70 ineg 74 ishl 78 ishr 7A iushr 7C iand 7E ior 80 ixor 82 DUP | A | | A | | B | | A | | C | => | B | |xxx| | C | |xxx| OVER | A | | B | | B | | A | | C | => | B | |xxx| | C | |xxx| a * (a + b) stack: | b | | a | OVER + * ROT | A | | C | | B | => | B | | C | | A | |xxx| |xxx| SWAP | A | | B | | B | => | A | | C | | C | |xxx| |xxx| DROP | A | | B | | B | | C | | C | => |xxx| |xxx| 2SWAP SWAP но пар A.1 B.1 A.2 B.2 B.1 A.1 B.2 A.2 2DUP 2OVER 2DROP

Index Prev Next