Страница: 1 | 2 |
Вопрос: стек
Добавлено: 19.12.06 20:43
Автор вопроса: ZoomerSD | ICQ: 148640473
Добрый всем вечер.
В одной статье натолкнулся на понятие стек памяти. В принципе я знаю что стек есть область памяти отпределённного размера. Но можно ли как-нибудь поподробнее? какой памяти, оперативной, или Жёсткого диска? принципы записи, адресация и т.д.?
Ответы
Всего ответов: 30
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 19.12.06 20:59
Стек - первый пришел, последний ушел.
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 19.12.06 20:59
первый пришел - последний ушел
push
pop
соответственно...
Задумываться над адресацией в басике чаще всего не приходится...
Память ессно оперативная, если её нехватает ессно будет своп на жесткий диск, но это уже не твоя забота, а ос.
Номер ответа: 3
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #3
Добавлено: 19.12.06 21:24
Лучше всего об этом расскажет любая книжка по ассемблеру, здесь тебе внятных ответов никто не даст, пробелы останутся с любом случае.
Номер ответа: 4
Автор ответа:
ENIX
ICQ: 238819245
Вопросов: 9
Ответов: 76
Профиль | | #4
Добавлено: 19.12.06 23:02
Добавлю что стэк применяется для хранения промежуточных данных, адресов подпрограм (векторов), значегий флаговых регистров (перед входом в подпрограмму).
pop
push только для семейсва Intel. К примеру в Моторолах командой PEA...
Номер ответа: 5
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #5
Добавлено: 19.12.06 23:39
Не обязательно. Понятия стека применительно ко многим областям, и не только программирование.
Самый наглядный пример - обойма пистолета, - это стек.
патроны укладываются один за одним, и также извлекаются.
Правило как уже сказали - первый пришел, последний ушел.
Т.е. первый заряжаемый патрон в обойму, выйдет из обоймы последним.
Если вы поняли предыдущее, то соответсвенно данную модель можно применить к чему угодно. Если разговор идет о программировании, то как правило с понятием стек подразумевается оперативная память. У любого процессора есть регистр стека, указывающий на верхушку стека.
Здесь немного надо понять смысл, в литературе очень много сбивчивых понятий на эту тему. Представим себе вертикальный столбик разделенный на ячейки. Самую нижнюю ячейку назовем начальной = 0 а самую последнюю к примеру 1000.
Микропроцессор выполняя команды в оперативной памяти всегда идет от более младшей ячейки к более старшей.
Также считываются данные от младшей ячейки к более старшей.
Со стеком все наоборот, первые команды микропроцессора закладывают адресс стека в последние ячейки(к примеру 900), и при сохранении данных в стек, указатель этого регистра указывает на более младшую ячейку. Т.е. стек растет навстречу к младшим ячейкам.
Почему это так сделанно и для чего.
Основное предназначение стека - хранить адреса возврата из подпрограм. предположим вы вызываете рекурсивно 5 подпрограм.
Также как и в обойму пистолета , в стеке по очереди сохранятся адреса возврата в то место откуда была вызвана подпрограмма. Т.е. вы вызвали первую подпрограму, она в свою очередь вызывает следующую и т.к. далее. Возврат на место происходит путем извлечения из стека адресов возврата и передачей этих адресов процессору как стартовую точку для исполнения следующей команды.
Как вы видите с помощью стека, очень легко организовывается система возврата в исходное место.
Еще одно применение стека - вам надо обменять местами две переменные. Для того чтобы это сделать математически вам нужна еще одна переменная где вы времено будете хранить данные. С помощью стека это делается гораздо просче, вы ложите в стек переменную А потом Б а извлекаете наоборот, сперва А а потом Б. данные обменены.
На в самом деле применение стека этим не ограничивается.
Через стек в виндовс передаются параметры для АПИ функций. Т.е вызывающая АПИ программа складывает в стек параметры, а вызваная процедура считывает данные.
Здесь возникает вопрос - а как же тогда адрес возврата?
Все правильно адрес возврата запишется последним.
Вызваная АПИ , знает сколько параметров ее напихали в стек, и командами паралельного(т.е. обратится к стеку не как к стеку а как к обычным ячейкам памяти, зная что макушка стека указывает на адрес возврата, АПИ как бы перепрыгнет через это значение и считает параметры.) обращения к стеку извлекёт параметры. Таким образом указатель на стек не изменяется, и в то же время есть механизм передачи параметров. когда АПИ закончит свою работу она выполняет команду возврата, но не простую, а с учетом количества полученых параметров в стеке, т.е. как бы вычищает за собой стек. Это метод работы со стеком был взят от компиляторов паскаля, и в данный момент называется методом стандартного вызова процедур.
Компиляторы С работают со стеком немного по другому.
передаваемые параметры для подпрограммы на стеке очищаются не подпрограмой а вызвавшей подпрограму функцией. Т.е. подпрограма должна только вызвать команду возврата, а вызвавший код сам обязан подчистиь стек в зависимости от количества переданных параметров.
Этот метод в чем то более гибкий, так как вызываемая подпрограма может получать от 1-го до Х параметров в зависимости от необходимости.
Помните столбик ?
Указатель стека = 900
записываем 4 байта в стек
Указатель стека = 900-4 =896
Извлекаем из стека байты и указатель на стек опять =900
Честно говоря очень плохо знаю ВБ, но точно знаю,
что честными способами вы к стеку не обратитесь, хотя вообщем то есть нестандартные способы использовать хитрости и особенности стека.
Номер ответа: 6
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #6
Добавлено: 20.12.06 13:49
ЗАЧОТ!!!!!!!!
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 20.12.06 20:09
на самом деле... достойный ответ!! автору респект!
И прошу заметить... совершенно бесплатно!!! Никаких речей о 20 WMZ! )
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 21.12.06 00:14
ссылку на ресурс! ))))))))
Номер ответа: 9
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #9
Добавлено: 21.12.06 02:44
Мои бесплатные, большего объема и более качественного содержания, как технически, так и стилистически, посты в теме "Эээээ" уже в счет не идут?
Номер ответа: 10
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #10
Добавлено: 21.12.06 02:55
низачот, про переполнение стека не написано.
Номер ответа: 11
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #11
Добавлено: 21.12.06 02:58
Да что твои, похоже что даже мои в счет не идут, а уж мои-то должны были бы - прогнозы, аналитика... Причем по очень актуальным темам...
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 21.12.06 09:04
Ну почему же не идут? На том свете все зачтется.. ))
А если серьезно, то на самом деле порадовал тот факт, что JMP не поленился и дал достаточно полный и исчерпывающий ответ(если конечно не передрал инфу с другого источника).. А не отписку типа: Ф ПОИСК!!! И вы не станете отрицать тот факт, что подобные ответы на нашем сайте стали достаточно большой редкостью, что ,само-собой, не добавляет ему посещаемости... (
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 21.12.06 09:35
Ну не надо так завидывать коллегам что ты не застал эээээ и не успел себе заработать пару сотен сообщений!
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 21.12.06 09:36
Если ты не заметил, то в последнее время на форуме от некоторых участниках (не будем показывать пальцами) начали даже появляться вопросы, содержащие уже в себе достаточно полные и исчерпывающие ответы!
Номер ответа: 15
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #15
Добавлено: 21.12.06 10:17
Как я мог этого не заметить??? Разумеется заметил! И более того, благодарен тем людям (опять же не будем показывать пальцем ))), которые не жалея сил и времени пишут подобные вопросы и ответы, потому как достаточно часто в них встречается очень и очень полезная информация..
З.Ы. А что это за тема: "Эээээ"? Что на самом деле я пропустил(кроме пары сотен баллов)? )))