![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 20.12.2011
Сообщений: 4
|
![]()
В общем то как функционирует стек мне ясно,непонятна вся его физическая часть.Как он работает с ячейками памяти,если есть несколько вложенных процедур?Ну допустим есть 3 процедуры,1-я вызывает 2-ю,в свою очередь вторая вызывает 3-ю,но как я понял стек должен вернуться в исходное состояние,только вот каким образом?Если используются 2 процедуры,то понятно что можно сохранить ячейку выхода во "флаге",и когда вторая процедура выполниться,стек вернется на ту позицию первой процедуры,где было завершение и продолжит выполняться первая.Но как быть с 3-мя и более вложенными процедурами,ведь флажок каждый раз будет "затираться".В общем,пожалуйста "разжуйте" по-подробнее,если можно на примере с ячейками.
Заранее спасибо. |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
эта забота лежит исключительно на программисте. А если про CALL / RET то всё просто - любой вызов подпрограммы помещает адрес следущей после call команды в стек. При этом регистр - указатель стека SP сдигается. процедура RET вытягивает точку возврата, указатель стека возвращается в состояние, в каком он был до call, управление передаётся по адресу, извлечённому из стека.. p.s. напишите простеньку программку на ассеблере и пройдитесь пошагово в отладчике, внимательно следя за указателем и содержимым стека. Вы всё поймёте.. |
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 20.12.2011
Сообщений: 4
|
![]()
Ага,то есть...
call адрес процедуры ......[точка возврата] ...... ;следующие команды ...... Процедура ...... ...... ret ;Возвращает к следующим коммандам Я вас правильно понял? |
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Don7
нет не правильно, и чтобы не гадать на кофейной гуще -- найди в сети книжку В.Н. Пильщиков "Assembler. Программирование на языке ассемблера IBM PC" и прочитай ее |
![]() |
![]() |
![]() |
#5 |
Регистрация: 20.12.2011
Сообщений: 4
|
![]()
Спасибо вам за помощь,кажется это то,что нужно.До этого читал Крупника,вроде у Пильщикова картина яснее.
|
![]() |
![]() |
![]() |
#6 |
Регистрация: 20.12.2011
Сообщений: 4
|
![]()
Еще раз перечитал.Вот что по этому поводу пишет Крупник.
"...Команда call помещает адрес следующей инструкции в стек,а затем переводит процессор к адресу первой инструкции процедуры.Инструкции,составляющие процедуру выполняются до тех пор,пока не встретиться инструкция ret,которая достает из стека адрес возврата,предъявляя его процессору и тот как ни в чем не бывало начинает выполнять инструкции с этого адреса." Тогда почему я не прав?В приведенной схеме я это и имел ввиду. |
![]() |
![]() |
![]() |
#7 | |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Don7
Потому что это разные области памяти, одна адресуется через CS:IP (область команд), другая через SS:SP (область стека) грубо картинка такая Код:
Цитата:
Последний раз редактировалось Mikl___; 22.12.2011 в 12:22. |
|
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
просто Вас, видимо, не точно поняли. в схеме Вы выделили "......[точка возврата]" а фактически - это же просто адрес следующей команды (у вас на схеме: ";следующие команды" ну, я считаю, что Вы разобрались, поэтому тему можно считать закрытой. ДОБАВЛЕНО Mikl___, приношу свои изменения, когда я писал свой комментарий, я Ваш пост не видел. Прошу моё сообщение не рассценивать, как комментарий к вашему ответу. Последний раз редактировалось Serge_Bliznykov; 22.12.2011 в 11:27. |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Использование имени процедуры в качестве параметра другой процедуры | Alexey355 | Помощь студентам | 1 | 23.04.2011 13:59 |
Стек на С | oleg081 | Помощь студентам | 3 | 23.02.2011 16:18 |
закончить выполнение процедуры из тела другой процедуры | Alaysor | Общие вопросы Delphi | 14 | 23.01.2011 05:26 |
Управляющие структуры, процедуры Function и процедуры Sub | Natalo4ka | Помощь студентам | 0 | 17.05.2010 22:00 |
Запуск процедуры из процедуры с дополнением | 1sal1 | Общие вопросы Delphi | 3 | 06.10.2008 21:54 |