Бывают архитектуры, где 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